Camera.cpp revision ed6b8a771038acdb08a6c55abfe563d75acb63fa
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> 187ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray#include <pthread.h> 197ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 20ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray//#define LOG_NDEBUG 0 217ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray#define LOG_TAG "Camera" 227ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray#include <cutils/log.h> 237ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 24ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray#define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL) 25ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray#include <cutils/trace.h> 26ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray 277ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray#include "Camera.h" 287ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 297ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Raynamespace default_camera_hal { 307ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 317ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Rayextern "C" { 327ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray// Shim passed to the framework to close an opened device. 337ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Raystatic int close_device(hw_device_t* dev) 347ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{ 357ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray camera2_device_t* cam_dev = reinterpret_cast<camera2_device_t*>(dev); 367ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray Camera* cam = static_cast<Camera*>(cam_dev->priv); 377ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return cam->close(); 387ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} 397ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} // extern "C" 407ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 417ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex RayCamera::Camera(int id, const hw_module_t* module) 427ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray : mId(id), 437ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray mBusy(false), 447ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray mMetadata(NULL) 457ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{ 467ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray pthread_mutex_init(&mMutex, 477ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray NULL); // No pthread mutex attributes. 487ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 497ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray // TODO: fill in device operations function pointers 507ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray mDevice.common.tag = HARDWARE_DEVICE_TAG; 517ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray mDevice.common.module = const_cast<hw_module_t*>(module); 527ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray mDevice.common.close = close_device; 537ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray mDevice.priv = this; 547ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} 557ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 567ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex RayCamera::~Camera() 577ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{ 587ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} 597ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 607ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Rayint Camera::open() 617ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{ 627ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray ALOGV("%s: camera id %d", __func__, mId); 63ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray ATRACE_BEGIN("open"); 647ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray pthread_mutex_lock(&mMutex); 657ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray if (mBusy) { 667ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray pthread_mutex_unlock(&mMutex); 67ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray ATRACE_END(); 687ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray ALOGE("%s:id%d: Error, device already in use.", __func__, mId); 697ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return -EBUSY; 707ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray } 717ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 727ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray // TODO: open camera dev nodes, etc 737ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray mBusy = true; 747ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 757ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray pthread_mutex_unlock(&mMutex); 76ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray ATRACE_END(); 777ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return 0; 787ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} 797ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 807ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Rayint Camera::close() 817ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{ 827ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray ALOGV("%s: camera id %d", __func__, mId); 83ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray ATRACE_BEGIN("close"); 847ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray pthread_mutex_lock(&mMutex); 857ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray if (!mBusy) { 867ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray pthread_mutex_unlock(&mMutex); 87ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray ATRACE_END(); 887ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray ALOGE("%s:id%d: Error, close() on not open device.", __func__, mId); 897ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return -EINVAL; 907ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray } 917ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 927ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray // TODO: close camera dev nodes, etc 937ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray mBusy = false; 947ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 957ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray pthread_mutex_unlock(&mMutex); 96ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray ATRACE_END(); 977ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return 0; 987ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} 997ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 1007ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Rayint Camera::getCameraInfo(struct camera_info* info) 1017ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{ 1027ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray ALOGV("%s: camera id %d: info=%p", __func__, mId, info); 1037ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray init(); 1047ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray if (mMetadata == NULL) { 1057ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray ALOGE("%s:id%d: unable to initialize metadata.", __func__, mId); 1067ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return -ENOENT; 1077ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray } 1087ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 1097ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray // TODO: fill remainder of info struct 1107ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray info->static_camera_characteristics = mMetadata; 1117ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 1127ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return 0; 1137ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} 1147ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 1157ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Rayvoid Camera::init() 1167ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{ 117ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray ATRACE_BEGIN("init"); 1187ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray pthread_mutex_lock(&mMutex); 1197ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray if (mMetadata != NULL) { 1207ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray pthread_mutex_unlock(&mMutex); 121ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray ATRACE_END(); 1227ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray return; 1237ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray } 1247ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 1257ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray // TODO: init metadata, dummy value for now 1267ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray mMetadata = allocate_camera_metadata(1,1); 1277ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 1287ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray pthread_mutex_unlock(&mMutex); 129ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray ATRACE_END(); 1307ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} 1317ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray 1327ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} // namespace default_camera_hal 133