ProCamera.cpp revision 7b33a74bbc514b99c16be7fff9a34e892bc19264
1634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin/* 2634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 3634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Copyright (C) 2013, The Android Open Source Project 4634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 5634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Licensed under the Apache License, Version 2.0 (the "License"); 6634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** you may not use this file except in compliance with the License. 7634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** You may obtain a copy of the License at 8634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 9634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** http://www.apache.org/licenses/LICENSE-2.0 10634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 11634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Unless required by applicable law or agreed to in writing, software 12634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** distributed under the License is distributed on an "AS IS" BASIS, 13634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** See the License for the specific language governing permissions and 15634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** limitations under the License. 16634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin*/ 17634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 18634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin//#define LOG_NDEBUG 0 19634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#define LOG_TAG "ProCamera" 20634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/Log.h> 21634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/threads.h> 22634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/Mutex.h> 23634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 24634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <binder/IPCThreadState.h> 25634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <binder/IServiceManager.h> 26634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <binder/IMemory.h> 27634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 28634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/ProCamera.h> 29634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/ICameraService.h> 30634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/IProCameraUser.h> 31634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/IProCameraCallbacks.h> 32634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 33634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <gui/IGraphicBufferProducer.h> 34634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <gui/Surface.h> 35634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 36a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#include <system/camera_metadata.h> 37a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin 38634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinnamespace android { 39634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 40634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// client singleton for camera service binder interface 41634a51509ee50475f3e9f8ccf897e90fc72ded31Igor MurashkinMutex ProCamera::mLock; 42634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinsp<ICameraService> ProCamera::mCameraService; 43634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinsp<ProCamera::DeathNotifier> ProCamera::mDeathNotifier; 44634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 45634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// establish binder interface to camera service 46634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinconst sp<ICameraService>& ProCamera::getCameraService() 47634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 48634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Mutex::Autolock _l(mLock); 49634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (mCameraService.get() == 0) { 50634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<IServiceManager> sm = defaultServiceManager(); 51634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<IBinder> binder; 52634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin do { 53634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin binder = sm->getService(String16("media.camera")); 54634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (binder != 0) 55634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin break; 56634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGW("CameraService not published, waiting..."); 57634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin usleep(500000); // 0.5 s 58634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } while(true); 59634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (mDeathNotifier == NULL) { 60634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin mDeathNotifier = new DeathNotifier(); 61634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 62634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin binder->linkToDeath(mDeathNotifier); 63634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin mCameraService = interface_cast<ICameraService>(binder); 64634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 65634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGE_IF(mCameraService==0, "no CameraService!?"); 66634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return mCameraService; 67634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 68634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 69634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinsp<ProCamera> ProCamera::connect(int cameraId) 70634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 71634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGV("connect"); 72634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<ProCamera> c = new ProCamera(); 73634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<IProCameraCallbacks> cl = c; 74634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin const sp<ICameraService>& cs = getCameraService(); 75634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (cs != 0) { 76634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin c->mCamera = cs->connect(cl, cameraId); 77634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 78634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c->mCamera != 0) { 79634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin c->mCamera->asBinder()->linkToDeath(c); 80634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin c->mStatus = NO_ERROR; 81634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } else { 82634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin c.clear(); 83634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 84634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c; 85634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 86634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 87634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::disconnect() 88634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 89634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGV("disconnect"); 90634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (mCamera != 0) { 91634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin mCamera->disconnect(); 92634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin mCamera->asBinder()->unlinkToDeath(this); 93634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin mCamera = 0; 94634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 95634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 96634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 97634a51509ee50475f3e9f8ccf897e90fc72ded31Igor MurashkinProCamera::ProCamera() 98634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 99634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 100634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 101634a51509ee50475f3e9f8ccf897e90fc72ded31Igor MurashkinProCamera::~ProCamera() 102634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 103634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 104634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 105634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 106634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinsp<IProCameraUser> ProCamera::remote() 107634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 108634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return mCamera; 109634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 110634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 111634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::binderDied(const wp<IBinder>& who) { 112634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGW("IProCameraUser died"); 113634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0); 114634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 115634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 116634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::DeathNotifier::binderDied(const wp<IBinder>& who) { 117634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGV("binderDied"); 118634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Mutex::Autolock _l(ProCamera::mLock); 119634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ProCamera::mCameraService.clear(); 120634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGW("Camera service died!"); 121634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 122634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 1235376573eff55f370f041889618c9a7a9e1894615Igor Murashkinvoid ProCamera::setListener(const sp<ProCameraListener>& listener) 1245376573eff55f370f041889618c9a7a9e1894615Igor Murashkin{ 1255376573eff55f370f041889618c9a7a9e1894615Igor Murashkin Mutex::Autolock _l(mLock); 1265376573eff55f370f041889618c9a7a9e1894615Igor Murashkin mListener = listener; 1275376573eff55f370f041889618c9a7a9e1894615Igor Murashkin} 1285376573eff55f370f041889618c9a7a9e1894615Igor Murashkin 129634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 130634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service 131634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 132634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 133634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<ProCameraListener> listener; 134634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 135634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Mutex::Autolock _l(mLock); 136634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener = mListener; 137634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 138634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (listener != NULL) { 139634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener->notify(msgType, ext1, ext2); 140634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 141634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 142634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 143634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service when frame or image is ready 144634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 145634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin camera_frame_metadata_t *metadata) 146634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 147634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<ProCameraListener> listener; 148634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 149634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Mutex::Autolock _l(mLock); 150634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener = mListener; 151634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 152634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (listener != NULL) { 153634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener->postData(msgType, dataPtr, metadata); 154634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 155634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 156634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 157634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service when timestamped frame is ready 158634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, 159634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin const sp<IMemory>& dataPtr) 160634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 161634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<ProCameraListener> listener; 162634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 163634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Mutex::Autolock _l(mLock); 164634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener = mListener; 165634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 166634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (listener != NULL) { 167634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener->postDataTimestamp(timestamp, msgType, dataPtr); 168634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } else { 169634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGW("No listener was set. Drop a recording frame."); 170634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 171634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 172634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 173634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin/* IProCameraUser's implementation */ 174634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 1755376573eff55f370f041889618c9a7a9e1894615Igor Murashkinvoid ProCamera::onLockStatusChanged( 1765376573eff55f370f041889618c9a7a9e1894615Igor Murashkin IProCameraCallbacks::LockStatus newLockStatus) 1775376573eff55f370f041889618c9a7a9e1894615Igor Murashkin{ 1785376573eff55f370f041889618c9a7a9e1894615Igor Murashkin ALOGV("%s: newLockStatus = %d", __FUNCTION__, newLockStatus); 1795376573eff55f370f041889618c9a7a9e1894615Igor Murashkin 1805376573eff55f370f041889618c9a7a9e1894615Igor Murashkin sp<ProCameraListener> listener; 1815376573eff55f370f041889618c9a7a9e1894615Igor Murashkin { 1825376573eff55f370f041889618c9a7a9e1894615Igor Murashkin Mutex::Autolock _l(mLock); 1835376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener = mListener; 1845376573eff55f370f041889618c9a7a9e1894615Igor Murashkin } 1855376573eff55f370f041889618c9a7a9e1894615Igor Murashkin if (listener != NULL) { 1865376573eff55f370f041889618c9a7a9e1894615Igor Murashkin switch (newLockStatus) { 1875376573eff55f370f041889618c9a7a9e1894615Igor Murashkin case IProCameraCallbacks::LOCK_ACQUIRED: 1885376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener->onLockAcquired(); 1895376573eff55f370f041889618c9a7a9e1894615Igor Murashkin break; 1905376573eff55f370f041889618c9a7a9e1894615Igor Murashkin case IProCameraCallbacks::LOCK_RELEASED: 1915376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener->onLockReleased(); 1925376573eff55f370f041889618c9a7a9e1894615Igor Murashkin break; 1935376573eff55f370f041889618c9a7a9e1894615Igor Murashkin case IProCameraCallbacks::LOCK_STOLEN: 1945376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener->onLockStolen(); 1955376573eff55f370f041889618c9a7a9e1894615Igor Murashkin break; 1965376573eff55f370f041889618c9a7a9e1894615Igor Murashkin default: 1975376573eff55f370f041889618c9a7a9e1894615Igor Murashkin ALOGE("%s: Unknown lock status: %d", 1985376573eff55f370f041889618c9a7a9e1894615Igor Murashkin __FUNCTION__, newLockStatus); 1995376573eff55f370f041889618c9a7a9e1894615Igor Murashkin } 2005376573eff55f370f041889618c9a7a9e1894615Igor Murashkin } 2015376573eff55f370f041889618c9a7a9e1894615Igor Murashkin} 2025376573eff55f370f041889618c9a7a9e1894615Igor Murashkin 203a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkinvoid ProCamera::onResultReceived(int32_t frameId, camera_metadata* result) { 204a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin ALOGV("%s: frameId = %d, result = %p", __FUNCTION__, frameId, result); 205a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin 206a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin sp<ProCameraListener> listener; 207a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin { 208a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin Mutex::Autolock _l(mLock); 209a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin listener = mListener; 210a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin } 211a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin if (listener != NULL) { 212a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin listener->onResultReceived(frameId, result); 213a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin } else { 214a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin free_camera_metadata(result); 215a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin } 216a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin 217a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin} 218a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin 219634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveTryLock() 220634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 221634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 222634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 223634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 224634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->exclusiveTryLock(); 225634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 226634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveLock() 227634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 228634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 229634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 230634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 231634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->exclusiveLock(); 232634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 233634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveUnlock() 234634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 235634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 236634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 237634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 238634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->exclusiveUnlock(); 239634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 240634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinbool ProCamera::hasExclusiveLock() 241634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 242634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 243634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 244634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 245634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->hasExclusiveLock(); 246634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 247634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 248634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// Note that the callee gets a copy of the metadata. 249634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinint ProCamera::submitRequest(const struct camera_metadata* metadata, 250634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin bool streaming) 251634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 252634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 253634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 254634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 255634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->submitRequest(const_cast<struct camera_metadata*>(metadata), 256634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin streaming); 257634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 258634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 259634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::cancelRequest(int requestId) 260634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 261634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 262634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 263634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 264634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->cancelRequest(requestId); 265634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 266634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 2675835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkinstatus_t ProCamera::deleteStream(int streamId) 268634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 269634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 270634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 271634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 2725835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin status_t s = c->cancelStream(streamId); 2735835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 2745835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin mStreams.removeItem(streamId); 275634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 2765835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return s; 277634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 278634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 27968506fd58d26748617babe94d5648503cb3690bbIgor Murashkinstatus_t ProCamera::createStream(int width, int height, int format, 280985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin const sp<Surface>& surface, 28168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin /*out*/ 28268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin int* streamId) 28368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin{ 28468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin *streamId = -1; 28568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 28668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: createStreamW %dx%d (fmt=0x%x)", __FUNCTION__, width, height, 28768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin format); 28868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 289985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin if (surface == 0) { 29068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin return BAD_VALUE; 29168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin } 29268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 2935835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return createStream(width, height, format, surface->getIGraphicBufferProducer(), 2945835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin streamId); 29568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 29668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 29768506fd58d26748617babe94d5648503cb3690bbIgor Murashkinstatus_t ProCamera::createStream(int width, int height, int format, 29868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin const sp<IGraphicBufferProducer>& bufferProducer, 29968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin /*out*/ 30068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin int* streamId) { 3015835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin *streamId = -1; 30268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 30368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: createStreamT %dx%d (fmt=0x%x)", __FUNCTION__, width, height, 30468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin format); 30568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 3065835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (bufferProducer == 0) { 3075835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return BAD_VALUE; 3085835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 30968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 3105835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp <IProCameraUser> c = mCamera; 3115835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin status_t stat = c->createStream(width, height, format, bufferProducer, 3125835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin streamId); 31368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 3145835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (stat == OK) { 3155835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin StreamInfo s(*streamId); 3165835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3175835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin mStreams.add(*streamId, s); 31868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin } 31968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 320985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin return stat; 32168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 32268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 3235835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkinstatus_t ProCamera::createStreamCpu(int width, int height, int format, 3245835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin int heapCount, 3255835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin /*out*/ 3265835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin int* streamId) 3275835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin{ 3285835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGV("%s: createStreamW %dx%d (fmt=0x%x)", __FUNCTION__, width, height, 3295835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin format); 3305835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3315835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp <IProCameraUser> c = mCamera; 3325835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (c == 0) return NO_INIT; 3335835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3345835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<CpuConsumer> cc = new CpuConsumer(heapCount); 3355835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin cc->setName(String8("ProCamera::mCpuConsumer")); 3365835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3375835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<Surface> stc = new Surface( 3385835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin cc->getProducerInterface()); 3395835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3405835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin status_t s = createStream(width, height, format, stc->getIGraphicBufferProducer(), 3415835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin streamId); 3425835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3435835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (s != OK) { 3445835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGE("%s: Failure to create stream %dx%d (fmt=0x%x)", __FUNCTION__, 3455835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin width, height, format); 3465835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return s; 3475835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 3485835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3495835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<ProFrameListener> frameAvailableListener = 3505835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin new ProFrameListener(this, *streamId); 3515835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3525835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).cpuStream = true; 3535835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).cpuConsumer = cc; 3545835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).stc = stc; 3555835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin // for lifetime management 3565835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).frameAvailableListener = frameAvailableListener; 3575835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3585835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin cc->setFrameAvailableListener(frameAvailableListener); 3595835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3605835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return s; 3615835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin} 3625835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 36368506fd58d26748617babe94d5648503cb3690bbIgor Murashkinint ProCamera::getNumberOfCameras() { 3647b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin const sp<ICameraService> cs = getCameraService(); 3657b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 3667b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin if (!cs.get()) { 3677b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin return DEAD_OBJECT; 3687b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin } 3697b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin return cs->getNumberOfCameras(); 37068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 37168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 37268506fd58d26748617babe94d5648503cb3690bbIgor Murashkincamera_metadata* ProCamera::getCameraInfo(int cameraId) { 37368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: cameraId = %d", __FUNCTION__, cameraId); 3747b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 3757b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin sp <IProCameraUser> c = mCamera; 3767b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin if (c == 0) return NULL; 3777b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 3787b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin camera_metadata* ptr = NULL; 3797b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin status_t status = c->getCameraInfo(cameraId, &ptr); 3807b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 3817b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin if (status != OK) { 3827b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin ALOGE("%s: Failed to get camera info, error = %d", __FUNCTION__, status); 3837b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin } 3847b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 3857b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin return ptr; 38668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 38768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 38868506fd58d26748617babe94d5648503cb3690bbIgor Murashkinstatus_t ProCamera::createDefaultRequest(int templateId, 38968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin camera_metadata** request) const { 39068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: templateId = %d", __FUNCTION__, templateId); 39168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 392985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin sp <IProCameraUser> c = mCamera; 393985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin if (c == 0) return NO_INIT; 394985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 395985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin return c->createDefaultRequest(templateId, request); 39668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 39768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 3985835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkinvoid ProCamera::onFrameAvailable(int streamId) { 3995835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGV("%s: streamId = %d", __FUNCTION__, streamId); 4005835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 4015835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<ProCameraListener> listener = mListener; 4025835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (listener.get() != NULL) { 4035835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin StreamInfo& stream = getStreamInfo(streamId); 4045835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 4055835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin CpuConsumer::LockedBuffer buf; 4065835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 4075835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin status_t stat = stream.cpuConsumer->lockNextBuffer(&buf); 4085835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (stat != OK) { 4095835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGE("%s: Failed to lock buffer, error code = %d", __FUNCTION__, 4105835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin stat); 4115835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return; 4125835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 4135835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 4145835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin listener->onBufferReceived(streamId, buf); 4155835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin stat = stream.cpuConsumer->unlockBuffer(buf); 4165835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 4175835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (stat != OK) { 4185835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGE("%s: Failed to unlock buffer, error code = %d", __FUNCTION__, 4195835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin stat); 4205835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 4215835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 4225835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin} 4235835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 4245835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor MurashkinProCamera::StreamInfo& ProCamera::getStreamInfo(int streamId) { 4255835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return mStreams.editValueFor(streamId); 4265835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin} 4275835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 428634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}; // namespace android 429