ProCamera.cpp revision 5835cc46a2f06dbfa5fbdab70e091896ef2fb438
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 36634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinnamespace android { 37634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 38634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// client singleton for camera service binder interface 39634a51509ee50475f3e9f8ccf897e90fc72ded31Igor MurashkinMutex ProCamera::mLock; 40634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinsp<ICameraService> ProCamera::mCameraService; 41634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinsp<ProCamera::DeathNotifier> ProCamera::mDeathNotifier; 42634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 43634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// establish binder interface to camera service 44634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinconst sp<ICameraService>& ProCamera::getCameraService() 45634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 46634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Mutex::Autolock _l(mLock); 47634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (mCameraService.get() == 0) { 48634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<IServiceManager> sm = defaultServiceManager(); 49634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<IBinder> binder; 50634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin do { 51634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin binder = sm->getService(String16("media.camera")); 52634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (binder != 0) 53634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin break; 54634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGW("CameraService not published, waiting..."); 55634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin usleep(500000); // 0.5 s 56634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } while(true); 57634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (mDeathNotifier == NULL) { 58634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin mDeathNotifier = new DeathNotifier(); 59634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 60634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin binder->linkToDeath(mDeathNotifier); 61634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin mCameraService = interface_cast<ICameraService>(binder); 62634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 63634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGE_IF(mCameraService==0, "no CameraService!?"); 64634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return mCameraService; 65634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 66634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 67634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinsp<ProCamera> ProCamera::connect(int cameraId) 68634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 69634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGV("connect"); 70634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<ProCamera> c = new ProCamera(); 71634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<IProCameraCallbacks> cl = c; 72634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin const sp<ICameraService>& cs = getCameraService(); 73634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (cs != 0) { 74634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin c->mCamera = cs->connect(cl, cameraId); 75634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 76634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c->mCamera != 0) { 77634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin c->mCamera->asBinder()->linkToDeath(c); 78634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin c->mStatus = NO_ERROR; 79634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } else { 80634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin c.clear(); 81634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 82634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c; 83634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 84634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 85634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::disconnect() 86634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 87634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGV("disconnect"); 88634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (mCamera != 0) { 89634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin mCamera->disconnect(); 90634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin mCamera->asBinder()->unlinkToDeath(this); 91634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin mCamera = 0; 92634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 93634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 94634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 95634a51509ee50475f3e9f8ccf897e90fc72ded31Igor MurashkinProCamera::ProCamera() 96634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 97634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 98634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 99634a51509ee50475f3e9f8ccf897e90fc72ded31Igor MurashkinProCamera::~ProCamera() 100634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 101634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 102634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 103634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 104634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinsp<IProCameraUser> ProCamera::remote() 105634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 106634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return mCamera; 107634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 108634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 109634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::binderDied(const wp<IBinder>& who) { 110634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGW("IProCameraUser died"); 111634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0); 112634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 113634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 114634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::DeathNotifier::binderDied(const wp<IBinder>& who) { 115634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGV("binderDied"); 116634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Mutex::Autolock _l(ProCamera::mLock); 117634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ProCamera::mCameraService.clear(); 118634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGW("Camera service died!"); 119634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 120634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 1215376573eff55f370f041889618c9a7a9e1894615Igor Murashkinvoid ProCamera::setListener(const sp<ProCameraListener>& listener) 1225376573eff55f370f041889618c9a7a9e1894615Igor Murashkin{ 1235376573eff55f370f041889618c9a7a9e1894615Igor Murashkin Mutex::Autolock _l(mLock); 1245376573eff55f370f041889618c9a7a9e1894615Igor Murashkin mListener = listener; 1255376573eff55f370f041889618c9a7a9e1894615Igor Murashkin} 1265376573eff55f370f041889618c9a7a9e1894615Igor Murashkin 127634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 128634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service 129634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 130634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 131634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<ProCameraListener> listener; 132634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 133634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Mutex::Autolock _l(mLock); 134634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener = mListener; 135634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 136634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (listener != NULL) { 137634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener->notify(msgType, ext1, ext2); 138634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 139634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 140634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 141634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service when frame or image is ready 142634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 143634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin camera_frame_metadata_t *metadata) 144634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 145634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<ProCameraListener> listener; 146634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 147634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Mutex::Autolock _l(mLock); 148634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener = mListener; 149634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 150634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (listener != NULL) { 151634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener->postData(msgType, dataPtr, metadata); 152634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 153634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 154634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 155634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service when timestamped frame is ready 156634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, 157634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin const sp<IMemory>& dataPtr) 158634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 159634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<ProCameraListener> listener; 160634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 161634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Mutex::Autolock _l(mLock); 162634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener = mListener; 163634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 164634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (listener != NULL) { 165634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin listener->postDataTimestamp(timestamp, msgType, dataPtr); 166634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } else { 167634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGW("No listener was set. Drop a recording frame."); 168634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 169634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 170634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 171634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin/* IProCameraUser's implementation */ 172634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 1735376573eff55f370f041889618c9a7a9e1894615Igor Murashkinvoid ProCamera::onLockStatusChanged( 1745376573eff55f370f041889618c9a7a9e1894615Igor Murashkin IProCameraCallbacks::LockStatus newLockStatus) 1755376573eff55f370f041889618c9a7a9e1894615Igor Murashkin{ 1765376573eff55f370f041889618c9a7a9e1894615Igor Murashkin ALOGV("%s: newLockStatus = %d", __FUNCTION__, newLockStatus); 1775376573eff55f370f041889618c9a7a9e1894615Igor Murashkin 1785376573eff55f370f041889618c9a7a9e1894615Igor Murashkin sp<ProCameraListener> listener; 1795376573eff55f370f041889618c9a7a9e1894615Igor Murashkin { 1805376573eff55f370f041889618c9a7a9e1894615Igor Murashkin Mutex::Autolock _l(mLock); 1815376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener = mListener; 1825376573eff55f370f041889618c9a7a9e1894615Igor Murashkin } 1835376573eff55f370f041889618c9a7a9e1894615Igor Murashkin if (listener != NULL) { 1845376573eff55f370f041889618c9a7a9e1894615Igor Murashkin switch (newLockStatus) { 1855376573eff55f370f041889618c9a7a9e1894615Igor Murashkin case IProCameraCallbacks::LOCK_ACQUIRED: 1865376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener->onLockAcquired(); 1875376573eff55f370f041889618c9a7a9e1894615Igor Murashkin break; 1885376573eff55f370f041889618c9a7a9e1894615Igor Murashkin case IProCameraCallbacks::LOCK_RELEASED: 1895376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener->onLockReleased(); 1905376573eff55f370f041889618c9a7a9e1894615Igor Murashkin break; 1915376573eff55f370f041889618c9a7a9e1894615Igor Murashkin case IProCameraCallbacks::LOCK_STOLEN: 1925376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener->onLockStolen(); 1935376573eff55f370f041889618c9a7a9e1894615Igor Murashkin break; 1945376573eff55f370f041889618c9a7a9e1894615Igor Murashkin default: 1955376573eff55f370f041889618c9a7a9e1894615Igor Murashkin ALOGE("%s: Unknown lock status: %d", 1965376573eff55f370f041889618c9a7a9e1894615Igor Murashkin __FUNCTION__, newLockStatus); 1975376573eff55f370f041889618c9a7a9e1894615Igor Murashkin } 1985376573eff55f370f041889618c9a7a9e1894615Igor Murashkin } 1995376573eff55f370f041889618c9a7a9e1894615Igor Murashkin} 2005376573eff55f370f041889618c9a7a9e1894615Igor Murashkin 201634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveTryLock() 202634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 203634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 204634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 205634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 206634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->exclusiveTryLock(); 207634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 208634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveLock() 209634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 210634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 211634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 212634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 213634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->exclusiveLock(); 214634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 215634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveUnlock() 216634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 217634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 218634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 219634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 220634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->exclusiveUnlock(); 221634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 222634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinbool ProCamera::hasExclusiveLock() 223634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 224634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 225634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 226634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 227634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->hasExclusiveLock(); 228634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 229634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 230634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// Note that the callee gets a copy of the metadata. 231634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinint ProCamera::submitRequest(const struct camera_metadata* metadata, 232634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin bool streaming) 233634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 234634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 235634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 236634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 237634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->submitRequest(const_cast<struct camera_metadata*>(metadata), 238634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin streaming); 239634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 240634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 241634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::cancelRequest(int requestId) 242634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 243634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 244634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 245634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 246634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->cancelRequest(requestId); 247634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 248634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 2495835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkinstatus_t ProCamera::deleteStream(int streamId) 250634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 251634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 252634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 253634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 2545835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin status_t s = c->cancelStream(streamId); 2555835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 2565835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin mStreams.removeItem(streamId); 257634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 2585835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return s; 259634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 260634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 26168506fd58d26748617babe94d5648503cb3690bbIgor Murashkinstatus_t ProCamera::createStream(int width, int height, int format, 262985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin const sp<Surface>& surface, 26368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin /*out*/ 26468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin int* streamId) 26568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin{ 26668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin *streamId = -1; 26768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 26868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: createStreamW %dx%d (fmt=0x%x)", __FUNCTION__, width, height, 26968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin format); 27068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 271985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin if (surface == 0) { 27268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin return BAD_VALUE; 27368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin } 27468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 2755835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return createStream(width, height, format, surface->getIGraphicBufferProducer(), 2765835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin streamId); 27768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 27868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 27968506fd58d26748617babe94d5648503cb3690bbIgor Murashkinstatus_t ProCamera::createStream(int width, int height, int format, 28068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin const sp<IGraphicBufferProducer>& bufferProducer, 28168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin /*out*/ 28268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin int* streamId) { 2835835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin *streamId = -1; 28468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 28568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: createStreamT %dx%d (fmt=0x%x)", __FUNCTION__, width, height, 28668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin format); 28768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 2885835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (bufferProducer == 0) { 2895835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return BAD_VALUE; 2905835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 29168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 2925835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp <IProCameraUser> c = mCamera; 2935835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin status_t stat = c->createStream(width, height, format, bufferProducer, 2945835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin streamId); 29568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 2965835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (stat == OK) { 2975835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin StreamInfo s(*streamId); 2985835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 2995835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin mStreams.add(*streamId, s); 30068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin } 30168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 302985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin return stat; 30368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 30468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 3055835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkinstatus_t ProCamera::createStreamCpu(int width, int height, int format, 3065835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin int heapCount, 3075835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin /*out*/ 3085835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin int* streamId) 3095835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin{ 3105835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGV("%s: createStreamW %dx%d (fmt=0x%x)", __FUNCTION__, width, height, 3115835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin format); 3125835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3135835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp <IProCameraUser> c = mCamera; 3145835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (c == 0) return NO_INIT; 3155835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3165835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<CpuConsumer> cc = new CpuConsumer(heapCount); 3175835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin cc->setName(String8("ProCamera::mCpuConsumer")); 3185835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3195835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<Surface> stc = new Surface( 3205835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin cc->getProducerInterface()); 3215835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3225835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin status_t s = createStream(width, height, format, stc->getIGraphicBufferProducer(), 3235835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin streamId); 3245835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3255835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (s != OK) { 3265835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGE("%s: Failure to create stream %dx%d (fmt=0x%x)", __FUNCTION__, 3275835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin width, height, format); 3285835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return s; 3295835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 3305835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3315835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<ProFrameListener> frameAvailableListener = 3325835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin new ProFrameListener(this, *streamId); 3335835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3345835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).cpuStream = true; 3355835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).cpuConsumer = cc; 3365835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).stc = stc; 3375835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin // for lifetime management 3385835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).frameAvailableListener = frameAvailableListener; 3395835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3405835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin cc->setFrameAvailableListener(frameAvailableListener); 3415835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3425835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return s; 3435835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin} 3445835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 34568506fd58d26748617babe94d5648503cb3690bbIgor Murashkinint ProCamera::getNumberOfCameras() { 34668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGE("%s: not implemented yet", __FUNCTION__); 34768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin return 1; 34868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 34968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 35068506fd58d26748617babe94d5648503cb3690bbIgor Murashkincamera_metadata* ProCamera::getCameraInfo(int cameraId) { 35168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGE("%s: not implemented yet", __FUNCTION__); 35268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 35368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: cameraId = %d", __FUNCTION__, cameraId); 35468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin return NULL; 35568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 35668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 35768506fd58d26748617babe94d5648503cb3690bbIgor Murashkinstatus_t ProCamera::createDefaultRequest(int templateId, 35868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin camera_metadata** request) const { 35968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: templateId = %d", __FUNCTION__, templateId); 36068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 361985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin sp <IProCameraUser> c = mCamera; 362985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin if (c == 0) return NO_INIT; 363985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 364985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin return c->createDefaultRequest(templateId, request); 36568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 36668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 3675835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkinvoid ProCamera::onFrameAvailable(int streamId) { 3685835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGV("%s: streamId = %d", __FUNCTION__, streamId); 3695835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3705835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<ProCameraListener> listener = mListener; 3715835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (listener.get() != NULL) { 3725835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin StreamInfo& stream = getStreamInfo(streamId); 3735835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3745835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin CpuConsumer::LockedBuffer buf; 3755835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3765835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin status_t stat = stream.cpuConsumer->lockNextBuffer(&buf); 3775835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (stat != OK) { 3785835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGE("%s: Failed to lock buffer, error code = %d", __FUNCTION__, 3795835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin stat); 3805835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return; 3815835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 3825835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3835835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin listener->onBufferReceived(streamId, buf); 3845835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin stat = stream.cpuConsumer->unlockBuffer(buf); 3855835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3865835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (stat != OK) { 3875835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGE("%s: Failed to unlock buffer, error code = %d", __FUNCTION__, 3885835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin stat); 3895835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 3905835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 3915835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin} 3925835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3935835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor MurashkinProCamera::StreamInfo& ProCamera::getStreamInfo(int streamId) { 3945835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return mStreams.editValueFor(streamId); 3955835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin} 3965835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 397634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}; // namespace android 398