mm_camera.c revision 2641bd474536c433421ca8f51bfe4e76d239e44a
1a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. 2a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 3a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * Redistribution and use in source and binary forms, with or without 4a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * modification, are permitted provided that the following conditions are 5a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * met: 6a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * * Redistributions of source code must retain the above copyright 7a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * notice, this list of conditions and the following disclaimer. 8a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * * Redistributions in binary form must reproduce the above 9a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * copyright notice, this list of conditions and the following 10a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * disclaimer in the documentation and/or other materials provided 11a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * with the distribution. 12a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * * Neither the name of The Linux Foundation nor the names of its 13a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * contributors may be used to endorse or promote products derived 14a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * from this software without specific prior written permission. 15a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 16a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 28a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam */ 29a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 30a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include <pthread.h> 31a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include <errno.h> 32a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include <sys/ioctl.h> 33a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include <sys/types.h> 34a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include <sys/stat.h> 35a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include <fcntl.h> 36a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include <poll.h> 37a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include <cutils/properties.h> 38a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include <stdlib.h> 39a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 40a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include <cam_semaphore.h> 41a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 42a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include "mm_camera_dbg.h" 43a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include "mm_camera_sock.h" 44a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include "mm_camera_interface.h" 45a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#include "mm_camera.h" 462641bd474536c433421ca8f51bfe4e76d239e44aShuzhen Wang#include "cam_cond.h" 47a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 48a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#define SET_PARM_BIT32(parm, parm_arr) \ 49a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (parm_arr[parm/32] |= (1<<(parm%32))) 50a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 51a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#define GET_PARM_BIT32(parm, parm_arr) \ 52a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ((parm_arr[parm/32]>>(parm%32))& 0x1) 53a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 54a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#define WAIT_TIMEOUT 3 55a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 56a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/* internal function declare */ 57a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_evt_sub(mm_camera_obj_t * my_obj, 58a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint8_t reg_flag); 59a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_enqueue_evt(mm_camera_obj_t *my_obj, 60a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_event_t *event); 61a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 62a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 63a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_util_get_channel_by_handler 64a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 65a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: utility function to get a channel object from its handle 66a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 67a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 68a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @cam_obj: ptr to a camera object 69a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @handler: channel handle 70a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 71a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : ptr to a channel object. 72a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NULL if failed. 73a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 74a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tammm_channel_t * mm_camera_util_get_channel_by_handler( 75a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_obj_t * cam_obj, 76a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t handler) 77a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 78a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int i; 79a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t *ch_obj = NULL; 80a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam for(i = 0; i < MM_CAMERA_CHANNEL_MAX; i++) { 81a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (handler == cam_obj->ch[i].my_hdl) { 82a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ch_obj = &cam_obj->ch[i]; 83a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 84a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 85a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 86a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return ch_obj; 87a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 88a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 89a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 90a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_util_chip_is_a_family 91a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 92a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: utility function to check if the host is A family chip 93a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 94a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 95a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 96a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : TRUE if A family. 97a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FALSE otherwise. 98a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 99a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamuint8_t mm_camera_util_chip_is_a_family(void) 100a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 101a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#ifdef USE_A_FAMILY 102a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return TRUE; 103a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#else 104a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return FALSE; 105a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam#endif 106a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 107a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 108a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 109a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_dispatch_app_event 110a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 111a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: dispatch event to apps who regitster for event notify 112a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 113a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 114a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @cmd_cb: ptr to a struct storing event info 115a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @user_data: user data ptr (camera object) 116a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 117a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : none 118a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 119a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamstatic void mm_camera_dispatch_app_event(mm_camera_cmdcb_t *cmd_cb, 120a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam void* user_data) 121a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 122a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_cmd_thread_name("mm_cam_event"); 123a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int i; 124a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_event_t *event = &cmd_cb->u.evt; 125a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_obj_t * my_obj = (mm_camera_obj_t *)user_data; 126a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != my_obj) { 127a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&my_obj->cb_lock); 128a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam for(i = 0; i < MM_CAMERA_EVT_ENTRY_MAX; i++) { 129a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if(my_obj->evt.evt[i].evt_cb) { 130a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->evt.evt[i].evt_cb( 131a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->my_hdl, 132a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam event, 133a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->evt.evt[i].user_data); 134a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 135a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 136a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cb_lock); 137a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 138a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 139a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 140a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 141a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_event_notify 142a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 143a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: callback to handle event notify from kernel. This call will 144a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * dequeue event from kernel. 145a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 146a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 147a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @user_data: user data ptr (camera object) 148a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 149a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : none 150a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 151a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamstatic void mm_camera_event_notify(void* user_data) 152a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 153a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam struct v4l2_event ev; 154a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam struct msm_v4l2_event_data *msm_evt = NULL; 155a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int rc; 156a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_event_t evt; 157a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&evt, 0, sizeof(mm_camera_event_t)); 158a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 159a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_obj_t *my_obj = (mm_camera_obj_t*)user_data; 160a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != my_obj) { 161a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* read evt */ 162a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&ev, 0, sizeof(ev)); 163a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = ioctl(my_obj->ctrl_fd, VIDIOC_DQEVENT, &ev); 164a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 165a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (rc >= 0 && ev.id == MSM_CAMERA_MSM_NOTIFY) { 166a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam msm_evt = (struct msm_v4l2_event_data *)ev.u.data; 167a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam switch (msm_evt->command) { 168a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam case CAM_EVENT_TYPE_DAEMON_PULL_REQ: 169a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt.server_event_type = CAM_EVENT_TYPE_DAEMON_PULL_REQ; 170a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_enqueue_evt(my_obj, &evt); 171a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 172a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam case CAM_EVENT_TYPE_MAP_UNMAP_DONE: 173a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&my_obj->evt_lock); 174a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->evt_rcvd.server_event_type = msm_evt->command; 175a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->evt_rcvd.status = msm_evt->status; 176a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_cond_signal(&my_obj->evt_cond); 177a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->evt_lock); 178a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 179a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam case CAM_EVENT_TYPE_INT_TAKE_JPEG: 180a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam case CAM_EVENT_TYPE_INT_TAKE_RAW: 181a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam { 182a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt.server_event_type = msm_evt->command; 183a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_enqueue_evt(my_obj, &evt); 184a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 185a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 186a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam case MSM_CAMERA_PRIV_SHUTDOWN: 187a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam { 188a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt.server_event_type = CAM_EVENT_TYPE_DAEMON_DIED; 189a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_enqueue_evt(my_obj, &evt); 190a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 191a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 192a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam default: 193a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 194a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 195a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 196a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 197a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 198a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 199a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 200a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_enqueue_evt 201a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 202a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: enqueue received event into event queue to be processed by 203a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * event thread. 204a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 205a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 206a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : ptr to a camera object 207a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @event : event to be queued 208a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 209a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 210a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 211a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 212a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 213a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_enqueue_evt(mm_camera_obj_t *my_obj, 214a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_event_t *event) 215a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 216a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = 0; 217a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_cmdcb_t *node = NULL; 218a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 219a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t)); 220a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != node) { 221a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(node, 0, sizeof(mm_camera_cmdcb_t)); 222a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam node->cmd_type = MM_CAMERA_CMD_TYPE_EVT_CB; 223a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam node->u.evt = *event; 224a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 225a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* enqueue to evt cmd thread */ 226a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam cam_queue_enq(&(my_obj->evt_thread.cmd_queue), node); 227a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* wake up evt cmd thread */ 228a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam cam_sem_post(&(my_obj->evt_thread.cmd_sem)); 229a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 230a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG_ERROR("%s: No memory for mm_camera_node_t", __func__); 231a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = -1; 232a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 233a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 234a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 235a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 236a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 237a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 238a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_open 239a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 240a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: open a camera 241a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 242a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 243a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : ptr to a camera object 244a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 245a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 246a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 247a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 248a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 249a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_open(mm_camera_obj_t *my_obj) 250a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 251a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam char dev_name[MM_CAMERA_DEV_NAME_LEN]; 252a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = 0; 253a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int8_t n_try=MM_CAMERA_DEV_OPEN_TRIES; 254a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint8_t sleep_msec=MM_CAMERA_DEV_OPEN_RETRY_SLEEP; 255a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int cam_idx = 0; 256a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam const char *dev_name_value = NULL; 257a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam char prop[PROPERTY_VALUE_MAX]; 258a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t globalLogLevel = 0; 259a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 260a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam property_get("persist.camera.hal.debug", prop, "0"); 261a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int val = atoi(prop); 262a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (0 <= val) { 263a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam gMmCameraIntfLogLevel = (uint32_t)val; 264a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 265a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam property_get("persist.camera.global.debug", prop, "0"); 266a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam val = atoi(prop); 267a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (0 <= val) { 268a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam globalLogLevel = (uint32_t)val; 269a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 270a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 271a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* Highest log level among hal.logs and global.logs is selected */ 272a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (gMmCameraIntfLogLevel < globalLogLevel) 273a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam gMmCameraIntfLogLevel = globalLogLevel; 274a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 275a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s: begin\n", __func__); 276a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 277a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL == my_obj) { 278a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam goto on_error; 279a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 280a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam dev_name_value = mm_camera_util_get_dev_name(my_obj->my_hdl); 281a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL == dev_name_value) { 282a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam goto on_error; 283a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 284a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam snprintf(dev_name, sizeof(dev_name), "/dev/%s", 285a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam dev_name_value); 286a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam sscanf(dev_name, "/dev/video%d", &cam_idx); 287a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s: dev name = %s, cam_idx = %d", __func__, dev_name, cam_idx); 288a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 289a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam do{ 290a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam n_try--; 291a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam errno = 0; 292a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->ctrl_fd = open(dev_name, O_RDWR | O_NONBLOCK); 293a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s: ctrl_fd = %d, errno == %d", __func__, my_obj->ctrl_fd, errno); 294a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if((my_obj->ctrl_fd >= 0) || 295a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (errno != EIO && errno != ETIMEDOUT && errno != ENODEV) || 296a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (n_try <= 0 )) { 297a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG_HIGH("%s: opened, break out while loop", __func__); 298a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (my_obj->ctrl_fd < 0) { 299a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ALOGE("%s: Failed to open %s: %s(%d).", __func__, dev_name, 300a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam strerror(-errno), errno); 301a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 302a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 303a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 304a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ALOGE("%s:Failed with %s error, retrying after %d milli-seconds", 305a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam __func__, strerror(errno), sleep_msec); 306a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam usleep(sleep_msec * 1000U); 307a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam }while (n_try > 0); 308a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 309a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (my_obj->ctrl_fd < 0) { 310a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG_ERROR("%s: cannot open control fd of '%s' (%s)\n", 311a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam __func__, dev_name, strerror(errno)); 312a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (errno == EBUSY) 313a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = -EUSERS; 314a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam else 315a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = -1; 316a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam goto on_error; 317a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 318a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 319a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* open domain socket*/ 320a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam n_try = MM_CAMERA_DEV_OPEN_TRIES; 321a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam do { 322a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam n_try--; 323a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->ds_fd = mm_camera_socket_create(cam_idx, MM_CAMERA_SOCK_TYPE_UDP); 324a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s: ds_fd = %d, errno = %d", __func__, my_obj->ds_fd, errno); 325a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if((my_obj->ds_fd >= 0) || (n_try <= 0 )) { 326a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s: opened, break out while loop", __func__); 327a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 328a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 329a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s:failed with I/O error retrying after %d milli-seconds", 330a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam __func__, sleep_msec); 331a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam usleep(sleep_msec * 1000U); 332a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } while (n_try > 0); 333a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 334a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (my_obj->ds_fd < 0) { 335a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG_ERROR("%s: cannot open domain socket fd of '%s'(%s)\n", 336a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam __func__, dev_name, strerror(errno)); 337a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = -1; 338a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam goto on_error; 339a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 340a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_init(&my_obj->msg_lock, NULL); 341a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 342a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_init(&my_obj->cb_lock, NULL); 343a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_init(&my_obj->evt_lock, NULL); 3442641bd474536c433421ca8f51bfe4e76d239e44aShuzhen Wang PTHREAD_COND_INIT(&my_obj->evt_cond); 345a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 346a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s : Launch evt Thread in Cam Open",__func__); 347a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam snprintf(my_obj->evt_thread.threadName, THREAD_NAME_SIZE, "CAM_Dispatch"); 348a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_cmd_thread_launch(&my_obj->evt_thread, 349a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_dispatch_app_event, 350a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)my_obj); 351a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 352a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* launch event poll thread 353a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * we will add evt fd into event poll thread upon user first register for evt */ 354a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s : Launch evt Poll Thread in Cam Open", __func__); 355a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam snprintf(my_obj->evt_thread.threadName, THREAD_NAME_SIZE, "CAM_Poll"); 356a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_poll_thread_launch(&my_obj->evt_poll_thread, 357a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CAMERA_POLL_TYPE_EVT); 358a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_evt_sub(my_obj, TRUE); 359a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 360a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* unlock cam_lock, we need release global intf_lock in camera_open(), 361a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * in order not block operation of other Camera in dual camera use case.*/ 362a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 363a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s: end (rc = %d)\n", __func__, rc); 364a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 365a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 366a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamon_error: 367a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 368a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL == dev_name_value) { 369a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG_ERROR("%s: Invalid device name\n", __func__); 370a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = -1; 371a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 372a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 373a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL == my_obj) { 374a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG_ERROR("%s: Invalid camera object\n", __func__); 375a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = -1; 376a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 377a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (my_obj->ctrl_fd >= 0) { 378a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam close(my_obj->ctrl_fd); 379a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->ctrl_fd = -1; 380a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 381a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (my_obj->ds_fd >= 0) { 382a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_socket_close(my_obj->ds_fd); 383a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->ds_fd = -1; 384a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 385a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 386a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 387a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* unlock cam_lock, we need release global intf_lock in camera_open(), 388a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * in order not block operation of other Camera in dual camera use case.*/ 389a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 390a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 391a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 392a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 393a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 394a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_close 395a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 396a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: enqueue received event into event queue to be processed by 397a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * event thread. 398a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 399a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 400a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : ptr to a camera object 401a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @event : event to be queued 402a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 403a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 404a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 405a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 406a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 407a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_close(mm_camera_obj_t *my_obj) 408a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 409a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s : unsubscribe evt", __func__); 410a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_evt_sub(my_obj, FALSE); 411a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 412a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s : Close evt Poll Thread in Cam Close",__func__); 413a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_poll_thread_release(&my_obj->evt_poll_thread); 414a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 415a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s : Close evt cmd Thread in Cam Close",__func__); 416a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_cmd_thread_release(&my_obj->evt_thread); 417a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 418a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if(my_obj->ctrl_fd >= 0) { 419a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam close(my_obj->ctrl_fd); 420a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->ctrl_fd = -1; 421a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 422a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if(my_obj->ds_fd >= 0) { 423a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_socket_close(my_obj->ds_fd); 424a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->ds_fd = -1; 425a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 426a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_destroy(&my_obj->msg_lock); 427a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 428a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_destroy(&my_obj->cb_lock); 429a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_destroy(&my_obj->evt_lock); 430a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_cond_destroy(&my_obj->evt_cond); 431a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 432a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 433a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return 0; 434a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 435a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 436a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 437a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_close_fd 438a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 439a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: close the ctrl_fd and socket fd in case of an error so that 440a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * the backend will close 441a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * Do NOT close or release any HAL resources since a close_camera 442a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * has not been called yet. 443a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 444a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : ptr to a camera object 445a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @event : event to be queued 446a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 447a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 448a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 449a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 450a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 451a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_close_fd(mm_camera_obj_t *my_obj) 452a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 453a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if(my_obj->ctrl_fd >= 0) { 454a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam close(my_obj->ctrl_fd); 455a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->ctrl_fd = -1; 456a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 457a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if(my_obj->ds_fd >= 0) { 458a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_socket_close(my_obj->ds_fd); 459a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->ds_fd = -1; 460a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 461a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 462a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return 0; 463a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 464a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 465a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 466a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_register_event_notify_internal 467a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 468a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: internal implementation for registering callback for event notify. 469a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 470a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 471a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : ptr to a camera object 472a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @evt_cb : callback to be registered to handle event notify 473a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @user_data: user data ptr 474a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 475a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 476a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 477a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 478a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 479a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_register_event_notify_internal(mm_camera_obj_t *my_obj, 480a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_event_notify_t evt_cb, 481a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam void * user_data) 482a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 483a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int i; 484a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int rc = -1; 485a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_evt_obj_t *evt_array = NULL; 486a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 487a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&my_obj->cb_lock); 488a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt_array = &my_obj->evt; 489a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if(evt_cb) { 490a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* this is reg case */ 491a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam for(i = 0; i < MM_CAMERA_EVT_ENTRY_MAX; i++) { 492a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if(evt_array->evt[i].user_data == NULL) { 493a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt_array->evt[i].evt_cb = evt_cb; 494a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt_array->evt[i].user_data = user_data; 495a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt_array->reg_count++; 496a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = 0; 497a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 498a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 499a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 500a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 501a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* this is unreg case */ 502a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam for(i = 0; i < MM_CAMERA_EVT_ENTRY_MAX; i++) { 503a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if(evt_array->evt[i].user_data == user_data) { 504a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt_array->evt[i].evt_cb = NULL; 505a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt_array->evt[i].user_data = NULL; 506a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt_array->reg_count--; 507a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = 0; 508a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 509a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 510a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 511a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 512a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 513a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cb_lock); 514a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 515a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 516a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 517a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 518a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_register_event_notify 519a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 520a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: registering a callback for event notify. 521a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 522a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 523a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : ptr to a camera object 524a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @evt_cb : callback to be registered to handle event notify 525a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @user_data: user data ptr 526a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 527a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 528a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 529a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 530a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 531a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_register_event_notify(mm_camera_obj_t *my_obj, 532a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_event_notify_t evt_cb, 533a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam void * user_data) 534a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 535a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int rc = -1; 536a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_register_event_notify_internal(my_obj, 537a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam evt_cb, 538a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam user_data); 539a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 540a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 541a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 542a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 543a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 544a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_qbuf 545a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 546a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: enqueue buffer back to kernel 547a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 548a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 549a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 550a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 551a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @buf : buf ptr to be enqueued 552a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 553a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 554a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 555a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 556a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 557a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_qbuf(mm_camera_obj_t *my_obj, 558a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 559a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_buf_def_t *buf) 560a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 561a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int rc = -1; 562a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = NULL; 563a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ch_obj = mm_camera_util_get_channel_by_handler(my_obj, ch_id); 564a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 565a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 566a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 567a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* we always assume qbuf will be done before channel/stream is fully stopped 568a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * because qbuf is done within dataCB context 569a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * in order to avoid deadlock, we are not locking ch_lock for qbuf */ 570a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 571a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_qbuf(ch_obj, buf); 572a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 573a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 574a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 575a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 576a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 577a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 578a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_get_queued_buf_count 579a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 580a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: return queued buffer count 581a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 582a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 583a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 584a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 585a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @stream_id : stream id 586a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 587a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : queued buffer count 588a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 589a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_get_queued_buf_count(mm_camera_obj_t *my_obj, 590a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, uint32_t stream_id) 591a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 592a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int rc = -1; 593a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = NULL; 594a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t payload; 595a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ch_obj = mm_camera_util_get_channel_by_handler(my_obj, ch_id); 596a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload = stream_id; 597a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 598a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 599a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 600a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 601a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 602a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_GET_STREAM_QUEUED_BUF_COUNT, 603a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&payload, 604a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 605a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 606a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 607a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 608a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 609a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 610a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 611a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 612a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 613a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_query_capability 614a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 615a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: query camera capability 616a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 617a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 618a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj: camera object 619a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 620a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 621a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 622a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 623a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 624a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_query_capability(mm_camera_obj_t *my_obj) 625a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 626a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = 0; 627a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam struct v4l2_capability cap; 628a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 629a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* get camera capabilities */ 630a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&cap, 0, sizeof(cap)); 631a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = ioctl(my_obj->ctrl_fd, VIDIOC_QUERYCAP, &cap); 632a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (rc != 0) { 633a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG_ERROR("%s: cannot get camera capabilities, rc = %d\n", __func__, rc); 634a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 635a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 636a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 637a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 638a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 639a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 640a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 641a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 642a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_set_parms 643a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 644a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: set parameters per camera 645a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 646a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 647a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 648a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @parms : ptr to a param struct to be set to server 649a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 650a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 651a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 652a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 653a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NOTE : Assume the parms struct buf is already mapped to server via 654a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * domain socket. Corresponding fields of parameters to be set 655a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * are already filled in by upper layer caller. 656a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 657a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_set_parms(mm_camera_obj_t *my_obj, 658a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam parm_buffer_t *parms) 659a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 660a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 661a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t value = 0; 662a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (parms != NULL) { 663a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_util_s_ctrl(my_obj->ctrl_fd, CAM_PRIV_PARM, &value); 664a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 665a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 666a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 667a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 668a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 669a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 670a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_get_parms 671a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 672a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: get parameters per camera 673a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 674a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 675a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 676a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @parms : ptr to a param struct to be get from server 677a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 678a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 679a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 680a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 681a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NOTE : Assume the parms struct buf is already mapped to server via 682a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * domain socket. Parameters to be get from server are already 683a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * filled in by upper layer caller. After this call, corresponding 684a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * fields of requested parameters will be filled in by server with 685a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * detailed information. 686a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 687a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_get_parms(mm_camera_obj_t *my_obj, 688a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam parm_buffer_t *parms) 689a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 690a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 691a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t value = 0; 692a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (parms != NULL) { 693a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_util_g_ctrl(my_obj->ctrl_fd, CAM_PRIV_PARM, &value); 694a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 695a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 696a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 697a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 698a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 699a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 700a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_do_auto_focus 701a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 702a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: performing auto focus 703a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 704a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 705a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @camera_handle: camera handle 706a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 707a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 708a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 709a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 710a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NOTE : if this call success, we will always assume there will 711a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * be an auto_focus event following up. 712a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 713a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_do_auto_focus(mm_camera_obj_t *my_obj) 714a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 715a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 716a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t value = 0; 717a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_util_s_ctrl(my_obj->ctrl_fd, CAM_PRIV_DO_AUTO_FOCUS, &value); 718a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 719a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 720a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 721a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 722a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 723a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_cancel_auto_focus 724a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 725a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: cancel auto focus 726a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 727a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 728a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @camera_handle: camera handle 729a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 730a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 731a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 732a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 733a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 734a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_cancel_auto_focus(mm_camera_obj_t *my_obj) 735a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 736a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 737a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t value = 0; 738a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_util_s_ctrl(my_obj->ctrl_fd, CAM_PRIV_CANCEL_AUTO_FOCUS, &value); 739a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 740a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 741a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 742a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 743a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 744a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_prepare_snapshot 745a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 746a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: prepare hardware for snapshot 747a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 748a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 749a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 750a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @do_af_flag : flag indicating if AF is needed 751a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 752a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 753a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 754a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 755a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 756a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_prepare_snapshot(mm_camera_obj_t *my_obj, 757a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t do_af_flag) 758a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 759a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 760a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t value = do_af_flag; 761a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_util_s_ctrl(my_obj->ctrl_fd, CAM_PRIV_PREPARE_SNAPSHOT, &value); 762a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 763a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 764a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 765a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 766a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 767a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_start_zsl_snapshot 768a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 769a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: start zsl snapshot 770a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 771a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 772a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 773a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 774a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 775a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 776a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 777a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 778a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_start_zsl_snapshot(mm_camera_obj_t *my_obj) 779a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 780a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 781a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t value = 0; 782a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 783a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_util_s_ctrl(my_obj->ctrl_fd, 784a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CAM_PRIV_START_ZSL_SNAPSHOT, &value); 785a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 786a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 787a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 788a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 789a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_stop_zsl_snapshot 790a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 791a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: stop zsl capture 792a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 793a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 794a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 795a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 796a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 797a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 798a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 799a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 800a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_stop_zsl_snapshot(mm_camera_obj_t *my_obj) 801a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 802a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 803a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t value; 804a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_util_s_ctrl(my_obj->ctrl_fd, 805a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CAM_PRIV_STOP_ZSL_SNAPSHOT, &value); 806a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 807a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 808a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 809a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 810a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_add_channel 811a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 812a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: add a channel 813a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 814a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 815a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 816a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @attr : bundle attribute of the channel if needed 817a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @channel_cb : callback function for bundle data notify 818a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @userdata : user data ptr 819a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 820a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : uint32_t type of channel handle 821a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- invalid channel handle, meaning the op failed 822a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * >0 -- successfully added a channel with a valid handle 823a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NOTE : if no bundle data notify is needed, meaning each stream in the 824a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * channel will have its own stream data notify callback, then 825a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * attr, channel_cb, and userdata can be NULL. In this case, 826a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * no matching logic will be performed in channel for the bundling. 827a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 828a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamuint32_t mm_camera_add_channel(mm_camera_obj_t *my_obj, 829a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_channel_attr_t *attr, 830a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_buf_notify_t channel_cb, 831a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam void *userdata) 832a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 833a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t *ch_obj = NULL; 834a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint8_t ch_idx = 0; 835a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_hdl = 0; 836a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 837a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam for(ch_idx = 0; ch_idx < MM_CAMERA_CHANNEL_MAX; ch_idx++) { 838a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (MM_CHANNEL_STATE_NOTUSED == my_obj->ch[ch_idx].state) { 839a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ch_obj = &my_obj->ch[ch_idx]; 840a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 841a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 842a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 843a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 844a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 845a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* initialize channel obj */ 846a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(ch_obj, 0, sizeof(mm_channel_t)); 847a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ch_hdl = mm_camera_util_generate_handler(ch_idx); 848a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ch_obj->my_hdl = ch_hdl; 849a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ch_obj->state = MM_CHANNEL_STATE_STOPPED; 850a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ch_obj->cam_obj = my_obj; 851a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_init(&ch_obj->ch_lock, NULL); 852a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_init(ch_obj, attr, channel_cb, userdata); 853a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 854a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 855a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 856a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 857a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return ch_hdl; 858a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 859a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 860a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 861a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_del_channel 862a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 863a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: delete a channel by its handle 864a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 865a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 866a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 867a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 868a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 869a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 870a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 871a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 872a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NOTE : all streams in the channel should be stopped already before 873a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * this channel can be deleted. 874a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 875a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_del_channel(mm_camera_obj_t *my_obj, 876a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id) 877a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 878a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 879a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 880a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 881a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 882a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 883a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 884a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 885a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 886a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 887a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_DELETE, 888a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL, 889a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 890a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 891a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_destroy(&ch_obj->ch_lock); 892a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(ch_obj, 0, sizeof(mm_channel_t)); 893a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 894a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 895a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 896a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 897a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 898a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 899a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 900a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_get_bundle_info 901a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 902a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: query bundle info of the channel 903a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 904a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 905a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 906a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 907a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @bundle_info : bundle info to be filled in 908a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 909a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 910a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 911a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 912a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NOTE : all streams in the channel should be stopped already before 913a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * this channel can be deleted. 914a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 915a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_get_bundle_info(mm_camera_obj_t *my_obj, 916a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 917a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam cam_bundle_config_t *bundle_info) 918a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 919a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 920a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 921a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 922a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 923a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 924a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 925a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 926a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 927a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 928a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_GET_BUNDLE_INFO, 929a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)bundle_info, 930a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 931a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 932a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 933a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 934a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 935a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 936a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 937a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 938a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_link_stream 939a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 940a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: link a stream into a channel 941a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 942a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 943a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 944a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 945a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @stream_id : stream that will be linked 946a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @linked_ch_id : channel in which the stream will be linked 947a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 948a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : uint32_t type of stream handle 949a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- invalid stream handle, meaning the op failed 950a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * >0 -- successfully linked a stream with a valid handle 951a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 952a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamuint32_t mm_camera_link_stream(mm_camera_obj_t *my_obj, 953a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 954a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t stream_id, 955a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t linked_ch_id) 956a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 957a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t s_hdl = 0; 958a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 959a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, linked_ch_id); 960a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * owner_obj = 961a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 962a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 963a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if ((NULL != ch_obj) && (NULL != owner_obj)) { 964a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 965a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 966a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 967a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_stream_link_t stream_link; 968a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&stream_link, 0, sizeof(mm_camera_stream_link_t)); 969a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam stream_link.ch = owner_obj; 970a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam stream_link.stream_id = stream_id; 971a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_fsm_fn(ch_obj, 972a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_LINK_STREAM, 973a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void*)&stream_link, 974a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void*)&s_hdl); 975a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 976a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 977a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 978a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 979a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return s_hdl; 980a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 981a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 982a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 983a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_add_stream 984a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 985a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: add a stream into a channel 986a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 987a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 988a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 989a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 990a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 991a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : uint32_t type of stream handle 992a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- invalid stream handle, meaning the op failed 993a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * >0 -- successfully added a stream with a valid handle 994a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 995a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamuint32_t mm_camera_add_stream(mm_camera_obj_t *my_obj, 996a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id) 997a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 998a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t s_hdl = 0; 999a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1000a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1001a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1002a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1003a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1004a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1005a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1006a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_fsm_fn(ch_obj, 1007a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_ADD_STREAM, 1008a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL, 1009a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&s_hdl); 1010a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1011a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1012a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1013a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1014a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return s_hdl; 1015a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1016a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1017a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1018a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_del_stream 1019a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1020a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: delete a stream by its handle 1021a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1022a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1023a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1024a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1025a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @stream_id : stream handle 1026a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1027a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1028a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1029a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1030a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NOTE : stream should be stopped already before it can be deleted. 1031a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1032a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_del_stream(mm_camera_obj_t *my_obj, 1033a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 1034a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t stream_id) 1035a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1036a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1037a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1038a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1039a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1040a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1041a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1042a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1043a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1044a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1045a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_DEL_STREAM, 1046a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&stream_id, 1047a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1048a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1049a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1050a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1051a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1052a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1053a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1054a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1055a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1056a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_start_zsl_snapshot_ch 1057a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1058a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: starts zsl snapshot for specific channel 1059a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1060a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1061a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1062a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1063a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1064a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1065a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1066a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1067a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1068a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_start_zsl_snapshot_ch(mm_camera_obj_t *my_obj, 1069a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id) 1070a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1071a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1072a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1073a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1074a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1075a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1076a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1077a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1078a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1079a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1080a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_START_ZSL_SNAPSHOT, 1081a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL, 1082a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1083a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1084a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1085a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1086a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1087a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1088a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1089a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1090a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1091a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_stop_zsl_snapshot_ch 1092a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1093a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: stops zsl snapshot for specific channel 1094a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1095a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1096a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1097a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1098a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1099a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1100a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1101a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1102a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1103a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_stop_zsl_snapshot_ch(mm_camera_obj_t *my_obj, 1104a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id) 1105a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1106a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1107a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1108a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1109a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1110a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1111a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1112a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1113a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1114a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1115a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_STOP_ZSL_SNAPSHOT, 1116a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL, 1117a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1118a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1119a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1120a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1121a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1122a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1123a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1124a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1125a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1126a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_config_stream 1127a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1128a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: configure a stream 1129a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1130a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1131a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1132a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1133a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @stream_id : stream handle 1134a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @config : stream configuration 1135a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1136a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1137a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1138a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1139a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1140a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_config_stream(mm_camera_obj_t *my_obj, 1141a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 1142a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t stream_id, 1143a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_stream_config_t *config) 1144a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1145a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1146a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1147a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1148a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_evt_paylod_config_stream_t payload; 1149a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1150a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1151a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1152a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1153a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1154a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&payload, 0, sizeof(mm_evt_paylod_config_stream_t)); 1155a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.stream_id = stream_id; 1156a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.config = config; 1157a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1158a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_CONFIG_STREAM, 1159a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&payload, 1160a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1161a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1162a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1163a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1164a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1165a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1166a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1167a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1168a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1169a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_start_channel 1170a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1171a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: start a channel, which will start all streams in the channel 1172a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1173a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1174a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1175a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1176a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1177a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1178a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1179a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1180a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1181a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_start_channel(mm_camera_obj_t *my_obj, 1182a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id) 1183a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1184a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1185a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1186a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1187a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1188a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1189a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1190a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1191a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1192a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1193a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_START, 1194a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL, 1195a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1196a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1197a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1198a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1199a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1200a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1201a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1202a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1203a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1204a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_stop_channel 1205a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1206a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: stop a channel, which will stop all streams in the channel 1207a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1208a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1209a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1210a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1211a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1212a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1213a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1214a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1215a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1216a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_stop_channel(mm_camera_obj_t *my_obj, 1217a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id) 1218a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1219a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = 0; 1220a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1221a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1222a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1223a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1224a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1225a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1226a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1227a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1228a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_STOP, 1229a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL, 1230a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1231a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1232a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1233a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1234a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1235a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1236a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1237a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1238a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_request_super_buf 1239a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1240a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: for burst mode in bundle, reuqest certain amount of matched 1241a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * frames from superbuf queue 1242a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1243a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1244a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1245a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1246a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @num_buf_requested : number of matched frames needed 1247a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1248a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1249a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1250a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1251a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1252a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_request_super_buf(mm_camera_obj_t *my_obj, 1253a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 1254a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t num_buf_requested, 1255a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t num_retro_buf_requested) 1256a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1257a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1258a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1259a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1260a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1261a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1262a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1263a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1264a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1265a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1266a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_REQUEST_SUPER_BUF, 1267a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&num_buf_requested, 1268a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&num_retro_buf_requested); 1269a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1270a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1271a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1272a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1273a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1274a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1275a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1276a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1277a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_cancel_super_buf_request 1278a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1279a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: for burst mode in bundle, cancel the reuqest for certain amount 1280a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * of matched frames from superbuf queue 1281a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1282a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1283a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1284a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1285a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1286a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1287a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1288a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1289a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1290a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_cancel_super_buf_request(mm_camera_obj_t *my_obj, uint32_t ch_id) 1291a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1292a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1293a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1294a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1295a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1296a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1297a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1298a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1299a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1300a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1301a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_CANCEL_REQUEST_SUPER_BUF, 1302a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL, 1303a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1304a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1305a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1306a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1307a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1308a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1309a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1310a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1311a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1312a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_flush_super_buf_queue 1313a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1314a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: flush out all frames in the superbuf queue 1315a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1316a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1317a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1318a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1319a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1320a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1321a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1322a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1323a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1324a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_flush_super_buf_queue(mm_camera_obj_t *my_obj, uint32_t ch_id, 1325a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t frame_idx) 1326a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1327a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1328a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1329a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1330a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1331a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1332a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1333a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1334a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1335a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1336a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_FLUSH_SUPER_BUF_QUEUE, 1337a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&frame_idx, 1338a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1339a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1340a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1341a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1342a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1343a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1344a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1345a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1346a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1347a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_config_channel_notify 1348a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1349a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: configures the channel notification mode 1350a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1351a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1352a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1353a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1354a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @notify_mode : notification mode 1355a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1356a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1357a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1358a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1359a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1360a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_config_channel_notify(mm_camera_obj_t *my_obj, 1361a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 1362a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_super_buf_notify_mode_t notify_mode) 1363a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1364a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1365a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1366a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1367a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1368a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1369a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1370a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1371a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1372a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1373a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_CONFIG_NOTIFY_MODE, 1374a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)¬ify_mode, 1375a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1376a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1377a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1378a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1379a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1380a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1381a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1382a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1383a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1384a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_set_stream_parms 1385a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1386a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: set parameters per stream 1387a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1388a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1389a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1390a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1391a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @s_id : stream handle 1392a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @parms : ptr to a param struct to be set to server 1393a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1394a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1395a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1396a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1397a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NOTE : Assume the parms struct buf is already mapped to server via 1398a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * domain socket. Corresponding fields of parameters to be set 1399a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * are already filled in by upper layer caller. 1400a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1401a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_set_stream_parms(mm_camera_obj_t *my_obj, 1402a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 1403a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t s_id, 1404a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam cam_stream_parm_buffer_t *parms) 1405a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1406a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1407a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_evt_paylod_set_get_stream_parms_t payload; 1408a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1409a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1410a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1411a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1412a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1413a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1414a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1415a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&payload, 0, sizeof(payload)); 1416a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.stream_id = s_id; 1417a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.parms = parms; 1418a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1419a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1420a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_SET_STREAM_PARM, 1421a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&payload, 1422a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1423a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1424a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1425a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1426a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1427a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1428a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1429a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1430a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1431a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_get_stream_parms 1432a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1433a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: get parameters per stream 1434a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1435a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1436a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1437a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1438a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @s_id : stream handle 1439a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @parms : ptr to a param struct to be get from server 1440a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1441a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1442a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1443a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1444a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NOTE : Assume the parms struct buf is already mapped to server via 1445a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * domain socket. Parameters to be get from server are already 1446a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * filled in by upper layer caller. After this call, corresponding 1447a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * fields of requested parameters will be filled in by server with 1448a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * detailed information. 1449a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1450a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_get_stream_parms(mm_camera_obj_t *my_obj, 1451a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 1452a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t s_id, 1453a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam cam_stream_parm_buffer_t *parms) 1454a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1455a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1456a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_evt_paylod_set_get_stream_parms_t payload; 1457a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1458a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1459a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1460a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1461a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1462a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1463a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1464a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&payload, 0, sizeof(payload)); 1465a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.stream_id = s_id; 1466a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.parms = parms; 1467a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1468a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1469a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_GET_STREAM_PARM, 1470a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&payload, 1471a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1472a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1473a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1474a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1475a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1476a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1477a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1478a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1479a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1480a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_do_stream_action 1481a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1482a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: request server to perform stream based action. Maybe removed later 1483a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * if the functionality is included in mm_camera_set_parms 1484a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1485a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1486a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1487a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1488a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @s_id : stream handle 1489a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @actions : ptr to an action struct buf to be performed by server 1490a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1491a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1492a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1493a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1494a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * NOTE : Assume the action struct buf is already mapped to server via 1495a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * domain socket. Actions to be performed by server are already 1496a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * filled in by upper layer caller. 1497a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1498a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_do_stream_action(mm_camera_obj_t *my_obj, 1499a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 1500a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t stream_id, 1501a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam void *actions) 1502a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1503a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1504a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_evt_paylod_do_stream_action_t payload; 1505a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1506a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1507a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1508a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1509a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1510a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1511a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1512a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&payload, 0, sizeof(payload)); 1513a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.stream_id = stream_id; 1514a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.actions = actions; 1515a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1516a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1517a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_DO_STREAM_ACTION, 1518a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void*)&payload, 1519a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1520a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1521a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1522a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1523a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1524a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1525a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1526a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1527a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1528a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_map_stream_buf 1529a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1530a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: mapping stream buffer via domain socket to server 1531a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1532a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1533a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1534a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1535a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @s_id : stream handle 1536a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @buf_type : type of buffer to be mapped. could be following values: 1537a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_STREAM_BUF 1538a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_STREAM_INFO 1539a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF 1540a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @buf_idx : index of buffer within the stream buffers, only valid if 1541a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or 1542a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF 1543a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @plane_idx : plane index. If all planes share the same fd, 1544a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * plane_idx = -1; otherwise, plean_idx is the 1545a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * index to plane (0..num_of_planes) 1546a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @fd : file descriptor of the buffer 1547a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @size : size of the buffer 1548a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1549a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1550a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1551a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1552a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1553a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_map_stream_buf(mm_camera_obj_t *my_obj, 1554a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 1555a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t stream_id, 1556a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint8_t buf_type, 1557a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t buf_idx, 1558a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t plane_idx, 1559a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int fd, 1560a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam size_t size) 1561a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1562a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1563a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_evt_paylod_map_stream_buf_t payload; 1564a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1565a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1566a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1567a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1568a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1569a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1570a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1571a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&payload, 0, sizeof(payload)); 1572a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.stream_id = stream_id; 1573a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.buf_type = buf_type; 1574a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.buf_idx = buf_idx; 1575a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.plane_idx = plane_idx; 1576a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.fd = fd; 1577a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.size = size; 1578a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1579a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_MAP_STREAM_BUF, 1580a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void*)&payload, 1581a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1582a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1583a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1584a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1585a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1586a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1587a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1588a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1589a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1590a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_unmap_stream_buf 1591a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1592a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: unmapping stream buffer via domain socket to server 1593a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1594a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1595a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1596a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1597a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @s_id : stream handle 1598a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @buf_type : type of buffer to be mapped. could be following values: 1599a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_STREAM_BUF 1600a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_STREAM_INFO 1601a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF 1602a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @buf_idx : index of buffer within the stream buffers, only valid if 1603a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or 1604a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF 1605a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @plane_idx : plane index. If all planes share the same fd, 1606a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * plane_idx = -1; otherwise, plean_idx is the 1607a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * index to plane (0..num_of_planes) 1608a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1609a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1610a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1611a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1612a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1613a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_unmap_stream_buf(mm_camera_obj_t *my_obj, 1614a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, 1615a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t stream_id, 1616a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint8_t buf_type, 1617a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t buf_idx, 1618a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t plane_idx) 1619a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1620a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1621a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_evt_paylod_unmap_stream_buf_t payload; 1622a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1623a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1624a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1625a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1626a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1627a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1628a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1629a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&payload, 0, sizeof(payload)); 1630a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.stream_id = stream_id; 1631a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.buf_type = buf_type; 1632a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.buf_idx = buf_idx; 1633a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam payload.plane_idx = plane_idx; 1634a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1635a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_UNMAP_STREAM_BUF, 1636a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void*)&payload, 1637a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1638a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1639a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1640a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1641a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1642a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1643a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1644a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1645a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1646a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_evt_sub 1647a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1648a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: subscribe/unsubscribe event notify from kernel 1649a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1650a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1651a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1652a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @reg_flag : 1 -- subscribe ; 0 -- unsubscribe 1653a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1654a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1655a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1656a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1657a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1658a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_evt_sub(mm_camera_obj_t * my_obj, 1659a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint8_t reg_flag) 1660a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1661a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = 0; 1662a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam struct v4l2_event_subscription sub; 1663a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1664a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&sub, 0, sizeof(sub)); 1665a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam sub.type = MSM_CAMERA_V4L2_EVENT_TYPE; 1666a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam sub.id = MSM_CAMERA_MSM_NOTIFY; 1667a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if(FALSE == reg_flag) { 1668a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* unsubscribe */ 1669a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = ioctl(my_obj->ctrl_fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 1670a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (rc < 0) { 1671a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG_ERROR("%s: unsubscribe event rc = %d", __func__, rc); 1672a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1673a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1674a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* remove evt fd from the polling thraed when unreg the last event */ 1675a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_poll_thread_del_poll_fd(&my_obj->evt_poll_thread, 1676a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->my_hdl, 1677a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_sync_call); 1678a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1679a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = ioctl(my_obj->ctrl_fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 1680a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (rc < 0) { 1681a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG_ERROR("%s: subscribe event rc = %d", __func__, rc); 1682a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1683a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1684a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* add evt fd to polling thread when subscribe the first event */ 1685a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_poll_thread_add_poll_fd(&my_obj->evt_poll_thread, 1686a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->my_hdl, 1687a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam my_obj->ctrl_fd, 1688a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_event_notify, 1689a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void*)my_obj, 1690a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_sync_call); 1691a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1692a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1693a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1694a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1695a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1696a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_util_wait_for_event 1697a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1698a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: utility function to wait for certain events 1699a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1700a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1701a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1702a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @evt_mask : mask for events to be waited. Any of event in the mask would 1703a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * trigger the wait to end 1704a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @status : status of the event 1705a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1706a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : none 1707a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1708a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamvoid mm_camera_util_wait_for_event(mm_camera_obj_t *my_obj, 1709a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t evt_mask, 1710a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t *status) 1711a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1712a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int rc = 0; 1713a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam struct timespec ts; 1714a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1715a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&my_obj->evt_lock); 1716a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam while (!(my_obj->evt_rcvd.server_event_type & evt_mask)) { 17172641bd474536c433421ca8f51bfe4e76d239e44aShuzhen Wang clock_gettime(CLOCK_MONOTONIC, &ts); 1718a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ts.tv_sec += WAIT_TIMEOUT; 1719a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = pthread_cond_timedwait(&my_obj->evt_cond, &my_obj->evt_lock, &ts); 1720a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (rc == ETIMEDOUT) { 1721a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam ALOGE("%s pthread_cond_timedwait success\n", __func__); 1722a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 1723a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1724a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1725a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *status = my_obj->evt_rcvd.status; 1726a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* reset local storage for recieved event for next event */ 1727a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&my_obj->evt_rcvd, 0, sizeof(mm_camera_event_t)); 1728a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->evt_lock); 1729a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1730a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1731a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1732a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_util_sendmsg 1733a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1734a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: utility function to send msg via domain socket 1735a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1736a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1737a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1738a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @msg : message to be sent 1739a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @buf_size : size of the message to be sent 1740a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @sendfd : >0 if any file descriptor need to be passed across process 1741a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1742a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1743a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1744a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1745a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1746a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_util_sendmsg(mm_camera_obj_t *my_obj, 1747a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam void *msg, 1748a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam size_t buf_size, 1749a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int sendfd) 1750a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1751a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1752a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t status; 1753a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1754a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* need to lock msg_lock, since sendmsg until reposonse back is deemed as one operation*/ 1755a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&my_obj->msg_lock); 1756a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if(mm_camera_socket_sendmsg(my_obj->ds_fd, msg, buf_size, sendfd) > 0) { 1757a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam /* wait for event that mapping/unmapping is done */ 1758a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_wait_for_event(my_obj, CAM_EVENT_TYPE_MAP_UNMAP_DONE, &status); 1759a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (MSM_CAMERA_STATUS_SUCCESS == status) { 1760a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = 0; 1761a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1762a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1763a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->msg_lock); 1764a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1765a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1766a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1767a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1768a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_map_buf 1769a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1770a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: mapping camera buffer via domain socket to server 1771a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1772a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1773a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1774a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @buf_type : type of buffer to be mapped. could be following values: 1775a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_CAPABILITY 1776a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_SETPARM_BUF 1777a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_GETPARM_BUF 1778a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @fd : file descriptor of the buffer 1779a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @size : size of the buffer 1780a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1781a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1782a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1783a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1784a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1785a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_map_buf(mm_camera_obj_t *my_obj, 1786a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint8_t buf_type, 1787a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int fd, 1788a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam size_t size) 1789a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1790a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = 0; 1791a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam cam_sock_packet_t packet; 1792a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&packet, 0, sizeof(cam_sock_packet_t)); 1793a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam packet.msg_type = CAM_MAPPING_TYPE_FD_MAPPING; 1794a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam packet.payload.buf_map.type = buf_type; 1795a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam packet.payload.buf_map.fd = fd; 1796a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam packet.payload.buf_map.size = size; 1797a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_util_sendmsg(my_obj, 1798a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam &packet, 1799a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam sizeof(cam_sock_packet_t), 1800a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam fd); 1801a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1802a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1803a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1804a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1805a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1806a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_unmap_buf 1807a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1808a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: unmapping camera buffer via domain socket to server 1809a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1810a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1811a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1812a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @buf_type : type of buffer to be mapped. could be following values: 1813a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_CAPABILITY 1814a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_SETPARM_BUF 1815a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * CAM_MAPPING_BUF_TYPE_GETPARM_BUF 1816a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1817a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1818a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1819a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1820a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1821a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_unmap_buf(mm_camera_obj_t *my_obj, 1822a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint8_t buf_type) 1823a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1824a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = 0; 1825a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam cam_sock_packet_t packet; 1826a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&packet, 0, sizeof(cam_sock_packet_t)); 1827a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam packet.msg_type = CAM_MAPPING_TYPE_FD_UNMAPPING; 1828a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam packet.payload.buf_unmap.type = buf_type; 1829a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_camera_util_sendmsg(my_obj, 1830a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam &packet, 1831a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam sizeof(cam_sock_packet_t), 1832a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam -1); 1833a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1834a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1835a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1836a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1837a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1838a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_util_s_ctrl 1839a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1840a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: utility function to send v4l2 ioctl for s_ctrl 1841a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1842a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1843a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @fd : file descritpor for sending ioctl 1844a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @id : control id 1845a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @value : value of the ioctl to be sent 1846a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1847a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1848a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1849a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1850a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1851a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_util_s_ctrl(int32_t fd, uint32_t id, int32_t *value) 1852a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1853a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int rc = 0; 1854a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam struct v4l2_control control; 1855a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1856a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&control, 0, sizeof(control)); 1857a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam control.id = id; 1858a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (value != NULL) { 1859a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam control.value = *value; 1860a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1861a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = ioctl(fd, VIDIOC_S_CTRL, &control); 1862a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1863a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s: fd=%d, S_CTRL, id=0x%x, value = %p, rc = %d\n", 1864a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam __func__, fd, id, value, rc); 1865a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (value != NULL) { 1866a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *value = control.value; 1867a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1868a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return (rc >= 0)? 0 : -1; 1869a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1870a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1871a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1872a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_util_g_ctrl 1873a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1874a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: utility function to send v4l2 ioctl for g_ctrl 1875a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1876a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1877a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @fd : file descritpor for sending ioctl 1878a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @id : control id 1879a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @value : value of the ioctl to be sent 1880a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1881a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1882a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1883a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1884a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1885a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_util_g_ctrl( int32_t fd, uint32_t id, int32_t *value) 1886a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1887a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int rc = 0; 1888a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam struct v4l2_control control; 1889a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1890a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam memset(&control, 0, sizeof(control)); 1891a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam control.id = id; 1892a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (value != NULL) { 1893a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam control.value = *value; 1894a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1895a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = ioctl(fd, VIDIOC_G_CTRL, &control); 1896a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s: fd=%d, G_CTRL, id=0x%x, rc = %d\n", __func__, fd, id, rc); 1897a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (value != NULL) { 1898a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *value = control.value; 1899a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1900a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return (rc >= 0)? 0 : -1; 1901a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1902a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1903a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam/*=========================================================================== 1904a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * FUNCTION : mm_camera_channel_advanced_capture 1905a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1906a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * DESCRIPTION: sets the channel advanced capture 1907a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1908a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * PARAMETERS : 1909a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @my_obj : camera object 1910a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @ch_id : channel handle 1911a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @type : advanced capture type. 1912a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @start_flag : flag to indicate start/stop 1913a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * @in_value : input configaration 1914a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 1915a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * RETURN : int32_t type of status 1916a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * 0 -- success 1917a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam * -1 -- failure 1918a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam *==========================================================================*/ 1919a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tamint32_t mm_camera_channel_advanced_capture(mm_camera_obj_t *my_obj, 1920a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t ch_id, mm_camera_advanced_capture_t type, 1921a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam uint32_t trigger, void *in_value) 1922a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam{ 1923a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s: E type = %d",__func__, type); 1924a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam int32_t rc = -1; 1925a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_channel_t * ch_obj = 1926a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam mm_camera_util_get_channel_by_handler(my_obj, ch_id); 1927a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1928a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam if (NULL != ch_obj) { 1929a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_lock(&ch_obj->ch_lock); 1930a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1931a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam switch (type) { 1932a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam case MM_CAMERA_AF_BRACKETING: 1933a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1934a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_AF_BRACKETING, 1935a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&trigger, 1936a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1937a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 1938a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam case MM_CAMERA_AE_BRACKETING: 1939a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1940a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_AE_BRACKETING, 1941a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&trigger, 1942a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1943a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 1944a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam case MM_CAMERA_FLASH_BRACKETING: 1945a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1946a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_FLASH_BRACKETING, 1947a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&trigger, 1948a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1949a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 1950a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam case MM_CAMERA_ZOOM_1X: 1951a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1952a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CHANNEL_EVT_ZOOM_1X, 1953a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)&trigger, 1954a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1955a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 1956a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam case MM_CAMERA_FRAME_CAPTURE: 1957a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam rc = mm_channel_fsm_fn(ch_obj, 1958a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam MM_CAMERA_EVT_CAPTURE_SETTING, 1959a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam (void *)in_value, 1960a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam NULL); 1961a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 1962a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam default: 1963a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam break; 1964a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1965a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1966a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } else { 1967a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam pthread_mutex_unlock(&my_obj->cam_lock); 1968a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam } 1969a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam 1970a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam CDBG("%s: X",__func__); 1971a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam return rc; 1972a1c8eae6b44a1ae2f0214fee6201b34cba0161b9Ed Tam} 1973