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