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