ProCamera.cpp revision 634a51509ee50475f3e9f8ccf897e90fc72ded31
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
121634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
122634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service
123634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
124634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
125634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp<ProCameraListener> listener;
126634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
127634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Mutex::Autolock _l(mLock);
128634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        listener = mListener;
129634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
130634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (listener != NULL) {
131634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        listener->notify(msgType, ext1, ext2);
132634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
133634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
134634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
135634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service when frame or image is ready
136634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
137634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                          camera_frame_metadata_t *metadata)
138634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
139634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp<ProCameraListener> listener;
140634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
141634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Mutex::Autolock _l(mLock);
142634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        listener = mListener;
143634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
144634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (listener != NULL) {
145634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        listener->postData(msgType, dataPtr, metadata);
146634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
147634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
148634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
149634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service when timestamped frame is ready
150634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType,
151634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                                                    const sp<IMemory>& dataPtr)
152634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
153634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp<ProCameraListener> listener;
154634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
155634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Mutex::Autolock _l(mLock);
156634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        listener = mListener;
157634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
158634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (listener != NULL) {
159634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        listener->postDataTimestamp(timestamp, msgType, dataPtr);
160634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    } else {
161634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        ALOGW("No listener was set. Drop a recording frame.");
162634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
163634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
164634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
165634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin/* IProCameraUser's implementation */
166634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
167634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveTryLock()
168634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
169634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp <IProCameraUser> c = mCamera;
170634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (c == 0) return NO_INIT;
171634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
172634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    return c->exclusiveTryLock();
173634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
174634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveLock()
175634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
176634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp <IProCameraUser> c = mCamera;
177634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (c == 0) return NO_INIT;
178634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
179634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    return c->exclusiveLock();
180634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
181634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveUnlock()
182634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
183634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp <IProCameraUser> c = mCamera;
184634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (c == 0) return NO_INIT;
185634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
186634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    return c->exclusiveUnlock();
187634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
188634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinbool ProCamera::hasExclusiveLock()
189634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
190634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp <IProCameraUser> c = mCamera;
191634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (c == 0) return NO_INIT;
192634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
193634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    return c->hasExclusiveLock();
194634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
195634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
196634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// Note that the callee gets a copy of the metadata.
197634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinint ProCamera::submitRequest(const struct camera_metadata* metadata,
198634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                             bool streaming)
199634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
200634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp <IProCameraUser> c = mCamera;
201634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (c == 0) return NO_INIT;
202634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
203634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    return c->submitRequest(const_cast<struct camera_metadata*>(metadata),
204634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                            streaming);
205634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
206634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
207634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::cancelRequest(int requestId)
208634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
209634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp <IProCameraUser> c = mCamera;
210634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (c == 0) return NO_INIT;
211634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
212634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    return c->cancelRequest(requestId);
213634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
214634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
215634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::requestStream(int streamId)
216634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
217634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp <IProCameraUser> c = mCamera;
218634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (c == 0) return NO_INIT;
219634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
220634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    return c->requestStream(streamId);
221634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
222634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::cancelStream(int streamId)
223634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
224634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp <IProCameraUser> c = mCamera;
225634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (c == 0) return NO_INIT;
226634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
227634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    return c->cancelStream(streamId);
228634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
229634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
230634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}; // namespace android
231