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 *)&notify_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