ProCamera.cpp revision 5376573eff55f370f041889618c9a7a9e1894615
1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Copyright (C) 2013, The Android Open Source Project 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Licensed under the Apache License, Version 2.0 (the "License"); 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** you may not use this file except in compliance with the License. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** You may obtain a copy of the License at 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)** 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)** http://www.apache.org/licenses/LICENSE-2.0 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Unless required by applicable law or agreed to in writing, software 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** distributed under the License is distributed on an "AS IS" BASIS, 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See the License for the specific language governing permissions and 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** limitations under the License. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//#define LOG_NDEBUG 0 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_TAG "ProCamera" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/Log.h> 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <utils/threads.h> 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <utils/Mutex.h> 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <binder/IPCThreadState.h> 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <binder/IServiceManager.h> 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <binder/IMemory.h> 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <camera/ProCamera.h> 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <camera/ICameraService.h> 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <camera/IProCameraUser.h> 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <camera/IProCameraCallbacks.h> 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <gui/IGraphicBufferProducer.h> 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <gui/Surface.h> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android { 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// client singleton for camera service binder interface 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)Mutex ProCamera::mLock; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sp<ICameraService> ProCamera::mCameraService; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sp<ProCamera::DeathNotifier> ProCamera::mDeathNotifier; 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// establish binder interface to camera service 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const sp<ICameraService>& ProCamera::getCameraService() 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){ 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Mutex::Autolock _l(mLock); 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (mCameraService.get() == 0) { 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sp<IServiceManager> sm = defaultServiceManager(); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sp<IBinder> binder; 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch do { 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci binder = sm->getService(String16("media.camera")); 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (binder != 0) 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ALOGW("CameraService not published, waiting..."); 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) usleep(500000); // 0.5 s 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while(true); 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (mDeathNotifier == NULL) { 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mDeathNotifier = new DeathNotifier(); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) binder->linkToDeath(mDeathNotifier); 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mCameraService = interface_cast<ICameraService>(binder); 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ALOGE_IF(mCameraService==0, "no CameraService!?"); 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return mCameraService; 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)sp<ProCamera> ProCamera::connect(int cameraId) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){ 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ALOGV("connect"); 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sp<ProCamera> c = new ProCamera(); 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sp<IProCameraCallbacks> cl = c; 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const sp<ICameraService>& cs = getCameraService(); 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (cs != 0) { 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) c->mCamera = cs->connect(cl, cameraId); 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (c->mCamera != 0) { 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) c->mCamera->asBinder()->linkToDeath(c); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) c->mStatus = NO_ERROR; 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) c.clear(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return c; 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ProCamera::disconnect() 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){ 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ALOGV("disconnect"); 881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (mCamera != 0) { 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mCamera->disconnect(); 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mCamera->asBinder()->unlinkToDeath(this); 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mCamera = 0; 921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ProCamera::ProCamera() 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciProCamera::~ProCamera() 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)sp<IProCameraUser> ProCamera::remote() 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return mCamera; 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProCamera::binderDied(const wp<IBinder>& who) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ALOGW("IProCameraUser died"); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ProCamera::DeathNotifier::binderDied(const wp<IBinder>& who) { 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ALOGV("binderDied"); 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Mutex::Autolock _l(ProCamera::mLock); 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProCamera::mCameraService.clear(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ALOGW("Camera service died!"); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProCamera::setListener(const sp<ProCameraListener>& listener) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mutex::Autolock _l(mLock); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mListener = listener; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callback from camera service 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProCamera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp<ProCameraListener> listener; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mutex::Autolock _l(mLock); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener = mListener; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (listener != NULL) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener->notify(msgType, ext1, ext2); 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callback from camera service when frame or image is ready 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProCamera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) camera_frame_metadata_t *metadata) 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){ 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) sp<ProCameraListener> listener; 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Mutex::Autolock _l(mLock); 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) listener = mListener; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (listener != NULL) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener->postData(msgType, dataPtr, metadata); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// callback from camera service when timestamped frame is ready 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProCamera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const sp<IMemory>& dataPtr) 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sp<ProCameraListener> listener; 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Mutex::Autolock _l(mLock); 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) listener = mListener; 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (listener != NULL) { 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) listener->postDataTimestamp(timestamp, msgType, dataPtr); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ALOGW("No listener was set. Drop a recording frame."); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* IProCameraUser's implementation */ 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProCamera::onLockStatusChanged( 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IProCameraCallbacks::LockStatus newLockStatus) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ALOGV("%s: newLockStatus = %d", __FUNCTION__, newLockStatus); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp<ProCameraListener> listener; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mutex::Autolock _l(mLock); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener = mListener; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (listener != NULL) { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (newLockStatus) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IProCameraCallbacks::LOCK_ACQUIRED: 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) listener->onLockAcquired(); 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case IProCameraCallbacks::LOCK_RELEASED: 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener->onLockReleased(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IProCameraCallbacks::LOCK_STOLEN: 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener->onLockStolen(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ALOGE("%s: Unknown lock status: %d", 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __FUNCTION__, newLockStatus); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)status_t ProCamera::exclusiveTryLock() 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp <IProCameraUser> c = mCamera; 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (c == 0) return NO_INIT; 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return c->exclusiveTryLock(); 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)status_t ProCamera::exclusiveLock() 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){ 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sp <IProCameraUser> c = mCamera; 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (c == 0) return NO_INIT; 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return c->exclusiveLock(); 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)status_t ProCamera::exclusiveUnlock() 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sp <IProCameraUser> c = mCamera; 218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (c == 0) return NO_INIT; 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return c->exclusiveUnlock(); 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ProCamera::hasExclusiveLock() 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sp <IProCameraUser> c = mCamera; 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (c == 0) return NO_INIT; 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return c->hasExclusiveLock(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that the callee gets a copy of the metadata. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ProCamera::submitRequest(const struct camera_metadata* metadata, 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool streaming) 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sp <IProCameraUser> c = mCamera; 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (c == 0) return NO_INIT; 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return c->submitRequest(const_cast<struct camera_metadata*>(metadata), 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) streaming); 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)status_t ProCamera::cancelRequest(int requestId) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp <IProCameraUser> c = mCamera; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (c == 0) return NO_INIT; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c->cancelRequest(requestId); 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)status_t ProCamera::requestStream(int streamId) 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp <IProCameraUser> c = mCamera; 252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (c == 0) return NO_INIT; 253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return c->requestStream(streamId); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)status_t ProCamera::cancelStream(int streamId) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sp <IProCameraUser> c = mCamera; 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (c == 0) return NO_INIT; 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return c->cancelStream(streamId); 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; // namespace android 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)