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)