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 <linux/media.h>
397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <media/msm_cam_sensor.h>
407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <dlfcn.h>
417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define IOCTL_H <SYSTEM_HEADER_PREFIX/ioctl.h>
437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include IOCTL_H
447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He// Camera dependencies
467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "mm_camera_dbg.h"
477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "mm_camera_interface.h"
487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "mm_camera.h"
497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic pthread_mutex_t g_intf_lock = PTHREAD_MUTEX_INITIALIZER;
517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic mm_camera_ctrl_t g_cam_ctrl;
537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic pthread_mutex_t g_handler_lock = PTHREAD_MUTEX_INITIALIZER;
557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic uint16_t g_handler_history_count = 0; /* history count for handler */
567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define CAM_SENSOR_TYPE_MASK (1U<<24) // 24th (starting from 0) bit tells its a MAIN or AUX camera
587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define CAM_SENSOR_FORMAT_MASK (1U<<25) // 25th(starting from 0) bit tells its YUV sensor or not
597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_util_generate_handler
627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to generate handler for camera/channel/stream
647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @index: index of the object to have handler
677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : uint32_t type of handle that uniquely identify the object
697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heuint32_t mm_camera_util_generate_handler(uint8_t index)
717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    uint32_t handler = 0;
737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_handler_lock);
747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    g_handler_history_count++;
757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (0 == g_handler_history_count) {
767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        g_handler_history_count++;
777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    handler = g_handler_history_count;
797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    handler = (handler<<8) | index;
807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_unlock(&g_handler_lock);
817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return handler;
827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_util_get_index_by_handler
867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to get index from handle
887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @handler: object handle
917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : uint8_t type of index derived from handle
937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heuint8_t mm_camera_util_get_index_by_handler(uint32_t handler)
957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return (handler&0x000000ff);
977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
1007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_util_get_dev_name
1017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to get device name from camera handle
1037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
1057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @cam_handle: camera handle
1067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : char ptr to the device name stored in global variable
1087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : caller should not free the char ptr
1097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
1107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heconst char *mm_camera_util_get_dev_name(uint32_t cam_handle)
1117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
1127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    char *dev_name = NULL;
1137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    uint8_t cam_idx = mm_camera_util_get_index_by_handler(cam_handle);
1147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(cam_idx < MM_CAMERA_MAX_NUM_SENSORS) {
1157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        dev_name = g_cam_ctrl.video_dev_name[cam_idx];
1167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
1177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return dev_name;
1187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
1197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
1217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_util_get_camera_by_handler
1227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to get camera object from camera handle
1247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
1267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @cam_handle: camera handle
1277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : ptr to the camera object stored in global variable
1297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : caller should not free the camera object ptr
1307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
1317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hemm_camera_obj_t* mm_camera_util_get_camera_by_handler(uint32_t cam_handle)
1327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
1337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t *cam_obj = NULL;
1347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    uint8_t cam_idx = mm_camera_util_get_index_by_handler(cam_handle);
1357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (cam_idx < MM_CAMERA_MAX_NUM_SENSORS &&
1377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        (NULL != g_cam_ctrl.cam_obj[cam_idx]) &&
1387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        (cam_handle == g_cam_ctrl.cam_obj[cam_idx]->my_hdl)) {
1397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        cam_obj = g_cam_ctrl.cam_obj[cam_idx];
1407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
1417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return cam_obj;
1427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
1437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
1457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_util_get_camera_by_session_id
1467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to get camera object from camera sessionID
1487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
1507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @session_id: sessionid for which cam obj mapped
1517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : ptr to the camera object stored in global variable
1537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : caller should not free the camera object ptr
1547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
1557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hemm_camera_obj_t* mm_camera_util_get_camera_by_session_id(uint32_t session_id)
1567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
1577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He   int cam_idx = 0;
1587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He   mm_camera_obj_t *cam_obj = NULL;
1597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He   for (cam_idx = 0; cam_idx < MM_CAMERA_MAX_NUM_SENSORS; cam_idx++) {
1607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if ((NULL != g_cam_ctrl.cam_obj[cam_idx]) &&
1617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                (session_id == (uint32_t)g_cam_ctrl.cam_obj[cam_idx]->sessionid)) {
1627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGD("session id:%d match idx:%d\n", session_id, cam_idx);
1637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            cam_obj = g_cam_ctrl.cam_obj[cam_idx];
1647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
1657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
1667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return cam_obj;
1677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
1687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
1707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_query_capability
1717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: query camera capability
1737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
1757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
1767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
1777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
1787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
1797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
1807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
1817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_query_capability(uint32_t camera_handle)
1827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
1837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
1847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
1857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E: camera_handler = %d ", camera_handle);
1877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
1897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
1907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
1927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
1937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
1947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_query_capability(my_obj);
1957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
1967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
1977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
1987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
1997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
2007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
2017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
2037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_set_parms
2047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
2057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: set parameters per camera
2067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
2077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
2087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
2097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @parms        : ptr to a param struct to be set to server
2107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
2117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
2127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
2137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
2147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : Assume the parms struct buf is already mapped to server via
2157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              domain socket. Corresponding fields of parameters to be set
2167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              are already filled in by upper layer caller.
2177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
2187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_set_parms(uint32_t camera_handle,
2197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                        parm_buffer_t *parms)
2207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
2217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
2227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
2237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
2257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
2267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
2287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
2297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
2307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_set_parms(my_obj, parms);
2317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
2327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
2337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
2347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
2357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
2367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
2387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_get_parms
2397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
2407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: get parameters per camera
2417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
2427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
2437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
2447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @parms        : ptr to a param struct to be get from server
2457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
2467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
2477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
2487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
2497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : Assume the parms struct buf is already mapped to server via
2507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              domain socket. Parameters to be get from server are already
2517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              filled in by upper layer caller. After this call, corresponding
2527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              fields of requested parameters will be filled in by server with
2537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              detailed information.
2547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
2557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_get_parms(uint32_t camera_handle,
2567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                        parm_buffer_t *parms)
2577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
2587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
2597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
2607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
2627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
2637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
2657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
2667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
2677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_get_parms(my_obj, parms);
2687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
2697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
2707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
2717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
2727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
2737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
2757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_do_auto_focus
2767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
2777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: performing auto focus
2787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
2797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
2807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
2817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
2827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
2837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
2847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
2857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : if this call success, we will always assume there will
2867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              be an auto_focus event following up.
2877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
2887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_do_auto_focus(uint32_t camera_handle)
2897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
2907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
2917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
2927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
2947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
2957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
2977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
2987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
2997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_do_auto_focus(my_obj);
3007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
3017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
3027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
3037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
3047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
3057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
3077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_cancel_auto_focus
3087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
3097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: cancel auto focus
3107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
3117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
3127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
3137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
3147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
3157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
3167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
3177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
3187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_cancel_auto_focus(uint32_t camera_handle)
3197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
3207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
3217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
3227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
3247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
3257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
3277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
3287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
3297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_cancel_auto_focus(my_obj);
3307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
3317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
3327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
3337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
3347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
3357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
3377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_prepare_snapshot
3387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
3397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: prepare hardware for snapshot
3407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
3417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
3427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
3437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @do_af_flag   : flag indicating if AF is needed
3447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
3457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
3467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
3477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
3487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
3497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_prepare_snapshot(uint32_t camera_handle,
3507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               int32_t do_af_flag)
3517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
3527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
3537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
3547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
3567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
3577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
3597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
3607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
3617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_prepare_snapshot(my_obj, do_af_flag);
3627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
3637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
3647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
3657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
3667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
3677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
3697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_flush
3707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
3717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: flush the current camera state and buffers
3727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
3737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
3747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
3757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
3767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
3777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
3787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
3797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
3807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_flush(uint32_t camera_handle)
3817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
3827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
3837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
3847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
3867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
3877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
3897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
3907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
3917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_flush(my_obj);
3927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
3937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
3947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
3957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
3967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
3977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
3997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_close
4007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
4017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: close a camera by its handle
4027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
4037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
4047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
4057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
4067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
4077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
4087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
4097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
4107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_close(uint32_t camera_handle)
4117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
4127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
4137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    uint8_t cam_idx = camera_handle & 0x00ff;
4147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
4157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
4167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E: camera_handler = %d ", camera_handle);
4177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
4187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
4197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
4207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
4217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (my_obj){
4227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        my_obj->ref_count--;
4237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
4247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if(my_obj->ref_count > 0) {
4257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            /* still have reference to obj, return here */
4267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGD("ref_count=%d\n", my_obj->ref_count);
4277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            pthread_mutex_unlock(&g_intf_lock);
4287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            rc = 0;
4297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        } else {
4307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            /* need close camera here as no other reference
4317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He             * first empty g_cam_ctrl's referent to cam_obj */
4327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            g_cam_ctrl.cam_obj[cam_idx] = NULL;
4337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
4347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            pthread_mutex_lock(&my_obj->cam_lock);
4357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            pthread_mutex_unlock(&g_intf_lock);
4367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            rc = mm_camera_close(my_obj);
4377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            pthread_mutex_destroy(&my_obj->cam_lock);
4387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            free(my_obj);
4397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
4407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
4417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
4427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
4437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
4447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
4457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
4467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
4477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
4487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_add_channel
4497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
4507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: add a channel
4517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
4527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
4537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
4547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @attr         : bundle attribute of the channel if needed
4557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @channel_cb   : callback function for bundle data notify
4567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @userdata     : user data ptr
4577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
4587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : uint32_t type of channel handle
4597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- invalid channel handle, meaning the op failed
4607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              >0 -- successfully added a channel with a valid handle
4617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : if no bundle data notify is needed, meaning each stream in the
4627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              channel will have its own stream data notify callback, then
4637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              attr, channel_cb, and userdata can be NULL. In this case,
4647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              no matching logic will be performed in channel for the bundling.
4657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
4667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic uint32_t mm_camera_intf_add_channel(uint32_t camera_handle,
4677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                           mm_camera_channel_attr_t *attr,
4687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                           mm_camera_buf_notify_t channel_cb,
4697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                           void *userdata)
4707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
4717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    uint32_t ch_id = 0;
4727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
4737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
4747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handler = %d", camera_handle);
4757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
4767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
4777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
4787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
4797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
4807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
4817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        ch_id = mm_camera_add_channel(my_obj, attr, channel_cb, userdata);
4827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
4837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
4847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
4857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X ch_id = %d", ch_id);
4867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return ch_id;
4877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
4887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
4897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
4907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_del_channel
4917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
4927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: delete a channel by its handle
4937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
4947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
4957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
4967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
4977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
4987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
4997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
5007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
5017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : all streams in the channel should be stopped already before
5027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              this channel can be deleted.
5037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
5047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_del_channel(uint32_t camera_handle,
5057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                          uint32_t ch_id)
5067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
5077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
5087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
5097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
5107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E ch_id = %d", ch_id);
5117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
5127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
5137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
5147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
5157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
5167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
5177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_del_channel(my_obj, ch_id);
5187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
5197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
5207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
5217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X");
5227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
5237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
5247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
5257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
5267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_get_bundle_info
5277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
5287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: query bundle info of the channel
5297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
5307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
5317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
5327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
5337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @bundle_info  : bundle info to be filled in
5347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
5357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
5367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
5377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
5387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : all streams in the channel should be stopped already before
5397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              this channel can be deleted.
5407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
5417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_get_bundle_info(uint32_t camera_handle,
5427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                              uint32_t ch_id,
5437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                              cam_bundle_config_t *bundle_info)
5447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
5457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
5467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
5477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
5487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E ch_id = %d", ch_id);
5497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
5507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
5517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
5527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
5537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
5547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
5557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_get_bundle_info(my_obj, ch_id, bundle_info);
5567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
5577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
5587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
5597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X");
5607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
5617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
5627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
5637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
5647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_register_event_notify
5657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
5667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: register for event notify
5677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
5687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
5697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
5707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @evt_cb       : callback for event notify
5717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @user_data    : user data ptr
5727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
5737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
5747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
5757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
5767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
5777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_register_event_notify(uint32_t camera_handle,
5787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                                    mm_camera_event_notify_t evt_cb,
5797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                                    void * user_data)
5807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
5817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
5827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
5837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
5847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E ");
5857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
5867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
5877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
5887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
5897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
5907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
5917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_register_event_notify(my_obj, evt_cb, user_data);
5927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
5937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
5947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
5957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E rc = %d", rc);
5967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
5977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
5987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
5997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
6007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_qbuf
6017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
6027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: enqueue buffer back to kernel
6037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
6047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
6057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
6067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
6077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf          : buf ptr to be enqueued
6087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
6097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
6107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
6117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
6127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
6137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_qbuf(uint32_t camera_handle,
6147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                    uint32_t ch_id,
6157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                    mm_camera_buf_def_t *buf)
6167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
6177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
6187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
6197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
6207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
6217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
6227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
6237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
6247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
6257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
6267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_qbuf(my_obj, ch_id, buf);
6277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
6287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
6297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
6307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X evt_type = %d",rc);
6317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
6327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
6337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
6347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
6357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_qbuf
6367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
6377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: enqueue buffer back to kernel
6387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
6397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
6407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
6417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
6427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf          : buf ptr to be enqueued
6437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
6447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
6457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
6467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
6477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
6487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_cancel_buf(uint32_t camera_handle, uint32_t ch_id, uint32_t stream_id,
6497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                     uint32_t buf_idx)
6507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
6517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
6527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
6537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
6547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
6557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
6567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
6577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
6587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
6597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
6607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_cancel_buf(my_obj, ch_id, stream_id, buf_idx);
6617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
6627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
6637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
6647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X evt_type = %d",rc);
6657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
6667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
6677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
6687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
6697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
6707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_get_queued_buf_count
6717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
6727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: returns the queued buffer count
6737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
6747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
6757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
6767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
6777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @stream_id : stream id
6787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
6797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t - queued buffer count
6807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
6817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
6827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_get_queued_buf_count(uint32_t camera_handle,
6837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t ch_id, uint32_t stream_id)
6847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
6857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
6867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
6877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
6887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
6897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
6907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
6917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
6927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
6937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
6947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_get_queued_buf_count(my_obj, ch_id, stream_id);
6957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
6967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
6977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
6987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X queued buffer count = %d",rc);
6997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
7007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
7017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
7027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
7037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_link_stream
7047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
7057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: link a stream into a new channel
7067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
7077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
7087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
7097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
7107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @stream_id    : stream id
7117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @linked_ch_id : channel in which the stream will be linked
7127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
7137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of stream handle
7147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- invalid stream handle, meaning the op failed
7157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              >0 -- successfully linked a stream with a valid handle
7167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
7177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_link_stream(uint32_t camera_handle,
7187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t ch_id,
7197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t stream_id,
7207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t linked_ch_id)
7217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
7227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    uint32_t id = 0;
7237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
7247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
7257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E handle = %u ch_id = %u",
7267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
7277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
7287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
7297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
7307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
7317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
7327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
7337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
7347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        id = mm_camera_link_stream(my_obj, ch_id, stream_id, linked_ch_id);
7357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
7367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
7377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
7387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
7397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X stream_id = %u", stream_id);
7407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return (int32_t)id;
7417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
7427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
7437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
7447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_add_stream
7457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
7467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: add a stream into a channel
7477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
7487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
7497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
7507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
7517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
7527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : uint32_t type of stream handle
7537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- invalid stream handle, meaning the op failed
7547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              >0 -- successfully added a stream with a valid handle
7557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
7567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic uint32_t mm_camera_intf_add_stream(uint32_t camera_handle,
7577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                          uint32_t ch_id)
7587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
7597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    uint32_t stream_id = 0;
7607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
7617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
7627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E handle = %d ch_id = %d",
7637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
7647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
7657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
7667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
7677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
7687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
7697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
7707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
7717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        stream_id = mm_camera_add_stream(my_obj, ch_id);
7727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
7737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
7747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
7757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X stream_id = %d", stream_id);
7767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return stream_id;
7777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
7787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
7797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
7807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_del_stream
7817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
7827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: delete a stream by its handle
7837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
7847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
7857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
7867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
7877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @stream_id    : stream handle
7887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
7897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
7907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
7917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
7927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : stream should be stopped already before it can be deleted.
7937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
7947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_del_stream(uint32_t camera_handle,
7957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                         uint32_t ch_id,
7967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                         uint32_t stream_id)
7977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
7987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
7997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
8007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E handle = %d ch_id = %d stream_id = %d",
8027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id, stream_id);
8037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
8057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
8067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
8087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
8097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
8107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_del_stream(my_obj, ch_id, stream_id);
8117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
8127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
8137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
8147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
8157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
8167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
8177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
8197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_config_stream
8207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
8217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: configure a stream
8227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
8237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
8247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
8257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
8267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @stream_id    : stream handle
8277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @config       : stream configuration
8287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
8297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
8307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
8317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
8327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
8337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_config_stream(uint32_t camera_handle,
8347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                            uint32_t ch_id,
8357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                            uint32_t stream_id,
8367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                            mm_camera_stream_config_t *config)
8377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
8387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
8397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
8407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E handle = %d, ch_id = %d,stream_id = %d",
8427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id, stream_id);
8437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
8457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
8467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("mm_camera_intf_config_stream stream_id = %d",stream_id);
8487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
8507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
8517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
8527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_config_stream(my_obj, ch_id, stream_id, config);
8537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
8547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
8557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
8567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
8577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
8587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
8597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
8617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_start_channel
8627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
8637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: start a channel, which will start all streams in the channel
8647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
8657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
8667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
8677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
8687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
8697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
8707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
8717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
8727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
8737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_start_channel(uint32_t camera_handle,
8747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                            uint32_t ch_id)
8757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
8767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
8777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
8787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
8807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
8817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
8837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
8847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
8857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_start_channel(my_obj, ch_id);
8867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
8877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
8887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
8897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
8907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
8917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
8927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
8937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
8947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_stop_channel
8957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
8967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: stop a channel, which will stop all streams in the channel
8977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
8987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
8997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
9007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
9017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
9027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
9037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
9047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
9057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
9067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_stop_channel(uint32_t camera_handle,
9077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                           uint32_t ch_id)
9087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
9097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
9107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
9117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
9127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
9137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
9147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
9157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
9167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
9177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
9187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_stop_channel(my_obj, ch_id);
9197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
9207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
9217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
9227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
9237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
9247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
9257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
9267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
9277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_request_super_buf
9287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
9297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: for burst mode in bundle, reuqest certain amount of matched
9307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              frames from superbuf queue
9317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
9327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
9337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
9347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id             : channel handle
9357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf                : request buffer info
9367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
9377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
9387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
9397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
9407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
9417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_request_super_buf(uint32_t camera_handle,
9427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t ch_id, mm_camera_req_buf_t *buf)
9437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
9447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
9457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handler = %d,ch_id = %d",
9467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
9477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
9487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
9497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
9507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
9517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
9527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj && buf) {
9537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
9547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
9557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_request_super_buf (my_obj, ch_id, buf);
9567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
9577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
9587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
9597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
9607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
9617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
9627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
9637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
9647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_cancel_super_buf_request
9657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
9667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: for burst mode in bundle, cancel the reuqest for certain amount
9677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              of matched frames from superbuf queue
9687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
9697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
9707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
9717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
9727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
9737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
9747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
9757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
9767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
9777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_cancel_super_buf_request(uint32_t camera_handle,
9787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                                       uint32_t ch_id)
9797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
9807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
9817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
9827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
9837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handler = %d,ch_id = %d",
9847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
9857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
9867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
9877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
9887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
9897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
9907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
9917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_cancel_super_buf_request(my_obj, ch_id);
9927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
9937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
9947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
9957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
9967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
9977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
9987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
9997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
10007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_flush_super_buf_queue
10017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
10027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: flush out all frames in the superbuf queue
10037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
10047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
10057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
10067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
10077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @frame_idx    : frame index
10087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
10097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
10107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
10117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
10127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
10137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_flush_super_buf_queue(uint32_t camera_handle,
10147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                                    uint32_t ch_id, uint32_t frame_idx)
10157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
10167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
10177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
10187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
10197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handler = %d,ch_id = %d",
10207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
10217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
10227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
10237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
10247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
10257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
10267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
10277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_flush_super_buf_queue(my_obj, ch_id, frame_idx);
10287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
10297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
10307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
10317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
10327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
10337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
10347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
10357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
10367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_start_zsl_snapshot
10377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
10387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: Starts zsl snapshot
10397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
10407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
10417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
10427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
10437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
10447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
10457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
10467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
10477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
10487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_start_zsl_snapshot(uint32_t camera_handle,
10497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t ch_id)
10507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
10517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
10527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
10537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
10547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handler = %d,ch_id = %d",
10557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
10567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
10577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
10587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
10597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
10607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
10617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
10627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_start_zsl_snapshot_ch(my_obj, ch_id);
10637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
10647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
10657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
10667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
10677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
10687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
10697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
10707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
10717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_stop_zsl_snapshot
10727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
10737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: Stops zsl snapshot
10747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
10757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
10767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
10777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
10787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
10797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
10807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
10817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
10827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
10837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_stop_zsl_snapshot(uint32_t camera_handle,
10847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t ch_id)
10857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
10867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
10877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
10887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
10897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handler = %d,ch_id = %d",
10907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
10917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
10927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
10937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
10947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
10957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
10967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
10977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_stop_zsl_snapshot_ch(my_obj, ch_id);
10987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
10997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
11007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
11017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
11027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
11037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
11047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
11057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
11067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_configure_notify_mode
11077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
11087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: Configures channel notification mode
11097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
11107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
11117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
11127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
11137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @notify_mode  : notification mode
11147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
11157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
11167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
11177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
11187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
11197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_configure_notify_mode(uint32_t camera_handle,
11207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                                    uint32_t ch_id,
11217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                                    mm_camera_super_buf_notify_mode_t notify_mode)
11227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
11237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
11247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
11257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
11267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handler = %d,ch_id = %d",
11277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
11287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
11297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
11307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
11317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
11327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
11337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
11347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_config_channel_notify(my_obj, ch_id, notify_mode);
11357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
11367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
11377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
11387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
11397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
11407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
11417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
11427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
11437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_map_buf
11447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
11457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: mapping camera buffer via domain socket to server
11467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
11477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
11487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
11497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf_type     : type of buffer to be mapped. could be following values:
11507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_CAPABILITY
11517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_SETPARM_BUF
11527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_GETPARM_BUF
11537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @fd           : file descriptor of the buffer
11547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @size         : size of the buffer
11557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
11567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
11577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
11587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
11597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
11607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_map_buf(uint32_t camera_handle,
11617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    uint8_t buf_type, int fd, size_t size, void *buffer)
11627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
11637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
11647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
11657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
11667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
11677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
11687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
11697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
11707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
11717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
11727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_map_buf(my_obj, buf_type, fd, size, buffer);
11737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
11747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
11757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
11767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
11777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
11787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
11797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
11807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_map_bufs
11817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
11827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: mapping camera buffer via domain socket to server
11837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
11847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
11857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
11867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf_type     : type of buffer to be mapped. could be following values:
11877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_CAPABILITY
11887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_SETPARM_BUF
11897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_GETPARM_BUF
11907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
11917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
11927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
11937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
11947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
11957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_map_bufs(uint32_t camera_handle,
11967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        const cam_buf_map_type_list *buf_map_list)
11977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
11987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
11997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
12007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
12017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
12027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
12037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
12047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
12057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
12067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
12077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_map_bufs(my_obj, buf_map_list);
12087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
12097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
12107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
12117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
12127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
12137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
12147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
12157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_unmap_buf
12167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
12177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: unmapping camera buffer via domain socket to server
12187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
12197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
12207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
12217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf_type     : type of buffer to be unmapped. could be following values:
12227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_CAPABILITY
12237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_SETPARM_BUF
12247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_GETPARM_BUF
12257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
12267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
12277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
12287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
12297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
12307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_unmap_buf(uint32_t camera_handle,
12317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                        uint8_t buf_type)
12327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
12337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
12347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
12357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
12367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
12377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
12387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
12397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
12407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
12417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
12427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_unmap_buf(my_obj, buf_type);
12437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
12447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
12457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
12467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
12477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
12487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
12497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
12507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_set_stream_parms
12517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
12527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: set parameters per stream
12537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
12547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
12557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
12567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
12577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @s_id         : stream handle
12587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @parms        : ptr to a param struct to be set to server
12597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
12607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
12617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
12627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
12637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : Assume the parms struct buf is already mapped to server via
12647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              domain socket. Corresponding fields of parameters to be set
12657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              are already filled in by upper layer caller.
12667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
12677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_set_stream_parms(uint32_t camera_handle,
12687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               uint32_t ch_id,
12697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               uint32_t s_id,
12707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               cam_stream_parm_buffer_t *parms)
12717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
12727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
12737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
12747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
12757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
12767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
12777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
12787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handle = %d,ch_id = %d,s_id = %d",
12797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id, s_id);
12807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
12817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
12827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
12837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
12847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_set_stream_parms(my_obj, ch_id, s_id, parms);
12857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }else{
12867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
12877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
12887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
12897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
12907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
12917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
12927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
12937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_get_stream_parms
12947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
12957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: get parameters per stream
12967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
12977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
12987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
12997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
13007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @s_id         : stream handle
13017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @parms        : ptr to a param struct to be get from server
13027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
13037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
13047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
13057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
13067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : Assume the parms struct buf is already mapped to server via
13077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              domain socket. Parameters to be get from server are already
13087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              filled in by upper layer caller. After this call, corresponding
13097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              fields of requested parameters will be filled in by server with
13107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              detailed information.
13117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
13127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_get_stream_parms(uint32_t camera_handle,
13137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               uint32_t ch_id,
13147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               uint32_t s_id,
13157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               cam_stream_parm_buffer_t *parms)
13167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
13177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
13187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
13197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
13207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
13217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
13227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
13237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handle = %d,ch_id = %d,s_id = %d",
13247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id, s_id);
13257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
13267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
13277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
13287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
13297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_get_stream_parms(my_obj, ch_id, s_id, parms);
13307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }else{
13317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
13327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
13337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
13347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
13357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
13367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
13377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
13387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
13397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_map_stream_buf
13407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
13417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: mapping stream buffer via domain socket to server
13427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
13437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
13447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
13457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
13467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @s_id         : stream handle
13477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf_type     : type of buffer to be mapped. could be following values:
13487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_STREAM_BUF
13497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_STREAM_INFO
13507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
13517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf_idx      : index of buffer within the stream buffers, only valid if
13527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or
13537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
13547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @plane_idx    : plane index. If all planes share the same fd,
13557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   plane_idx = -1; otherwise, plean_idx is the
13567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   index to plane (0..num_of_planes)
13577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @fd           : file descriptor of the buffer
13587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @size         : size of the buffer
13597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
13607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
13617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
13627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
13637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
13647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_map_stream_buf(uint32_t camera_handle,
13657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t ch_id, uint32_t stream_id, uint8_t buf_type,
13667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t buf_idx, int32_t plane_idx, int fd,
13677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        size_t size, void *buffer)
13687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
13697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
13707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
13717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
13727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
13737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
13747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
13757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handle = %d, ch_id = %d, s_id = %d, buf_idx = %d, plane_idx = %d",
13767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id, stream_id, buf_idx, plane_idx);
13777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
13787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
13797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
13807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
13817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_map_stream_buf(my_obj, ch_id, stream_id,
13827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                      buf_type, buf_idx, plane_idx,
13837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                      fd, size, buffer);
13847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }else{
13857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
13867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
13877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
13887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
13897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
13907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
13917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
13927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
13937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_map_stream_bufs
13947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
13957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: mapping stream buffers via domain socket to server
13967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
13977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
13987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
13997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
14007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf_map_list : list of buffers to be mapped
14017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
14027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
14037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
14047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
14057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
14067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_map_stream_bufs(uint32_t camera_handle,
14077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                              uint32_t ch_id,
14087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                              const cam_buf_map_type_list *buf_map_list)
14097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
14107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
14117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
14127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
14137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
14147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
14157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
14167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handle = %d, ch_id = %d",
14177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
14187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
14197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
14207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
14217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
14227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_map_stream_bufs(my_obj, ch_id, buf_map_list);
14237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }else{
14247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
14257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
14267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
14277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
14287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
14297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
14307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
14317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
14327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_unmap_stream_buf
14337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
14347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: unmapping stream buffer via domain socket to server
14357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
14367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
14377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
14387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
14397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @s_id         : stream handle
14407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf_type     : type of buffer to be unmapped. could be following values:
14417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_STREAM_BUF
14427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_STREAM_INFO
14437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
14447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf_idx      : index of buffer within the stream buffers, only valid if
14457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or
14467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
14477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @plane_idx    : plane index. If all planes share the same fd,
14487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   plane_idx = -1; otherwise, plean_idx is the
14497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *                   index to plane (0..num_of_planes)
14507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
14517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
14527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
14537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
14547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
14557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_unmap_stream_buf(uint32_t camera_handle,
14567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               uint32_t ch_id,
14577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               uint32_t stream_id,
14587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               uint8_t buf_type,
14597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               uint32_t buf_idx,
14607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                               int32_t plane_idx)
14617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
14627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
14637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
14647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
14657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
14667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
14677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
14687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handle = %d, ch_id = %d, s_id = %d, buf_idx = %d, plane_idx = %d",
14697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id, stream_id, buf_idx, plane_idx);
14707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
14717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
14727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
14737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
14747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_unmap_stream_buf(my_obj, ch_id, stream_id,
14757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                        buf_type, buf_idx, plane_idx);
14767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }else{
14777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
14787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
14797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
14807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X rc = %d", rc);
14817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
14827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
14837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
14847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
14857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_get_session_id
14867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
14877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: retrieve the session ID from the kernel for this HWI instance
14887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
14897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
14907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
14917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @sessionid: session id to be retrieved from server
14927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
14937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
14947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
14957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
14967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : if this call succeeds, we will get a valid session id.
14977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
14987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_get_session_id(uint32_t camera_handle,
14997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                                                       uint32_t* sessionid)
15007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
15017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
15027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
15037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
15047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
15057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
15067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
15077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
15087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
15097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
15107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        *sessionid = my_obj->sessionid;
15117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&my_obj->cam_lock);
15127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = 0;
15137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
15147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
15157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
15167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
15177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
15187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
15197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
15207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_sync_related_sensors
15217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
15227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: retrieve the session ID from the kernel for this HWI instance
15237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
15247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
15257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
15267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @related_cam_info: pointer to the related cam info to be sent to the server
15277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
15287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
15297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
15307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
15317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE       : if this call succeeds, we will get linking established in back end
15327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
15337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_sync_related_sensors(uint32_t camera_handle,
15347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                              cam_sync_related_sensors_event_info_t* related_cam_info)
15357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
15367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
15377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
15387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
15397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
15407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
15417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
15427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
15437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
15447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
15457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_sync_related_sensors(my_obj, related_cam_info);
15467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
15477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
15487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
15497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
15507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
15517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
15527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
15537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : get_sensor_info
15547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
15557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: get sensor info like facing(back/front) and mount angle
15567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
15577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
15587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
15597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     :
15607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
15617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hevoid get_sensor_info()
15627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
15637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int rc = 0;
15647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int dev_fd = -1;
15657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    struct media_device_info mdev_info;
15667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int num_media_devices = 0;
15677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t num_cameras = 0;
15687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
15697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E");
15707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    while (1) {
15717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        char dev_name[32];
15727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        snprintf(dev_name, sizeof(dev_name), "/dev/media%d", num_media_devices);
15737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        dev_fd = open(dev_name, O_RDWR | O_NONBLOCK);
15747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if (dev_fd < 0) {
15757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGD("Done discovering media devices\n");
15767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            break;
15777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
15787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        num_media_devices++;
15797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        memset(&mdev_info, 0, sizeof(mdev_info));
15807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = ioctl(dev_fd, MEDIA_IOC_DEVICE_INFO, &mdev_info);
15817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if (rc < 0) {
15827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGE("Error: ioctl media_dev failed: %s\n", strerror(errno));
15837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            close(dev_fd);
15847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            dev_fd = -1;
15857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            num_cameras = 0;
15867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            break;
15877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
15887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
15897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if(strncmp(mdev_info.model,  MSM_CONFIGURATION_NAME, sizeof(mdev_info.model)) != 0) {
15907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            close(dev_fd);
15917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            dev_fd = -1;
15927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            continue;
15937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
15947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
15957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        unsigned int num_entities = 1;
15967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        while (1) {
15977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            struct media_entity_desc entity;
15987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            uint32_t temp;
15997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            uint32_t mount_angle;
16007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            uint32_t facing;
16017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            int32_t type = 0;
16027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            uint8_t is_yuv;
16037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
16047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            memset(&entity, 0, sizeof(entity));
16057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            entity.id = num_entities++;
16067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            rc = ioctl(dev_fd, MEDIA_IOC_ENUM_ENTITIES, &entity);
16077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            if (rc < 0) {
16087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                LOGD("Done enumerating media entities\n");
16097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                rc = 0;
16107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                break;
16117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            }
16127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            if(entity.type == MEDIA_ENT_T_V4L2_SUBDEV &&
16137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                entity.group_id == MSM_CAMERA_SUBDEV_SENSOR) {
16147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                temp = entity.flags >> 8;
16157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                mount_angle = (temp & 0xFF) * 90;
16167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                facing = (temp & 0xFF00) >> 8;
16177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                type = ((entity.flags & CAM_SENSOR_TYPE_MASK) ?
16187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                        CAM_TYPE_AUX:CAM_TYPE_MAIN);
16197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                is_yuv = ((entity.flags & CAM_SENSOR_FORMAT_MASK) ?
16207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                        CAM_SENSOR_YUV:CAM_SENSOR_RAW);
16217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                LOGL("index = %u flag = %x mount_angle = %u "
16227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                        "facing = %u type: %u is_yuv = %u\n",
16237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                        (unsigned int)num_cameras, (unsigned int)temp,
16247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                        (unsigned int)mount_angle, (unsigned int)facing,
16257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                        (unsigned int)type, (uint8_t)is_yuv);
16267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                g_cam_ctrl.info[num_cameras].facing = (int)facing;
16277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                g_cam_ctrl.info[num_cameras].orientation = (int)mount_angle;
16287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                g_cam_ctrl.cam_type[num_cameras] = type;
16297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                g_cam_ctrl.is_yuv[num_cameras] = is_yuv;
16307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                LOGD("dev_info[id=%zu,name='%s']\n",
16317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                         num_cameras, g_cam_ctrl.video_dev_name[num_cameras]);
16327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                num_cameras++;
16337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                continue;
16347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            }
16357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
16367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        close(dev_fd);
16377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        dev_fd = -1;
16387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
16397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
16407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("num_cameras=%d\n", g_cam_ctrl.num_cam);
16417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return;
16427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
16437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
16447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
16457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : sort_camera_info
16467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
16477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: sort camera info to keep back cameras idx is smaller than front cameras idx
16487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
16497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : number of cameras
16507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
16517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     :
16527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
16537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hevoid sort_camera_info(int num_cam)
16547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
16557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int idx = 0, i;
16567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int8_t is_dual_cam = 0, is_aux_cam_exposed = 0;
16577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    char prop[PROPERTY_VALUE_MAX];
16587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    struct camera_info temp_info[MM_CAMERA_MAX_NUM_SENSORS];
16597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cam_sync_type_t temp_type[MM_CAMERA_MAX_NUM_SENSORS];
16607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cam_sync_mode_t temp_mode[MM_CAMERA_MAX_NUM_SENSORS];
16617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    uint8_t temp_is_yuv[MM_CAMERA_MAX_NUM_SENSORS];
16627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    char temp_dev_name[MM_CAMERA_MAX_NUM_SENSORS][MM_CAMERA_DEV_NAME_LEN];
16637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
16647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    memset(temp_info, 0, sizeof(temp_info));
16657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    memset(temp_dev_name, 0, sizeof(temp_dev_name));
16667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    memset(temp_type, 0, sizeof(temp_type));
16677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    memset(temp_mode, 0, sizeof(temp_mode));
16687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    memset(temp_is_yuv, 0, sizeof(temp_is_yuv));
16697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
16707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    // Signifies whether system has to enable dual camera mode
16717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    memset(prop, 0, sizeof(prop));
16727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    property_get("persist.camera.dual.camera", prop, "0");
16737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    is_dual_cam = atoi(prop);
16747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
16757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    // Signifies whether AUX camera has to be exposed as physical camera
16767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    memset(prop, 0, sizeof(prop));
16777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    property_get("persist.camera.aux.camera", prop, "0");
16787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    is_aux_cam_exposed = atoi(prop);
16797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGI("dualCamera:%d auxCamera %d",
16807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            is_dual_cam, is_aux_cam_exposed);
16817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
16827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    /*
16837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    1. If dual camera is enabled, dont hide any camera here. Further logic to handle AUX
16847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He       cameras is handled in setupLogicalCameras().
16857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    2. If dual camera is not enabled, hide Front camera if AUX camera property is set.
16867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        In such case, application will see only back MAIN and back AUX cameras.
16877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    3. TODO: Need to revisit this logic if front AUX is available.
16887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    */
16897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
16907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    /* firstly save the main back cameras info*/
16917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    for (i = 0; i < num_cam; i++) {
16927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if ((g_cam_ctrl.info[i].facing == CAMERA_FACING_BACK) &&
16937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            (g_cam_ctrl.cam_type[i] == CAM_TYPE_MAIN)) {
16947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            temp_info[idx] = g_cam_ctrl.info[i];
16957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            temp_type[idx] = g_cam_ctrl.cam_type[i];
16967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            temp_mode[idx] = g_cam_ctrl.cam_mode[i];
16977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            temp_is_yuv[idx] = g_cam_ctrl.is_yuv[i];
16987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGD("Found Back Main Camera: i: %d idx: %d", i, idx);
16997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            memcpy(temp_dev_name[idx++],g_cam_ctrl.video_dev_name[i],
17007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                MM_CAMERA_DEV_NAME_LEN);
17017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
17027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
17037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
17047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    /* save the aux back cameras info*/
17057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (is_dual_cam || is_aux_cam_exposed) {
17067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        for (i = 0; i < num_cam; i++) {
17077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            if ((g_cam_ctrl.info[i].facing == CAMERA_FACING_BACK) &&
17087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                (g_cam_ctrl.cam_type[i] == CAM_TYPE_AUX)) {
17097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                temp_info[idx] = g_cam_ctrl.info[i];
17107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                temp_type[idx] = g_cam_ctrl.cam_type[i];
17117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                temp_mode[idx] = g_cam_ctrl.cam_mode[i];
17127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                temp_is_yuv[idx] = g_cam_ctrl.is_yuv[i];
17137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                LOGD("Found Back Aux Camera: i: %d idx: %d", i, idx);
17147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                memcpy(temp_dev_name[idx++],g_cam_ctrl.video_dev_name[i],
17157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                    MM_CAMERA_DEV_NAME_LEN);
17167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            }
17177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
17187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
17197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
17207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (is_dual_cam || !is_aux_cam_exposed) {
17217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        /* then save the front cameras info*/
17227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        for (i = 0; i < num_cam; i++) {
17237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            if ((g_cam_ctrl.info[i].facing == CAMERA_FACING_FRONT) &&
17247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                (g_cam_ctrl.cam_type[i] == CAM_TYPE_MAIN)) {
17257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                temp_info[idx] = g_cam_ctrl.info[i];
17267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                temp_type[idx] = g_cam_ctrl.cam_type[i];
17277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                temp_mode[idx] = g_cam_ctrl.cam_mode[i];
17287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                temp_is_yuv[idx] = g_cam_ctrl.is_yuv[i];
17297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                LOGD("Found Front Main Camera: i: %d idx: %d", i, idx);
17307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                memcpy(temp_dev_name[idx++],g_cam_ctrl.video_dev_name[i],
17317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                    MM_CAMERA_DEV_NAME_LEN);
17327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            }
17337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
17347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
17357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
17367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    //TODO: Need to revisit this logic if front AUX is available.
17377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    /* save the aux front cameras info*/
17387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    for (i = 0; i < num_cam; i++) {
17397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if ((g_cam_ctrl.info[i].facing == CAMERA_FACING_FRONT) &&
17407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            (g_cam_ctrl.cam_type[i] == CAM_TYPE_AUX)) {
17417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            temp_info[idx] = g_cam_ctrl.info[i];
17427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            temp_type[idx] = g_cam_ctrl.cam_type[i];
17437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            temp_mode[idx] = g_cam_ctrl.cam_mode[i];
17447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            temp_is_yuv[idx] = g_cam_ctrl.is_yuv[i];
17457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGD("Found Front Aux Camera: i: %d idx: %d", i, idx);
17467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            memcpy(temp_dev_name[idx++],g_cam_ctrl.video_dev_name[i],
17477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                MM_CAMERA_DEV_NAME_LEN);
17487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
17497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
17507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
17517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (idx <= num_cam) {
17527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        memcpy(g_cam_ctrl.info, temp_info, sizeof(temp_info));
17537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        memcpy(g_cam_ctrl.cam_type, temp_type, sizeof(temp_type));
17547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        memcpy(g_cam_ctrl.cam_mode, temp_mode, sizeof(temp_mode));
17557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        memcpy(g_cam_ctrl.is_yuv, temp_is_yuv, sizeof(temp_is_yuv));
17567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        memcpy(g_cam_ctrl.video_dev_name, temp_dev_name, sizeof(temp_dev_name));
17577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        //Set num cam based on the cameras exposed finally via dual/aux properties.
17587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        g_cam_ctrl.num_cam = idx;
17597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        for (i = 0; i < idx; i++) {
17607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGI("Camera id: %d facing: %d, type: %d is_yuv: %d",
17617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                i, g_cam_ctrl.info[i].facing, g_cam_ctrl.cam_type[i], g_cam_ctrl.is_yuv[i]);
17627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
17637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
17647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGI("Number of cameras %d sorted %d", num_cam, idx);
17657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return;
17667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
17677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
17687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
17697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : get_num_of_cameras
17707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
17717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: get number of cameras
17727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
17737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
17747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
17757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : number of cameras supported
17767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
17777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heuint8_t get_num_of_cameras()
17787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
17797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int rc = 0;
17807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int dev_fd = -1;
17817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    struct media_device_info mdev_info;
17827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int num_media_devices = 0;
17837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int8_t num_cameras = 0;
17847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    char subdev_name[32];
17857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    char prop[PROPERTY_VALUE_MAX];
17867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT
17877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t sd_fd = -1;
17887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    struct sensor_init_cfg_data cfg;
17897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif
17907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
17917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E");
17927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
17937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    property_get("vold.decrypt", prop, "0");
17947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int decrypt = atoi(prop);
17957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (decrypt == 1)
17967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He     return 0;
17977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
17987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
17997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    memset (&g_cam_ctrl, 0, sizeof (g_cam_ctrl));
18007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifndef DAEMON_PRESENT
18017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (mm_camera_load_shim_lib() < 0) {
18027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGE ("Failed to module shim library");
18037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return 0;
18047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
18057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif /* DAEMON_PRESENT */
18067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
18077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    while (1) {
18087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t num_entities = 1U;
18097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        char dev_name[32];
18107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
18117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        snprintf(dev_name, sizeof(dev_name), "/dev/media%d", num_media_devices);
18127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        dev_fd = open(dev_name, O_RDWR | O_NONBLOCK);
18137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if (dev_fd < 0) {
18147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGD("Done discovering media devices\n");
18157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            break;
18167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
18177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        num_media_devices++;
18187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = ioctl(dev_fd, MEDIA_IOC_DEVICE_INFO, &mdev_info);
18197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if (rc < 0) {
18207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGE("Error: ioctl media_dev failed: %s\n", strerror(errno));
18217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            close(dev_fd);
18227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            dev_fd = -1;
18237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            break;
18247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
18257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
18267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if (strncmp(mdev_info.model, MSM_CONFIGURATION_NAME,
18277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          sizeof(mdev_info.model)) != 0) {
18287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            close(dev_fd);
18297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            dev_fd = -1;
18307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            continue;
18317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
18327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
18337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        while (1) {
18347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            struct media_entity_desc entity;
18357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            memset(&entity, 0, sizeof(entity));
18367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            entity.id = num_entities++;
18377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGD("entity id %d", entity.id);
18387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            rc = ioctl(dev_fd, MEDIA_IOC_ENUM_ENTITIES, &entity);
18397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            if (rc < 0) {
18407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                LOGD("Done enumerating media entities");
18417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                rc = 0;
18427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                break;
18437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            }
18447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGD("entity name %s type %d group id %d",
18457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                entity.name, entity.type, entity.group_id);
18467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            if (entity.type == MEDIA_ENT_T_V4L2_SUBDEV &&
18477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                entity.group_id == MSM_CAMERA_SUBDEV_SENSOR_INIT) {
18487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                snprintf(subdev_name, sizeof(dev_name), "/dev/%s", entity.name);
18497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                break;
18507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            }
18517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
18527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        close(dev_fd);
18537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        dev_fd = -1;
18547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
18557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
18567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT
18577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    /* Open sensor_init subdev */
18587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    sd_fd = open(subdev_name, O_RDWR);
18597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (sd_fd < 0) {
18607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGE("Open sensor_init subdev failed");
18617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return FALSE;
18627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
18637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
18647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cfg.cfgtype = CFG_SINIT_PROBE_WAIT_DONE;
18657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cfg.cfg.setting = NULL;
18667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (ioctl(sd_fd, VIDIOC_MSM_SENSOR_INIT_CFG, &cfg) < 0) {
18677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGE("failed");
18687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
18697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    close(sd_fd);
18707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif
18717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
18727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
18737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    num_media_devices = 0;
18747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    while (1) {
18757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t num_entities = 1U;
18767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        char dev_name[32];
18777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
18787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        snprintf(dev_name, sizeof(dev_name), "/dev/media%d", num_media_devices);
18797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        dev_fd = open(dev_name, O_RDWR | O_NONBLOCK);
18807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if (dev_fd < 0) {
18817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGD("Done discovering media devices: %s\n", strerror(errno));
18827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            break;
18837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
18847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        num_media_devices++;
18857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        memset(&mdev_info, 0, sizeof(mdev_info));
18867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = ioctl(dev_fd, MEDIA_IOC_DEVICE_INFO, &mdev_info);
18877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if (rc < 0) {
18887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGE("Error: ioctl media_dev failed: %s\n", strerror(errno));
18897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            close(dev_fd);
18907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            dev_fd = -1;
18917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            num_cameras = 0;
18927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            break;
18937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
18947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
18957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if(strncmp(mdev_info.model, MSM_CAMERA_NAME, sizeof(mdev_info.model)) != 0) {
18967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            close(dev_fd);
18977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            dev_fd = -1;
18987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            continue;
18997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
19007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
19017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        while (1) {
19027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            struct media_entity_desc entity;
19037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            memset(&entity, 0, sizeof(entity));
19047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            entity.id = num_entities++;
19057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            rc = ioctl(dev_fd, MEDIA_IOC_ENUM_ENTITIES, &entity);
19067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            if (rc < 0) {
19077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                LOGD("Done enumerating media entities\n");
19087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                rc = 0;
19097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                break;
19107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            }
19117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            if(entity.type == MEDIA_ENT_T_DEVNODE_V4L && entity.group_id == QCAMERA_VNODE_GROUP_ID) {
19127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                strlcpy(g_cam_ctrl.video_dev_name[num_cameras],
19137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                     entity.name, sizeof(entity.name));
19147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                LOGI("dev_info[id=%d,name='%s']\n",
19157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                    (int)num_cameras, g_cam_ctrl.video_dev_name[num_cameras]);
19167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                num_cameras++;
19177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                break;
19187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            }
19197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
19207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        close(dev_fd);
19217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        dev_fd = -1;
19227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        if (num_cameras >= MM_CAMERA_MAX_NUM_SENSORS) {
19237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            LOGW("Maximum number of camera reached %d", num_cameras);
19247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            break;
19257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        }
19267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
19277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    g_cam_ctrl.num_cam = num_cameras;
19287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
19297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    get_sensor_info();
19307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    sort_camera_info(g_cam_ctrl.num_cam);
19317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    /* unlock the mutex */
19327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_unlock(&g_intf_lock);
19337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGI("num_cameras=%d\n", (int)g_cam_ctrl.num_cam);
19347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return(uint8_t)g_cam_ctrl.num_cam;
19357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
19367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
19377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
19387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_process_advanced_capture
19397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
19407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: Configures channel advanced capture mode
19417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
19427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
19437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
19447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @type : advanced capture type
19457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
19467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @trigger  : 1 for start and 0 for cancel/stop
19477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @value  : input capture configaration
19487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
19497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
19507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
19517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              -1 -- failure
19527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
19537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_process_advanced_capture(uint32_t camera_handle,
19547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t ch_id, mm_camera_advanced_capture_t type,
19557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        int8_t trigger, void *in_value)
19567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
19577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
19587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
19597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
19607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_handler = %d,ch_id = %d",
19617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
19627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
19637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
19647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
19657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
19667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
19677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
19687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_channel_advanced_capture(my_obj, ch_id, type,
19697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                (uint32_t)trigger, in_value);
19707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
19717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
19727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
19737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("X ");
19747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
19757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
19767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
19777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
19787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_intf_register_stream_buf_cb
19797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
19807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: Register special callback for stream buffer
19817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
19827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
19837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_handle: camera handle
19847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @ch_id        : channel handle
19857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @stream_id    : stream handle
19867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf_cb       : callback function
19877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @buf_type     :SYNC/ASYNC
19887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @userdata     : userdata pointer
19897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
19907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
19917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
19927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              1 -- failure
19937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
19947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic int32_t mm_camera_intf_register_stream_buf_cb(uint32_t camera_handle,
19957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        uint32_t ch_id, uint32_t stream_id, mm_camera_buf_notify_t buf_cb,
19967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        mm_camera_stream_cb_type cb_type, void *userdata)
19977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
19987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = 0;
19997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t * my_obj = NULL;
20007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
20017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E handle = %u ch_id = %u",
20027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He          camera_handle, ch_id);
20037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
20047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
20057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    my_obj = mm_camera_util_get_camera_by_handler(camera_handle);
20067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
20077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(my_obj) {
20087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_lock(&my_obj->cam_lock);
20097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
20107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = mm_camera_reg_stream_buf_cb(my_obj, ch_id, stream_id,
20117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                buf_cb, cb_type, userdata);
20127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
20137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
20147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
20157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return (int32_t)rc;
20167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
20177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
20187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestruct camera_info *get_cam_info(uint32_t camera_id, cam_sync_type_t *pCamType)
20197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
20207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    *pCamType = g_cam_ctrl.cam_type[camera_id];
20217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return &g_cam_ctrl.info[camera_id];
20227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
20237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
20247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heuint8_t is_yuv_sensor(uint32_t camera_id)
20257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
20267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return g_cam_ctrl.is_yuv[camera_id];
20277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
20287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
20297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/* camera ops v-table */
20307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic mm_camera_ops_t mm_camera_ops = {
20317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .query_capability = mm_camera_intf_query_capability,
20327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .register_event_notify = mm_camera_intf_register_event_notify,
20337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .close_camera = mm_camera_intf_close,
20347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .set_parms = mm_camera_intf_set_parms,
20357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .get_parms = mm_camera_intf_get_parms,
20367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .do_auto_focus = mm_camera_intf_do_auto_focus,
20377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .cancel_auto_focus = mm_camera_intf_cancel_auto_focus,
20387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .prepare_snapshot = mm_camera_intf_prepare_snapshot,
20397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .start_zsl_snapshot = mm_camera_intf_start_zsl_snapshot,
20407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .stop_zsl_snapshot = mm_camera_intf_stop_zsl_snapshot,
20417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .map_buf = mm_camera_intf_map_buf,
20427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .map_bufs = mm_camera_intf_map_bufs,
20437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .unmap_buf = mm_camera_intf_unmap_buf,
20447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .add_channel = mm_camera_intf_add_channel,
20457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .delete_channel = mm_camera_intf_del_channel,
20467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .get_bundle_info = mm_camera_intf_get_bundle_info,
20477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .add_stream = mm_camera_intf_add_stream,
20487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .link_stream = mm_camera_intf_link_stream,
20497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .delete_stream = mm_camera_intf_del_stream,
20507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .config_stream = mm_camera_intf_config_stream,
20517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .qbuf = mm_camera_intf_qbuf,
20527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .cancel_buffer = mm_camera_intf_cancel_buf,
20537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .get_queued_buf_count = mm_camera_intf_get_queued_buf_count,
20547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .map_stream_buf = mm_camera_intf_map_stream_buf,
20557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .map_stream_bufs = mm_camera_intf_map_stream_bufs,
20567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .unmap_stream_buf = mm_camera_intf_unmap_stream_buf,
20577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .set_stream_parms = mm_camera_intf_set_stream_parms,
20587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .get_stream_parms = mm_camera_intf_get_stream_parms,
20597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .start_channel = mm_camera_intf_start_channel,
20607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .stop_channel = mm_camera_intf_stop_channel,
20617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .request_super_buf = mm_camera_intf_request_super_buf,
20627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .cancel_super_buf_request = mm_camera_intf_cancel_super_buf_request,
20637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .flush_super_buf_queue = mm_camera_intf_flush_super_buf_queue,
20647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .configure_notify_mode = mm_camera_intf_configure_notify_mode,
20657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .process_advanced_capture = mm_camera_intf_process_advanced_capture,
20667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .get_session_id = mm_camera_intf_get_session_id,
20677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .sync_related_sensors = mm_camera_intf_sync_related_sensors,
20687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .flush = mm_camera_intf_flush,
20697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    .register_stream_buf_cb = mm_camera_intf_register_stream_buf_cb
20707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He};
20717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
20727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
20737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : camera_open
20747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
20757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: open a camera by camera index
20767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
20777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
20787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_idx  : camera index. should within range of 0 to num_of_cameras
20797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @camera_vtbl : ptr to a virtual table containing camera handle and operation table.
20807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
20817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
20827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
20837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              non-zero error code -- failure
20847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
20857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t camera_open(uint8_t camera_idx, mm_camera_vtbl_t **camera_vtbl)
20867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
20877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = 0;
20887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t *cam_obj = NULL;
20897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
20907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef QCAMERA_REDEFINE_LOG
20917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_set_dbg_log_properties();
20927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif
20937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
20947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E camera_idx = %d\n", camera_idx);
20957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (camera_idx >= g_cam_ctrl.num_cam) {
20967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGE("Invalid camera_idx (%d)", camera_idx);
20977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return -EINVAL;
20987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
20997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
21007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
21017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    /* opened already */
21027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(NULL != g_cam_ctrl.cam_obj[camera_idx]) {
21037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        /* Add reference */
21047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        g_cam_ctrl.cam_obj[camera_idx]->ref_count++;
21057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
21067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGD("opened alreadyn");
21077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        *camera_vtbl = &g_cam_ctrl.cam_obj[camera_idx]->vtbl;
21087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return rc;
21097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
21107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
21117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cam_obj = (mm_camera_obj_t *)malloc(sizeof(mm_camera_obj_t));
21127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(NULL == cam_obj) {
21137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
21147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGE("no mem");
21157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return -EINVAL;
21167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
21177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
21187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    /* initialize camera obj */
21197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    memset(cam_obj, 0, sizeof(mm_camera_obj_t));
21207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cam_obj->ctrl_fd = -1;
21217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cam_obj->ds_fd = -1;
21227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cam_obj->ref_count++;
21237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cam_obj->my_hdl = mm_camera_util_generate_handler(camera_idx);
21247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cam_obj->vtbl.camera_handle = cam_obj->my_hdl; /* set handler */
21257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cam_obj->vtbl.ops = &mm_camera_ops;
21267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_init(&cam_obj->cam_lock, NULL);
21277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    /* unlock global interface lock, if not, in dual camera use case,
21287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He      * current open will block operation of another opened camera obj*/
21297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&cam_obj->cam_lock);
21307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_unlock(&g_intf_lock);
21317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
21327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    rc = mm_camera_open(cam_obj);
21337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
21347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_mutex_lock(&g_intf_lock);
21357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (rc != 0) {
21367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGE("mm_camera_open err = %d", rc);
21377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_destroy(&cam_obj->cam_lock);
21387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        g_cam_ctrl.cam_obj[camera_idx] = NULL;
21397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        free(cam_obj);
21407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        cam_obj = NULL;
21417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
21427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        *camera_vtbl = NULL;
21437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return rc;
21447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } else {
21457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGD("Open succeded\n");
21467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        g_cam_ctrl.cam_obj[camera_idx] = cam_obj;
21477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        pthread_mutex_unlock(&g_intf_lock);
21487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        *camera_vtbl = &cam_obj->vtbl;
21497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return 0;
21507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
21517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
21527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
21537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
21547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_load_shim_lib
21557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
21567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: Load shim layer library
21577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
21587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
21597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
21607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : status of load shim library
21617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
21627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_load_shim_lib()
21637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
21647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    const char* error = NULL;
21657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void *qdaemon_lib = NULL;
21667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
21677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("E");
21687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    qdaemon_lib = dlopen(SHIMLAYER_LIB, RTLD_NOW);
21697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (!qdaemon_lib) {
21707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        error = dlerror();
21717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGE("dlopen failed with error %s", error ? error : "");
21727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return -1;
21737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
21747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
21757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    *(void **)&mm_camera_shim_module_init =
21767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            dlsym(qdaemon_lib, "mct_shimlayer_process_module_init");
21777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (!mm_camera_shim_module_init) {
21787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        error = dlerror();
21797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGE("dlsym failed with error code %s", error ? error: "");
21807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        dlclose(qdaemon_lib);
21817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return -1;
21827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
21837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
21847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return mm_camera_shim_module_init(&g_cam_ctrl.cam_shim_ops);
21857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
21867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
21877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
21887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_module_open_session
21897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
21907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: wrapper function to call shim layer API to open session.
21917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
21927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
21937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @sessionid  : sessionID to open session
21947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @evt_cb     : Event callback function
21957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
21967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
21977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
21987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              non-zero error code -- failure
21997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
22007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hecam_status_t mm_camera_module_open_session(int sessionid,
22017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        mm_camera_shim_event_handler_func evt_cb)
22027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
22037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    cam_status_t rc = -1;
22047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(g_cam_ctrl.cam_shim_ops.mm_camera_shim_open_session) {
22057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = g_cam_ctrl.cam_shim_ops.mm_camera_shim_open_session(
22067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He                sessionid, evt_cb);
22077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
22087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
22097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
22107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
22117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
22127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_module_close_session
22137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
22147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: wrapper function to call shim layer API to close session
22157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
22167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
22177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @sessionid  : sessionID to open session
22187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
22197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
22207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
22217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              non-zero error code -- failure
22227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
22237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_module_close_session(int session)
22247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
22257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
22267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(g_cam_ctrl.cam_shim_ops.mm_camera_shim_close_session) {
22277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = g_cam_ctrl.cam_shim_ops.mm_camera_shim_close_session(session);
22287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
22297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
22307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
22317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
22327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
22337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_module_open_session
22347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
22357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: wrapper function to call shim layer API
22367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
22377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
22387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @sessionid  : sessionID to open session
22397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *   @evt_cb     : Event callback function
22407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
22417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : int32_t type of status
22427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              0  -- success
22437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *              non-zero error code -- failure
22447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
22457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_module_send_cmd(cam_shim_packet_t *event)
22467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
22477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int32_t rc = -1;
22487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if(g_cam_ctrl.cam_shim_ops.mm_camera_shim_send_cmd) {
22497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        rc = g_cam_ctrl.cam_shim_ops.mm_camera_shim_send_cmd(event);
22507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
22517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    return rc;
22527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
22537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
22547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*===========================================================================
22557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION   : mm_camera_module_event_handler
22567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
22577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: call back function for shim layer
22587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
22597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS :
22607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
22617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN     : status of call back function
22627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/
22637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint mm_camera_module_event_handler(uint32_t session_id, cam_event_t *event)
22647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
22657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (!event) {
22667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGE("null event");
22677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return FALSE;
22687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
22697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_event_t evt;
22707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
22717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    LOGD("session_id:%d, cmd:0x%x", session_id, event->server_event_type);
22727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    memset(&evt, 0, sizeof(mm_camera_event_t));
22737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
22747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    evt = *event;
22757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    mm_camera_obj_t *my_obj =
22767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He         mm_camera_util_get_camera_by_session_id(session_id);
22777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    if (!my_obj) {
22787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        LOGE("my_obj:%p", my_obj);
22797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        return FALSE;
22807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    }
22817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    switch( evt.server_event_type) {
22827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He       case CAM_EVENT_TYPE_DAEMON_PULL_REQ:
22837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He       case CAM_EVENT_TYPE_CAC_DONE:
22847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He       case CAM_EVENT_TYPE_DAEMON_DIED:
22857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He       case CAM_EVENT_TYPE_INT_TAKE_JPEG:
22867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He       case CAM_EVENT_TYPE_INT_TAKE_RAW:
22877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He           mm_camera_enqueue_evt(my_obj, &evt);
22887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He           break;
22897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He       default:
22907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He           LOGE("cmd:%x from shim layer is not handled", evt.server_event_type);
22917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He           break;
22927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He   }
22937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He   return TRUE;
22947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}
22957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2296