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