17ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray/* 27ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * Copyright (C) 2012 The Android Open Source Project 37ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * 47ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * Licensed under the Apache License, Version 2.0 (the "License"); 57ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * you may not use this file except in compliance with the License. 67ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * You may obtain a copy of the License at 77ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * 87ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * http://www.apache.org/licenses/LICENSE-2.0 97ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * 107ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * Unless required by applicable law or agreed to in writing, software 117ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * distributed under the License is distributed on an "AS IS" BASIS, 127ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * See the License for the specific language governing permissions and 147ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * limitations under the License. 157ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray */ 167ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 177ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray#include <cstdlib> 18819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray#include <hardware/camera_common.h> 19819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray#include <hardware/hardware.h> 2061f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray#include "ExampleCamera.h" 217915e97d637df3ebbdb9fda542a2657236361e14Alex Ray#include "VendorTags.h" 227ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 237ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray//#define LOG_NDEBUG 0 24819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray#define LOG_TAG "DefaultCameraHAL" 257ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray#include <cutils/log.h> 267ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 27819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray#define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL) 28819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray#include <cutils/trace.h> 29819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray 30819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray#include "CameraHAL.h" 317ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 327ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray/* 337ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * This file serves as the entry point to the HAL. It contains the module 347ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * structure and functions used by the framework to load and interface to this 357ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * HAL, as well as the handles to the individual camera devices. 367ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray */ 377ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 387ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Raynamespace default_camera_hal { 397ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 40819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray// Default Camera HAL has 2 cameras, front and rear. 41819cfd87bad560fbd89747371088ad35aaef8d43Alex Raystatic CameraHAL gCameraHAL(2); 427915e97d637df3ebbdb9fda542a2657236361e14Alex Ray// Handle containing vendor tag functionality 437915e97d637df3ebbdb9fda542a2657236361e14Alex Raystatic VendorTags gVendorTags; 447ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 45819cfd87bad560fbd89747371088ad35aaef8d43Alex RayCameraHAL::CameraHAL(int num_cameras) 46819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray : mNumberOfCameras(num_cameras), 47819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray mCallbacks(NULL) 48819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray{ 49a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray // Allocate camera array and instantiate camera devices 50a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray mCameras = new Camera*[mNumberOfCameras]; 5161f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray // Rear camera 5261f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray mCameras[0] = new ExampleCamera(0); 5361f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray // Front camera 5461f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray mCameras[1] = new ExampleCamera(1); 55819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray} 567ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 57819cfd87bad560fbd89747371088ad35aaef8d43Alex RayCameraHAL::~CameraHAL() 58819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray{ 5961f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray for (int i = 0; i < mNumberOfCameras; i++) { 60a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray delete mCameras[i]; 61a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray } 62a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray delete [] mCameras; 63819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray} 647ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 65819cfd87bad560fbd89747371088ad35aaef8d43Alex Rayint CameraHAL::getNumberOfCameras() 667ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{ 67819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray ALOGV("%s: %d", __func__, mNumberOfCameras); 68819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray return mNumberOfCameras; 697ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} 707ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 71819cfd87bad560fbd89747371088ad35aaef8d43Alex Rayint CameraHAL::getCameraInfo(int id, struct camera_info* info) 727ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{ 737ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray ALOGV("%s: camera id %d: info=%p", __func__, id, info); 74819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray if (id < 0 || id >= mNumberOfCameras) { 757ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray ALOGE("%s: Invalid camera id %d", __func__, id); 767ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return -ENODEV; 777ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray } 78819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray // TODO: return device-specific static metadata 79b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray return mCameras[id]->getInfo(info); 807ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} 817ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 82819cfd87bad560fbd89747371088ad35aaef8d43Alex Rayint CameraHAL::setCallbacks(const camera_module_callbacks_t *callbacks) 83819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray{ 84819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray ALOGV("%s : callbacks=%p", __func__, callbacks); 85819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray mCallbacks = callbacks; 86819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray return 0; 87819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray} 88819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray 89819cfd87bad560fbd89747371088ad35aaef8d43Alex Rayint CameraHAL::open(const hw_module_t* mod, const char* name, hw_device_t** dev) 907ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{ 917ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray int id; 92819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray char *nameEnd; 937ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 94819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray ALOGV("%s: module=%p, name=%s, device=%p", __func__, mod, name, dev); 95c6bf2f291ddca5e8807268f89733e9f6637b4303Alex Ray if (*name == '\0') { 96c6bf2f291ddca5e8807268f89733e9f6637b4303Alex Ray ALOGE("%s: Invalid camera id name is NULL", __func__); 97c6bf2f291ddca5e8807268f89733e9f6637b4303Alex Ray return -EINVAL; 98c6bf2f291ddca5e8807268f89733e9f6637b4303Alex Ray } 997ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray id = strtol(name, &nameEnd, 10); 100b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray if (*nameEnd != '\0') { 1017ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray ALOGE("%s: Invalid camera id name %s", __func__, name); 1027ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return -EINVAL; 103819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray } else if (id < 0 || id >= mNumberOfCameras) { 1047ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray ALOGE("%s: Invalid camera id %d", __func__, id); 1057ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return -ENODEV; 1067ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray } 107a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray return mCameras[id]->open(mod, dev); 108819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray} 109819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray 110819cfd87bad560fbd89747371088ad35aaef8d43Alex Rayextern "C" { 111819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray 112819cfd87bad560fbd89747371088ad35aaef8d43Alex Raystatic int get_number_of_cameras() 113819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray{ 114819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray return gCameraHAL.getNumberOfCameras(); 115819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray} 116819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray 117819cfd87bad560fbd89747371088ad35aaef8d43Alex Raystatic int get_camera_info(int id, struct camera_info* info) 118819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray{ 119819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray return gCameraHAL.getCameraInfo(id, info); 120819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray} 121819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray 122819cfd87bad560fbd89747371088ad35aaef8d43Alex Raystatic int set_callbacks(const camera_module_callbacks_t *callbacks) 123819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray{ 124819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray return gCameraHAL.setCallbacks(callbacks); 125819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray} 126819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray 1277915e97d637df3ebbdb9fda542a2657236361e14Alex Raystatic int get_tag_count(const vendor_tag_ops_t* ops) 1287915e97d637df3ebbdb9fda542a2657236361e14Alex Ray{ 1297915e97d637df3ebbdb9fda542a2657236361e14Alex Ray return gVendorTags.getTagCount(ops); 1307915e97d637df3ebbdb9fda542a2657236361e14Alex Ray} 1317915e97d637df3ebbdb9fda542a2657236361e14Alex Ray 1327915e97d637df3ebbdb9fda542a2657236361e14Alex Raystatic void get_all_tags(const vendor_tag_ops_t* ops, uint32_t* tag_array) 1337915e97d637df3ebbdb9fda542a2657236361e14Alex Ray{ 1347915e97d637df3ebbdb9fda542a2657236361e14Alex Ray gVendorTags.getAllTags(ops, tag_array); 1357915e97d637df3ebbdb9fda542a2657236361e14Alex Ray} 1367915e97d637df3ebbdb9fda542a2657236361e14Alex Ray 1377915e97d637df3ebbdb9fda542a2657236361e14Alex Raystatic const char* get_section_name(const vendor_tag_ops_t* ops, uint32_t tag) 1387915e97d637df3ebbdb9fda542a2657236361e14Alex Ray{ 1397915e97d637df3ebbdb9fda542a2657236361e14Alex Ray return gVendorTags.getSectionName(ops, tag); 1407915e97d637df3ebbdb9fda542a2657236361e14Alex Ray} 1417915e97d637df3ebbdb9fda542a2657236361e14Alex Ray 1427915e97d637df3ebbdb9fda542a2657236361e14Alex Raystatic const char* get_tag_name(const vendor_tag_ops_t* ops, uint32_t tag) 1437915e97d637df3ebbdb9fda542a2657236361e14Alex Ray{ 1447915e97d637df3ebbdb9fda542a2657236361e14Alex Ray return gVendorTags.getTagName(ops, tag); 1457915e97d637df3ebbdb9fda542a2657236361e14Alex Ray} 1467915e97d637df3ebbdb9fda542a2657236361e14Alex Ray 1477915e97d637df3ebbdb9fda542a2657236361e14Alex Raystatic int get_tag_type(const vendor_tag_ops_t* ops, uint32_t tag) 1487915e97d637df3ebbdb9fda542a2657236361e14Alex Ray{ 1497915e97d637df3ebbdb9fda542a2657236361e14Alex Ray return gVendorTags.getTagType(ops, tag); 1507915e97d637df3ebbdb9fda542a2657236361e14Alex Ray} 1517915e97d637df3ebbdb9fda542a2657236361e14Alex Ray 1527915e97d637df3ebbdb9fda542a2657236361e14Alex Raystatic void get_vendor_tag_ops(vendor_tag_ops_t* ops) 1537915e97d637df3ebbdb9fda542a2657236361e14Alex Ray{ 1547915e97d637df3ebbdb9fda542a2657236361e14Alex Ray ALOGV("%s : ops=%p", __func__, ops); 1557915e97d637df3ebbdb9fda542a2657236361e14Alex Ray ops->get_tag_count = get_tag_count; 1567915e97d637df3ebbdb9fda542a2657236361e14Alex Ray ops->get_all_tags = get_all_tags; 1577915e97d637df3ebbdb9fda542a2657236361e14Alex Ray ops->get_section_name = get_section_name; 1587915e97d637df3ebbdb9fda542a2657236361e14Alex Ray ops->get_tag_name = get_tag_name; 1597915e97d637df3ebbdb9fda542a2657236361e14Alex Ray ops->get_tag_type = get_tag_type; 1607915e97d637df3ebbdb9fda542a2657236361e14Alex Ray} 1617915e97d637df3ebbdb9fda542a2657236361e14Alex Ray 162819cfd87bad560fbd89747371088ad35aaef8d43Alex Raystatic int open_dev(const hw_module_t* mod, const char* name, hw_device_t** dev) 163819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray{ 164819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray return gCameraHAL.open(mod, name, dev); 1657ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} 1667ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 1677ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Raystatic hw_module_methods_t gCameraModuleMethods = { 168819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray open : open_dev 1697ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray}; 1707ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 171bb13a3231d24bf640e7060fee3a18643f7a9f0dbAlex Raycamera_module_t HAL_MODULE_INFO_SYM __attribute__ ((visibility("default"))) = { 1727ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray common : { 1737ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray tag : HARDWARE_MODULE_TAG, 1747915e97d637df3ebbdb9fda542a2657236361e14Alex Ray module_api_version : CAMERA_MODULE_API_VERSION_2_2, 1757ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray hal_api_version : HARDWARE_HAL_API_VERSION, 1767ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray id : CAMERA_HARDWARE_MODULE_ID, 177819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray name : "Default Camera HAL", 1787ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray author : "The Android Open Source Project", 1797ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray methods : &gCameraModuleMethods, 1807ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray dso : NULL, 1817ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray reserved : {0}, 1827ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray }, 1837ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray get_number_of_cameras : get_number_of_cameras, 184819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray get_camera_info : get_camera_info, 1857915e97d637df3ebbdb9fda542a2657236361e14Alex Ray set_callbacks : set_callbacks, 186a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy get_vendor_tag_ops : get_vendor_tag_ops, 187bcdebf37fbf7ab46b3480278f344987c686bbe50Zhijun He open_legacy : NULL, 188301591776ff1fdc6acccce3936e74f87a60f9d9dChien-Yu Chen set_torch_mode : NULL, 189aee4782839de3103ecebca830a6bd49263a37ad3Eino-Ville Talvala init : NULL, 190a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy reserved : {0}, 1917ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray}; 1927ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} // extern "C" 193819cfd87bad560fbd89747371088ad35aaef8d43Alex Ray 1947ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} // namespace default_camera_hal 195