Camera.cpp revision 3cf613507f1e2f7bd932d921a6e222e426fd3be4
13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/* 23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Copyright (C) 2008, The Android Open Source Project 43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Copyright (C) 2008 HTC Inc. 53cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 63cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License"); 73cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** you may not use this file except in compliance with the License. 83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** You may obtain a copy of the License at 93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Unless required by applicable law or agreed to in writing, software 133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS, 143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** See the License for the specific language governing permissions and 163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** limitations under the License. 173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian*/ 183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian//#define LOG_NDEBUG 0 203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#define LOG_TAG "Camera" 213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/Log.h> 223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/threads.h> 233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IServiceManager.h> 253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IMemory.h> 263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/Camera.h> 283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/ICameraService.h> 293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/Surface.h> 313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android { 333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// client singleton for camera service binder interface 353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianMutex Camera::mLock; 363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<ICameraService> Camera::mCameraService; 373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<Camera::DeathNotifier> Camera::mDeathNotifier; 383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// establish binder interface to camera service 403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst sp<ICameraService>& Camera::getCameraService() 413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Mutex::Autolock _l(mLock); 433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (mCameraService.get() == 0) { 443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<IServiceManager> sm = defaultServiceManager(); 453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<IBinder> binder; 463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian do { 473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian binder = sm->getService(String16("media.camera")); 483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (binder != 0) 493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian break; 503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGW("CameraService not published, waiting..."); 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian usleep(500000); // 0.5 s 523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } while(true); 533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (mDeathNotifier == NULL) { 543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mDeathNotifier = new DeathNotifier(); 553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian binder->linkToDeath(mDeathNotifier); 573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mCameraService = interface_cast<ICameraService>(binder); 583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGE_IF(mCameraService==0, "no CameraService!?"); 603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return mCameraService; 613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// --------------------------------------------------------------------------- 643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianCamera::Camera() 663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian init(); 683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// construct a camera client from an existing camera remote 713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<Camera> Camera::create(const sp<ICamera>& camera) 723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("create"); 743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (camera == 0) { 753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGE("camera remote is a NULL pointer"); 763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return 0; 773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<Camera> c = new Camera(); 803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (camera->connect(c) == NO_ERROR) { 813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->mStatus = NO_ERROR; 823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->mCamera = camera; 833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian camera->asBinder()->linkToDeath(c); 843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c; 863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::init() 893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mStatus = UNKNOWN_ERROR; 913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianCamera::~Camera() 943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian disconnect(); 963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<Camera> Camera::connect() 993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("connect"); 1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<Camera> c = new Camera(); 1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian const sp<ICameraService>& cs = getCameraService(); 1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (cs != 0) { 1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->mCamera = cs->connect(c); 1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 1063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c->mCamera != 0) { 1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->mCamera->asBinder()->linkToDeath(c); 1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->mStatus = NO_ERROR; 1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } else { 1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c.clear(); 1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c; 1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::disconnect() 1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("disconnect"); 1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (mCamera != 0) { 1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mCamera->disconnect(); 1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mCamera = 0; 1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::reconnect() 1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("reconnect"); 1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->connect(this); 1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<ICamera> Camera::remote() 1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return mCamera; 1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::lock() 1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->lock(); 1423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::unlock() 1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->unlock(); 1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// pass the buffered ISurface to the camera service 1523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setPreviewDisplay(const sp<Surface>& surface) 1533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("setPreviewDisplay"); 1553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (surface != 0) { 1583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->setPreviewDisplay(surface->getISurface()); 1593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } else { 1603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGD("app passed NULL surface"); 1613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->setPreviewDisplay(0); 1623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 1633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setPreviewDisplay(const sp<ISurface>& surface) 1663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("setPreviewDisplay"); 1683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (surface == 0) { 1693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGD("app passed NULL surface"); 1703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 1713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->setPreviewDisplay(surface); 1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// start preview mode 1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startPreview() 1793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("startPreview"); 1813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->startPreview(); 1843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// start recording mode, must call setPreviewDisplay first 1873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startRecording() 1883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("startRecording"); 1903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->startRecording(); 1933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop preview mode 1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopPreview() 1973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("stopPreview"); 1993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->stopPreview(); 2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop recording mode 2053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopRecording() 2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("stopRecording"); 2083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 2103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->stopRecording(); 2113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// release a recording frame 2143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::releaseRecordingFrame(const sp<IMemory>& mem) 2153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("releaseRecordingFrame"); 2173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 2193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->releaseRecordingFrame(mem); 2203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview state 2233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::previewEnabled() 2243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("previewEnabled"); 2263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return false; 2283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->previewEnabled(); 2293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get recording state 2323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::recordingEnabled() 2333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("recordingEnabled"); 2353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return false; 2373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->recordingEnabled(); 2383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::autoFocus() 2413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("autoFocus"); 2433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->autoFocus(); 2463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::cancelAutoFocus() 2493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("cancelAutoFocus"); 2513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->cancelAutoFocus(); 2543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// take a picture 2573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::takePicture() 2583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("takePicture"); 2603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->takePicture(); 2633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// set preview/capture parameters - key/value pairs 2663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setParameters(const String8& params) 2673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("setParameters"); 2693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->setParameters(params); 2723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview/capture parameters - key/value pairs 2753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianString8 Camera::getParameters() const 2763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("getParameters"); 2783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian String8 params; 2793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c != 0) params = mCamera->getParameters(); 2813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return params; 2823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// send command to camera driver 2853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) 2863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("sendCommand"); 2883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->sendCommand(cmd, arg1, arg2); 2913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setListener(const sp<CameraListener>& listener) 2943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Mutex::Autolock _l(mLock); 2963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mListener = listener; 2973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setPreviewCallbackFlags(int flag) 3003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 3013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("setPreviewCallbackFlags"); 3023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 3033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 3043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mCamera->setPreviewCallbackFlag(flag); 3053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service 3083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 3093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 3103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<CameraListener> listener; 3113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 3123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Mutex::Autolock _l(mLock); 3133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian listener = mListener; 3143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 3153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (listener != NULL) { 3163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian listener->notify(msgType, ext1, ext2); 3173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 3183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when frame or image is ready 3213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr) 3223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 3233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<CameraListener> listener; 3243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 3253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Mutex::Autolock _l(mLock); 3263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian listener = mListener; 3273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 3283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (listener != NULL) { 3293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian listener->postData(msgType, dataPtr); 3303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 3313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when timestamped frame is ready 3343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) 3353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 3363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<CameraListener> listener; 3373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 3383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Mutex::Autolock _l(mLock); 3393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian listener = mListener; 3403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 3413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (listener != NULL) { 3423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian listener->postDataTimestamp(timestamp, msgType, dataPtr); 3433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 3443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::binderDied(const wp<IBinder>& who) { 3473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGW("ICamera died"); 3483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0); 3493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::DeathNotifier::binderDied(const wp<IBinder>& who) { 3523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGV("binderDied"); 3533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Mutex::Autolock _l(Camera::mLock); 3543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Camera::mCameraService.clear(); 3553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian LOGW("Camera server died!"); 3563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android 3593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 360