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