1a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/*
2a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Copyright (c) 2011 Code Aurora Forum. All rights reserved.
3a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang**
4a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Licensed under the Apache License, Version 2.0 (the "License");
5a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** you may not use this file except in compliance with the License.
6a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** You may obtain a copy of the License at
7a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang**
8a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang**     http://www.apache.org/licenses/LICENSE-2.0
9a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang**
10a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Unless required by applicable law or agreed to in writing, software
11a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** distributed under the License is distributed on an "AS IS" BASIS,
12a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** See the License for the specific language governing permissions and
14a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** limitations under the License.
15a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang*/
16a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
17a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/*#error uncomment this for compiler test!*/
18a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
19a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang//#define ALOG_NDEBUG 0
20a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define ALOG_NIDEBUG 0
21a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define LOG_TAG "QCameraHAL"
22a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/Log.h>
23a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/threads.h>
24a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <fcntl.h>
25a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
26a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
27a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* include QCamera Hardware Interface Header*/
28a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include "QCameraHAL.h"
29a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
30a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint HAL_numOfCameras = 0;
31a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangmm_camera_info_t * HAL_camerahandle[MSM_MAX_CAMERA_SENSORS];
32a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangcamera_metadata_t *HAL_staticInfo[MSM_MAX_CAMERA_SENSORS];
33a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
34a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangnamespace android {
35a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* HAL function implementation goes here*/
36a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
37a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/**
38a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * The functions need to be provided by the camera HAL.
39a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *
40a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo()
41a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * and openCameraHardware() is 0 to N-1.
42a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang */
43a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangextern "C" int HAL_getNumberOfCameras()
44a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
45a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* try to query every time we get the call!*/
46a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    uint8_t num_camera = 0;
47a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mm_camera_info_t * handle_base = 0;
48a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: E", __func__);
49a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
50a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    handle_base= camera_query(&num_camera);
51a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
52a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (!handle_base) {
53a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        HAL_numOfCameras = 0;
54a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
55a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    else
56a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    {
57a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        camera_info_t* p_camera_info = NULL;
58a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        HAL_numOfCameras=num_camera;
59a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
60a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGI("Handle base =0x%p",handle_base);
61a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGI("getCameraInfo: numOfCameras = %d", HAL_numOfCameras);
62a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        for(int i = 0; i < HAL_numOfCameras; i++) {
63a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            ALOGI("Handle [%d]=0x%p",i,handle_base+i);
64a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            HAL_camerahandle[i]=handle_base + i;
65a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            p_camera_info = &(HAL_camerahandle[i]->camera_info);
66a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            if (p_camera_info) {
67a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                ALOGI("Camera sensor %d info:", i);
68a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                ALOGI("camera_id: %d", p_camera_info->camera_id);
69a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                ALOGI("modes_supported: %x", p_camera_info->modes_supported);
70a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                ALOGI("position: %d", p_camera_info->position);
71a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                ALOGI("sensor_mount_angle: %d", p_camera_info->sensor_mount_angle);
72a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            }
73a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
74a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
75a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
76a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: X", __func__);
77a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
78a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return HAL_numOfCameras;
79a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
80a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
81a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangextern "C" int HAL_getCameraInfo(int cameraId, struct camera_info* cameraInfo)
82a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
83a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mm_camera_info_t *mm_camer_obj = 0;
84a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: E", __func__);
85a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mm_camera_vtbl_t *p_camera_vtbl=NULL;
86a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    status_t ret;
87a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
88a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (!HAL_numOfCameras || HAL_numOfCameras < cameraId || !cameraInfo)
89a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return INVALID_OPERATION;
90a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    else
91a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mm_camer_obj = HAL_camerahandle[cameraId];
92a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
93a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (!mm_camer_obj)
94a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return INVALID_OPERATION;
95a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    else {
96a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        cameraInfo->facing =
97a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            (FRONT_CAMERA == mm_camer_obj->camera_info.position)?
98a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            CAMERA_FACING_FRONT : CAMERA_FACING_BACK;
99a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
100a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        cameraInfo->orientation = mm_camer_obj->camera_info.sensor_mount_angle;
101a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
102a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
103a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (HAL_staticInfo[cameraId])
104a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        goto end;
105a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
106a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /*
107a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang     * We need to open the camera in order to get the full list of static properties
108a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang     * required in the Google Camera API 2.0
109a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    */
110a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    p_camera_vtbl=camera_open(cameraId, NULL);
111a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
112a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(p_camera_vtbl == NULL) {
113a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("%s:camera_open failed",__func__);
114a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return INVALID_OPERATION;
115a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
116a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    p_camera_vtbl->ops->sync(p_camera_vtbl->camera_handle);
117a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
118a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ret = getStaticInfo(&HAL_staticInfo[cameraId], p_camera_vtbl, true);
119a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (ret != OK) {
120a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("%s: Unable to allocate static info: %s (%d)",
121a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            __FUNCTION__, strerror(-ret), ret);
122a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return ret;
123a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
124a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ret = getStaticInfo(&HAL_staticInfo[cameraId], p_camera_vtbl, false);
125a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (ret != OK) {
126a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("%s: Unable to fill in static info: %s (%d)",
127a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                __FUNCTION__, strerror(-ret), ret);
128a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return ret;
129a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
130a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    p_camera_vtbl->ops->camera_close(p_camera_vtbl->camera_handle);
131a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
132a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangend:
133a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    cameraInfo->device_version = HARDWARE_DEVICE_API_VERSION(2, 0);
134a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    cameraInfo->static_camera_characteristics =
135a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        HAL_staticInfo[cameraId];
136a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
137a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: X", __func__);
138a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return OK;
139a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
140a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
141a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}; // namespace android
142