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