Camera.cpp revision c073ba525404f3416c2824c435d3d926a9892f1b
1/* 2** 3** Copyright (C) 2008, The Android Open Source Project 4** 5** Licensed under the Apache License, Version 2.0 (the "License"); 6** you may not use this file except in compliance with the License. 7** You may obtain a copy of the License at 8** 9** http://www.apache.org/licenses/LICENSE-2.0 10** 11** Unless required by applicable law or agreed to in writing, software 12** distributed under the License is distributed on an "AS IS" BASIS, 13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14** See the License for the specific language governing permissions and 15** limitations under the License. 16*/ 17 18//#define LOG_NDEBUG 0 19#define LOG_TAG "Camera" 20#include <utils/Log.h> 21#include <utils/threads.h> 22#include <utils/String16.h> 23#include <binder/IPCThreadState.h> 24#include <binder/IServiceManager.h> 25#include <binder/IMemory.h> 26 27#include <camera/Camera.h> 28#include <camera/ICameraRecordingProxyListener.h> 29#include <camera/ICameraService.h> 30#include <camera/ICamera.h> 31 32#include <gui/IGraphicBufferProducer.h> 33#include <gui/Surface.h> 34 35namespace android { 36 37Camera::Camera(int cameraId) 38 : CameraBase(cameraId) 39{ 40} 41 42// construct a camera client from an existing camera remote 43sp<Camera> Camera::create(const sp<ICamera>& camera) 44{ 45 ALOGV("create"); 46 if (camera == 0) { 47 ALOGE("camera remote is a NULL pointer"); 48 return 0; 49 } 50 51 sp<Camera> c = new Camera(-1); 52 if (camera->connect(c) == NO_ERROR) { 53 c->mStatus = NO_ERROR; 54 c->mCamera = camera; 55 camera->asBinder()->linkToDeath(c); 56 return c; 57 } 58 return 0; 59} 60 61Camera::~Camera() 62{ 63 // We don't need to call disconnect() here because if the CameraService 64 // thinks we are the owner of the hardware, it will hold a (strong) 65 // reference to us, and we can't possibly be here. We also don't want to 66 // call disconnect() here if we are in the same process as mediaserver, 67 // because we may be invoked by CameraService::Client::connect() and will 68 // deadlock if we call any method of ICamera here. 69} 70 71sp<Camera> Camera::connect(int cameraId, const String16& clientPackageName, 72 int clientUid) 73{ 74 return CameraBaseT::connect(cameraId, clientPackageName, clientUid); 75} 76 77status_t Camera::reconnect() 78{ 79 ALOGV("reconnect"); 80 sp <ICamera> c = mCamera; 81 if (c == 0) return NO_INIT; 82 return c->connect(this); 83} 84 85status_t Camera::lock() 86{ 87 sp <ICamera> c = mCamera; 88 if (c == 0) return NO_INIT; 89 return c->lock(); 90} 91 92status_t Camera::unlock() 93{ 94 sp <ICamera> c = mCamera; 95 if (c == 0) return NO_INIT; 96 return c->unlock(); 97} 98 99// pass the buffered Surface to the camera service 100status_t Camera::setPreviewDisplay(const sp<Surface>& surface) 101{ 102 ALOGV("setPreviewDisplay(%p)", surface.get()); 103 sp <ICamera> c = mCamera; 104 if (c == 0) return NO_INIT; 105 if (surface != 0) { 106 return c->setPreviewDisplay(surface); 107 } else { 108 ALOGD("app passed NULL surface"); 109 return c->setPreviewDisplay(0); 110 } 111} 112 113// pass the buffered IGraphicBufferProducer to the camera service 114status_t Camera::setPreviewTexture(const sp<IGraphicBufferProducer>& bufferProducer) 115{ 116 ALOGV("setPreviewTexture(%p)", bufferProducer.get()); 117 sp <ICamera> c = mCamera; 118 if (c == 0) return NO_INIT; 119 if (bufferProducer != 0) { 120 return c->setPreviewTexture(bufferProducer); 121 } else { 122 ALOGD("app passed NULL surface"); 123 return c->setPreviewTexture(0); 124 } 125} 126 127// start preview mode 128status_t Camera::startPreview() 129{ 130 ALOGV("startPreview"); 131 sp <ICamera> c = mCamera; 132 if (c == 0) return NO_INIT; 133 return c->startPreview(); 134} 135 136status_t Camera::storeMetaDataInBuffers(bool enabled) 137{ 138 ALOGV("storeMetaDataInBuffers: %s", 139 enabled? "true": "false"); 140 sp <ICamera> c = mCamera; 141 if (c == 0) return NO_INIT; 142 return c->storeMetaDataInBuffers(enabled); 143} 144 145// start recording mode, must call setPreviewDisplay first 146status_t Camera::startRecording() 147{ 148 ALOGV("startRecording"); 149 sp <ICamera> c = mCamera; 150 if (c == 0) return NO_INIT; 151 return c->startRecording(); 152} 153 154// stop preview mode 155void Camera::stopPreview() 156{ 157 ALOGV("stopPreview"); 158 sp <ICamera> c = mCamera; 159 if (c == 0) return; 160 c->stopPreview(); 161} 162 163// stop recording mode 164void Camera::stopRecording() 165{ 166 ALOGV("stopRecording"); 167 { 168 Mutex::Autolock _l(mLock); 169 mRecordingProxyListener.clear(); 170 } 171 sp <ICamera> c = mCamera; 172 if (c == 0) return; 173 c->stopRecording(); 174} 175 176// release a recording frame 177void Camera::releaseRecordingFrame(const sp<IMemory>& mem) 178{ 179 ALOGV("releaseRecordingFrame"); 180 sp <ICamera> c = mCamera; 181 if (c == 0) return; 182 c->releaseRecordingFrame(mem); 183} 184 185// get preview state 186bool Camera::previewEnabled() 187{ 188 ALOGV("previewEnabled"); 189 sp <ICamera> c = mCamera; 190 if (c == 0) return false; 191 return c->previewEnabled(); 192} 193 194// get recording state 195bool Camera::recordingEnabled() 196{ 197 ALOGV("recordingEnabled"); 198 sp <ICamera> c = mCamera; 199 if (c == 0) return false; 200 return c->recordingEnabled(); 201} 202 203status_t Camera::autoFocus() 204{ 205 ALOGV("autoFocus"); 206 sp <ICamera> c = mCamera; 207 if (c == 0) return NO_INIT; 208 return c->autoFocus(); 209} 210 211status_t Camera::cancelAutoFocus() 212{ 213 ALOGV("cancelAutoFocus"); 214 sp <ICamera> c = mCamera; 215 if (c == 0) return NO_INIT; 216 return c->cancelAutoFocus(); 217} 218 219// take a picture 220status_t Camera::takePicture(int msgType) 221{ 222 ALOGV("takePicture: 0x%x", msgType); 223 sp <ICamera> c = mCamera; 224 if (c == 0) return NO_INIT; 225 return c->takePicture(msgType); 226} 227 228// set preview/capture parameters - key/value pairs 229status_t Camera::setParameters(const String8& params) 230{ 231 ALOGV("setParameters"); 232 sp <ICamera> c = mCamera; 233 if (c == 0) return NO_INIT; 234 return c->setParameters(params); 235} 236 237// get preview/capture parameters - key/value pairs 238String8 Camera::getParameters() const 239{ 240 ALOGV("getParameters"); 241 String8 params; 242 sp <ICamera> c = mCamera; 243 if (c != 0) params = mCamera->getParameters(); 244 return params; 245} 246 247// send command to camera driver 248status_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) 249{ 250 ALOGV("sendCommand"); 251 sp <ICamera> c = mCamera; 252 if (c == 0) return NO_INIT; 253 return c->sendCommand(cmd, arg1, arg2); 254} 255 256void Camera::setListener(const sp<CameraListener>& listener) 257{ 258 Mutex::Autolock _l(mLock); 259 mListener = listener; 260} 261 262void Camera::setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener) 263{ 264 Mutex::Autolock _l(mLock); 265 mRecordingProxyListener = listener; 266} 267 268void Camera::setPreviewCallbackFlags(int flag) 269{ 270 ALOGV("setPreviewCallbackFlags"); 271 sp <ICamera> c = mCamera; 272 if (c == 0) return; 273 mCamera->setPreviewCallbackFlag(flag); 274} 275 276// callback from camera service 277void Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 278{ 279 return CameraBaseT::notifyCallback(msgType, ext1, ext2); 280} 281 282// callback from camera service when frame or image is ready 283void Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 284 camera_frame_metadata_t *metadata) 285{ 286 return CameraBaseT::dataCallback(msgType, dataPtr, metadata); 287} 288 289// callback from camera service when timestamped frame is ready 290void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) 291{ 292 // If recording proxy listener is registered, forward the frame and return. 293 // The other listener (mListener) is ignored because the receiver needs to 294 // call releaseRecordingFrame. 295 sp<ICameraRecordingProxyListener> proxylistener; 296 { 297 Mutex::Autolock _l(mLock); 298 proxylistener = mRecordingProxyListener; 299 } 300 if (proxylistener != NULL) { 301 proxylistener->dataCallbackTimestamp(timestamp, msgType, dataPtr); 302 return; 303 } 304 305 if (!CameraBaseT::dataCallbackTimestamp(timestamp, msgType, dataPtr)) { 306 ALOGW("No listener was set. Drop a recording frame."); 307 releaseRecordingFrame(dataPtr); 308 } 309} 310 311sp<ICameraRecordingProxy> Camera::getRecordingProxy() { 312 ALOGV("getProxy"); 313 return new RecordingProxy(this); 314} 315 316status_t Camera::RecordingProxy::startRecording(const sp<ICameraRecordingProxyListener>& listener) 317{ 318 ALOGV("RecordingProxy::startRecording"); 319 mCamera->setRecordingProxyListener(listener); 320 mCamera->reconnect(); 321 return mCamera->startRecording(); 322} 323 324void Camera::RecordingProxy::stopRecording() 325{ 326 ALOGV("RecordingProxy::stopRecording"); 327 mCamera->stopRecording(); 328} 329 330void Camera::RecordingProxy::releaseRecordingFrame(const sp<IMemory>& mem) 331{ 332 ALOGV("RecordingProxy::releaseRecordingFrame"); 333 mCamera->releaseRecordingFrame(mem); 334} 335 336Camera::RecordingProxy::RecordingProxy(const sp<Camera>& camera) 337{ 338 mCamera = camera; 339} 340 341}; // namespace android 342