1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* 2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/ 3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License. 6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at 7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software 11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and 14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License. 15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @file CameraHal.cpp 19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file maps the Camera Hardware Interface to V4L2. 21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/ 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 249a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu#include <utils/threads.h> 259a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu 26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h" 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraProperties.h" 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "TICameraParameters.h" 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 31f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_DEBUG_VERBOSE 32f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons# define CAMHAL_LOG_MODULE_FUNCTION_NAME LOG_FUNCTION_NAME 33f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#else 34f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons# define CAMHAL_LOG_MODULE_FUNCTION_NAME 35f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 36f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 37f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 38f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti { 39f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera { 40f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 41f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic CameraProperties gCameraProperties; 42f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic CameraHal* gCameraHals[MAX_CAMERAS_SUPPORTED]; 439a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luustatic unsigned int gCamerasOpen = 0; 449a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luustatic android::Mutex gCameraHalDeviceLock; 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic int camera_device_open(const hw_module_t* module, const char* name, 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev hw_device_t** device); 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic int camera_device_close(hw_device_t* device); 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic int camera_get_number_of_cameras(void); 50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic int camera_get_camera_info(int camera_id, struct camera_info *info); 51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic struct hw_module_methods_t camera_module_methods = { 53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev open: camera_device_open 54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 56f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera 57f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti 58f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 59f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevcamera_module_t HAL_MODULE_INFO_SYM = { 61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev common: { 62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tag: HARDWARE_MODULE_TAG, 63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev version_major: 1, 64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev version_minor: 0, 65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev id: CAMERA_HARDWARE_MODULE_ID, 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev name: "TI OMAP CameraHal Module", 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev author: "TI", 68f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons methods: &Ti::Camera::camera_module_methods, 69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev dso: NULL, /* remove compilation warnings */ 70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev reserved: {0}, /* remove compilation warnings */ 71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }, 72f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons get_number_of_cameras: Ti::Camera::camera_get_number_of_cameras, 73f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons get_camera_info: Ti::Camera::camera_get_camera_info, 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 76f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 77f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti { 78f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera { 79f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef struct ti_camera_device { 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_device_t base; 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* TI specific "private" data can go here (base.priv) */ 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int cameraid; 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} ti_camera_device_t; 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************************************************* 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * implementation of camera_device_ops functions 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *******************************************************************/ 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_set_preview_window(struct camera_device * device, 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev struct preview_stream_ops *window) 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 94f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 95f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->setPreviewWindow(window); 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM 110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_set_extended_preview_ops(struct camera_device * device, 111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons preview_stream_extended_ops_t * extendedOps) 112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 115f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!device) { 116f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 119f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t * const tiDevice = reinterpret_cast<ti_camera_device_t*>(device); 120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons gCameraHals[tiDevice->cameraid]->setExtendedPreviewStreamOps(extendedOps); 121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return OK; 123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_set_buffer_source(struct camera_device * device, 126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons struct preview_stream_ops *tapin, 127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons struct preview_stream_ops *tapout) 128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 131f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int rv = -EINVAL; 132f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(!device) 135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return rv; 136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_dev = (ti_camera_device_t*) device; 138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons rv = gCameraHals[ti_dev->cameraid]->setBufferSource(tapin, tapout); 140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return rv; 142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_release_buffer_source(struct camera_device * device, 145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons struct preview_stream_ops *tapin, 146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons struct preview_stream_ops *tapout) 147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int rv = -EINVAL; 151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(!device) 154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return rv; 155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_dev = (ti_camera_device_t*) device; 157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons rv = gCameraHals[ti_dev->cameraid]->releaseBufferSource(tapin, tapout); 159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return rv; 161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_set_callbacks(struct camera_device * device, 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_notify_callback notify_cb, 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_callback data_cb, 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_timestamp_callback data_cb_timestamp, 168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_request_memory get_memory, 169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *user) 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gCameraHals[ti_dev->cameraid]->setCallbacks(notify_cb, data_cb, data_cb_timestamp, get_memory, user); 181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_enable_msg_type(struct camera_device * device, int32_t msg_type) 184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 185f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 187f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gCameraHals[ti_dev->cameraid]->enableMsgType(msg_type); 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_disable_msg_type(struct camera_device * device, int32_t msg_type) 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 199f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 201f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gCameraHals[ti_dev->cameraid]->disableMsgType(msg_type); 209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_msg_type_enabled(struct camera_device * device, int32_t msg_type) 212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 213f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 215f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return 0; 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return gCameraHals[ti_dev->cameraid]->msgTypeEnabled(msg_type); 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_start_preview(struct camera_device * device) 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->startPreview(); 238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_stop_preview(struct camera_device * device) 243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 244f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 246f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gCameraHals[ti_dev->cameraid]->stopPreview(); 254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_preview_enabled(struct camera_device * device) 257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 258f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->previewEnabled(); 269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_store_meta_data_in_buffers(struct camera_device * device, int enable) 273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 274f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // TODO: meta data buffer not current supported 285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->storeMetaDataInBuffers(enable); 286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //return enable ? android::INVALID_OPERATION: android::OK; 288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_start_recording(struct camera_device * device) 291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->startRecording(); 303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_stop_recording(struct camera_device * device) 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 308f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gCameraHals[ti_dev->cameraid]->stopRecording(); 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_recording_enabled(struct camera_device * device) 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 322f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 323f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->recordingEnabled(); 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_release_recording_frame(struct camera_device * device, 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const void *opaque) 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 339f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 341f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gCameraHals[ti_dev->cameraid]->releaseRecordingFrame(opaque); 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_auto_focus(struct camera_device * device) 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 353f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 354f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->autoFocus(); 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_cancel_auto_focus(struct camera_device * device) 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 369f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 370f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->cancelAutoFocus(); 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_take_picture(struct camera_device * device) 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 385f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 386f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 390f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(!device) 391f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return rv; 392f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 393f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_dev = (ti_camera_device_t*) device; 394f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 395f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons rv = gCameraHals[ti_dev->cameraid]->takePicture(0); 396f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return rv; 397f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 398f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 399f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM 400f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_take_picture_with_parameters(struct camera_device * device, const char *params) 401f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 402f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 403f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 404f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int rv = -EINVAL; 405f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 412f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons rv = gCameraHals[ti_dev->cameraid]->takePicture(params); 413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 415f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_cancel_picture(struct camera_device * device) 418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->cancelPicture(); 430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 433f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM 434f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_reprocess(struct camera_device * device, const char *params) 435f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 436f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 437f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 438f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int rv = -EINVAL; 439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 440f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 441f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(!device) 442f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return rv; 443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 444f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_dev = (ti_camera_device_t*) device; 445f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons rv = gCameraHals[ti_dev->cameraid]->reprocess(params); 447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return rv; 448f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 449f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 450f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_cancel_reprocess(struct camera_device * device) 451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 452f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 453f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 457f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(!device) 458f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return rv; 459f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 460f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_dev = (ti_camera_device_t*) device; 461f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 462f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons rv = gCameraHals[ti_dev->cameraid]->cancel_reprocess(); 463f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return rv; 464f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 465f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 467f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_set_parameters(struct camera_device * device, const char *params) 468f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 469f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 470f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 471f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int rv = -EINVAL; 472f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->setParameters(params); 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar* camera_get_parameters(struct camera_device * device) 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 485f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 486f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev char* param = NULL; 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NULL; 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev param = gCameraHals[ti_dev->cameraid]->getParameters(); 496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return param; 498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void camera_put_parameters(struct camera_device *device, char *parms) 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 502f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 504f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gCameraHals[ti_dev->cameraid]->putParameters(parms); 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_send_command(struct camera_device * device, 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int32_t cmd, int32_t arg1, int32_t arg2) 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 517f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 518f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 527f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT 528f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( cmd == CAMERA_CMD_SETUP_EXTENDED_OPERATIONS ) { 529f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons camera_device_extended_ops_t * const ops = static_cast<camera_device_extended_ops_t*>( 530f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons camera_cmd_send_command_args_to_pointer(arg1, arg2)); 531f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 532f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM 533f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ops->set_extended_preview_ops = camera_set_extended_preview_ops; 534f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ops->set_buffer_source = camera_set_buffer_source; 535f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ops->release_buffer_source = camera_release_buffer_source; 536f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ops->take_picture_with_parameters = camera_take_picture_with_parameters; 537f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ops->reprocess = camera_reprocess; 538f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ops->cancel_reprocess = camera_cancel_reprocess; 539f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 540f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 541f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return OK; 542f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 543f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 544f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->sendCommand(cmd, arg1, arg2); 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_release(struct camera_device * device) 550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 551f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 553f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ti_camera_device_t* ti_dev = NULL; 554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gCameraHals[ti_dev->cameraid]->release(); 561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_dump(struct camera_device * device, int fd) 564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 565f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 566f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = -EINVAL; 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!device) 571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = gCameraHals[ti_dev->cameraid]->dump(fd); 576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevextern "C" void heaptracker_free_leaked_memory(void); 580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_device_close(hw_device_t* device) 582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 583f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOG_MODULE_FUNCTION_NAME; 584f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int ret = 0; 586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* ti_dev = NULL; 587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 588f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(gCameraHalDeviceLock); 5899a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu 590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (!device) { 591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto done; 593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_dev = (ti_camera_device_t*) device; 596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 597bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu if (ti_dev) { 598bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu if (gCameraHals[ti_dev->cameraid]) { 599bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu delete gCameraHals[ti_dev->cameraid]; 600bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu gCameraHals[ti_dev->cameraid] = NULL; 601bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu gCamerasOpen--; 602bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu } 603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 604bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu if (ti_dev->base.ops) { 605bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu free(ti_dev->base.ops); 606bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu } 607bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu free(ti_dev); 608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevdone: 610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef HEAPTRACKER 611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev heaptracker_free_leaked_memory(); 612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************************************************* 617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * implementation of camera_module functions 618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *******************************************************************/ 619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* open device handle to one of the cameras 621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * assume camera service will keep singleton of each camera 623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * so this function will always only be called once per camera instance 624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_device_open(const hw_module_t* module, const char* name, 627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev hw_device_t** device) 628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 62973bfc819486d5f632fd113996e6ecdbd647d2085Sundar Raman int rv = 0; 630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int num_cameras = 0; 631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int cameraid; 632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ti_camera_device_t* camera_device = NULL; 633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_device_ops_t* camera_ops = NULL; 634f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraHal* camera = NULL; 635f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraProperties::Properties* properties = NULL; 636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 637f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(gCameraHalDeviceLock); 6389a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu 639e46394481e771dbdc8683645c3740a3d262a3d0fIliyan Malchev CAMHAL_LOGI("camera_device open"); 640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (name != NULL) { 642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev cameraid = atoi(name); 643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev num_cameras = gCameraProperties.camerasSupported(); 644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(cameraid > num_cameras) 646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 647f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("camera service provided cameraid out of bounds, " 648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "cameraid = %d, num supported = %d", 649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev cameraid, num_cameras); 6509a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu rv = -EINVAL; 6519a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu goto fail; 6529a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu } 6539a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu 6549a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu if(gCamerasOpen >= MAX_SIMUL_CAMERAS_SUPPORTED) 6559a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu { 656f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("maximum number of cameras already open"); 6579a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu rv = -ENOMEM; 658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail; 659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_device = (ti_camera_device_t*)malloc(sizeof(*camera_device)); 662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!camera_device) 663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 664f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("camera_device allocation fail"); 665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = -ENOMEM; 666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail; 667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops = (camera_device_ops_t*)malloc(sizeof(*camera_ops)); 670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!camera_ops) 671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 672f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("camera_ops allocation fail"); 673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = -ENOMEM; 674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail; 675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memset(camera_device, 0, sizeof(*camera_device)); 678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memset(camera_ops, 0, sizeof(*camera_ops)); 679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_device->base.common.tag = HARDWARE_DEVICE_TAG; 681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_device->base.common.version = 0; 682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_device->base.common.module = (hw_module_t *)(module); 683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_device->base.common.close = camera_device_close; 684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_device->base.ops = camera_ops; 685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->set_preview_window = camera_set_preview_window; 687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->set_callbacks = camera_set_callbacks; 688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->enable_msg_type = camera_enable_msg_type; 689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->disable_msg_type = camera_disable_msg_type; 690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->msg_type_enabled = camera_msg_type_enabled; 691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->start_preview = camera_start_preview; 692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->stop_preview = camera_stop_preview; 693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->preview_enabled = camera_preview_enabled; 694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->store_meta_data_in_buffers = camera_store_meta_data_in_buffers; 695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->start_recording = camera_start_recording; 696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->stop_recording = camera_stop_recording; 697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->recording_enabled = camera_recording_enabled; 698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->release_recording_frame = camera_release_recording_frame; 699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->auto_focus = camera_auto_focus; 700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->cancel_auto_focus = camera_cancel_auto_focus; 701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->take_picture = camera_take_picture; 702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->cancel_picture = camera_cancel_picture; 703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->set_parameters = camera_set_parameters; 704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->get_parameters = camera_get_parameters; 705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->put_parameters = camera_put_parameters; 706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->send_command = camera_send_command; 707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->release = camera_release; 708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_ops->dump = camera_dump; 709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *device = &camera_device->base.common; 711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // -------- TI specific stuff -------- 713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_device->cameraid = cameraid; 715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(gCameraProperties.getProperties(cameraid, &properties) < 0) 717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 718f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Couldn't get camera properties"); 719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = -ENOMEM; 720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail; 721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 723f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons camera = new CameraHal(cameraid); 724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!camera) 726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 727f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Couldn't create instance of CameraHal class"); 728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = -ENOMEM; 729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail; 730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 732f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(properties && (camera->initialize(properties) != NO_ERROR)) 733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 734f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Couldn't initialize camera instance"); 735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = -ENODEV; 736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail; 737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gCameraHals[cameraid] = camera; 7409a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu gCamerasOpen++; 741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevfail: 746bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu if(camera_device) { 747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev free(camera_device); 748bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu camera_device = NULL; 749bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu } 750bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu if(camera_ops) { 751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev free(camera_ops); 752bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu camera_ops = NULL; 753bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu } 754bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu if(camera) { 755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete camera; 756bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu camera = NULL; 757bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu } 758bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu *device = NULL; 759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_get_number_of_cameras(void) 763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int num_cameras = MAX_CAMERAS_SUPPORTED; 765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // this going to be the first call from camera service 767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // initialize camera properties here... 768f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(gCameraProperties.initialize() != NO_ERROR) 769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Unable to create or initialize CameraProperties"); 771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NULL; 772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev num_cameras = gCameraProperties.camerasSupported(); 775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return num_cameras; 777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_get_camera_info(int camera_id, struct camera_info *info) 780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int rv = 0; 782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int face_value = CAMERA_FACING_BACK; 783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int orientation = 0; 784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *valstr = NULL; 785f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraProperties::Properties* properties = NULL; 786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // this going to be the first call from camera service 788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // initialize camera properties here... 789f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(gCameraProperties.initialize() != NO_ERROR) 790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Unable to create or initialize CameraProperties"); 792f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons rv = -EINVAL; 793f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto end; 794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Get camera properties for camera index 797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(gCameraProperties.getProperties(camera_id, &properties) < 0) 798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 799f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Couldn't get camera properties"); 800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rv = -EINVAL; 801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto end; 802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(properties) 805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 806f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = properties->get(CameraProperties::FACING_INDEX); 807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(valstr != NULL) 808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 809f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(valstr, TICameraParameters::FACING_FRONT) == 0) 810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev face_value = CAMERA_FACING_FRONT; 812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 813f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons else if (strcmp(valstr, TICameraParameters::FACING_BACK) == 0) 814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev face_value = CAMERA_FACING_BACK; 816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 819f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = properties->get(CameraProperties::ORIENTATION_INDEX); 820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(valstr != NULL) 821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev orientation = atoi(valstr); 823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("getProperties() returned a NULL property set for Camera id %d", camera_id); 828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev info->facing = face_value; 831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev info->orientation = orientation; 832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevend: 834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return rv; 835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 838f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera 839f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti 840