/* ** Copyright (c) 2011 The Linux Foundation. All rights reserved. ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ /*#error uncomment this for compiler test!*/ //#define ALOG_NDEBUG 0 #define ALOG_NIDEBUG 0 #define LOG_TAG "QCameraHAL" #include <utils/Log.h> #include <utils/threads.h> #include <fcntl.h> #include <sys/mman.h> /* include QCamera Hardware Interface Header*/ #include "QCameraHAL.h" int HAL_numOfCameras = 0; qcamera_info_t HAL_cameraInfo[MSM_MAX_CAMERA_SENSORS]; mm_camera_t * HAL_camerahandle[MSM_MAX_CAMERA_SENSORS]; int HAL_currentCameraMode; namespace android { /* HAL function implementation goes here*/ /** * The functions need to be provided by the camera HAL. * * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo() * and openCameraHardware() is 0 to N-1. */ extern "C" int HAL_getNumberOfCameras() { /* try to query every time we get the call!*/ uint8_t num_camera = 0; mm_camera_t * handle_base = 0; ALOGV("%s: E", __func__); handle_base= mm_camera_query(&num_camera); if (!handle_base) { HAL_numOfCameras = 0; } else { qcamera_info_t* p_camera_info = 0; HAL_numOfCameras=num_camera; ALOGI("Handle base =0x%p",handle_base); ALOGI("getCameraInfo: numOfCameras = %d", HAL_numOfCameras); for(int i = 0; i < HAL_numOfCameras; i++) { ALOGI("Handle [%d]=0x%p",i,handle_base+i); HAL_camerahandle[i]=handle_base + i; p_camera_info = &(HAL_camerahandle[i]->camera_info); if (p_camera_info) { ALOGI("Camera sensor %d info:", i); ALOGI("camera_id: %d", p_camera_info->camera_id); ALOGI("modes_supported: %x", p_camera_info->modes_supported); ALOGI("position: %d", p_camera_info->position); ALOGI("sensor_mount_angle: %d", p_camera_info->sensor_mount_angle); } } } ALOGV("%s: X", __func__); return HAL_numOfCameras; } extern "C" int HAL_isIn3DMode() { return HAL_currentCameraMode == CAMERA_MODE_3D; } extern "C" void HAL_getCameraInfo(int cameraId, struct CameraInfo* cameraInfo) { mm_camera_t *mm_camer_obj = 0; ALOGV("%s: E", __func__); if (!HAL_numOfCameras || HAL_numOfCameras < cameraId || !cameraInfo) return; else mm_camer_obj = HAL_camerahandle[cameraId]; if (!mm_camer_obj) return; else { cameraInfo->facing = (FRONT_CAMERA == mm_camer_obj->camera_info.position)? CAMERA_FACING_FRONT : CAMERA_FACING_BACK; cameraInfo->orientation = mm_camer_obj->camera_info.sensor_mount_angle; #if 0 // TODO: fix me /* We always supprot ZSL in our stack*/ cameraInfo->mode = CAMERA_SUPPORT_MODE_ZSL; if (mm_camer_obj->camera_info.modes_supported & CAMERA_MODE_2D) { cameraInfo->mode |= CAMERA_SUPPORT_MODE_2D; } if (mm_camer_obj->camera_info.modes_supported & CAMERA_MODE_3D) { cameraInfo->mode |= CAMERA_SUPPORT_MODE_3D; } #endif } ALOGV("%s: X", __func__); return; } /* HAL should return NULL if it fails to open camera hardware. */ extern "C" void * HAL_openCameraHardware(int cameraId, int mode) { ALOGV("%s: E", __func__); if (!HAL_numOfCameras || HAL_numOfCameras < cameraId ||cameraId < 0) { return NULL; } return QCameraHAL_openCameraHardware(cameraId, mode); } }; // namespace android