Home | History | Annotate | Download | only in camera
      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 
     35 namespace android {
     36 
     37 Camera::Camera(int cameraId)
     38     : CameraBase(cameraId)
     39 {
     40 }
     41 
     42 // construct a camera client from an existing camera remote
     43 sp<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 
     61 Camera::~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 
     71 sp<Camera> Camera::connect(int cameraId, const String16& clientPackageName,
     72         int clientUid)
     73 {
     74     return CameraBaseT::connect(cameraId, clientPackageName, clientUid);
     75 }
     76 
     77 status_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 
     85 status_t Camera::lock()
     86 {
     87     sp <ICamera> c = mCamera;
     88     if (c == 0) return NO_INIT;
     89     return c->lock();
     90 }
     91 
     92 status_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 IGraphicBufferProducer to the camera service
    100 status_t Camera::setPreviewTexture(const sp<IGraphicBufferProducer>& bufferProducer)
    101 {
    102     ALOGV("setPreviewTexture(%p)", bufferProducer.get());
    103     sp <ICamera> c = mCamera;
    104     if (c == 0) return NO_INIT;
    105     ALOGD_IF(bufferProducer == 0, "app passed NULL surface");
    106     return c->setPreviewTexture(bufferProducer);
    107 }
    108 
    109 // start preview mode
    110 status_t Camera::startPreview()
    111 {
    112     ALOGV("startPreview");
    113     sp <ICamera> c = mCamera;
    114     if (c == 0) return NO_INIT;
    115     return c->startPreview();
    116 }
    117 
    118 status_t Camera::storeMetaDataInBuffers(bool enabled)
    119 {
    120     ALOGV("storeMetaDataInBuffers: %s",
    121             enabled? "true": "false");
    122     sp <ICamera> c = mCamera;
    123     if (c == 0) return NO_INIT;
    124     return c->storeMetaDataInBuffers(enabled);
    125 }
    126 
    127 // start recording mode, must call setPreviewDisplay first
    128 status_t Camera::startRecording()
    129 {
    130     ALOGV("startRecording");
    131     sp <ICamera> c = mCamera;
    132     if (c == 0) return NO_INIT;
    133     return c->startRecording();
    134 }
    135 
    136 // stop preview mode
    137 void Camera::stopPreview()
    138 {
    139     ALOGV("stopPreview");
    140     sp <ICamera> c = mCamera;
    141     if (c == 0) return;
    142     c->stopPreview();
    143 }
    144 
    145 // stop recording mode
    146 void Camera::stopRecording()
    147 {
    148     ALOGV("stopRecording");
    149     {
    150         Mutex::Autolock _l(mLock);
    151         mRecordingProxyListener.clear();
    152     }
    153     sp <ICamera> c = mCamera;
    154     if (c == 0) return;
    155     c->stopRecording();
    156 }
    157 
    158 // release a recording frame
    159 void Camera::releaseRecordingFrame(const sp<IMemory>& mem)
    160 {
    161     ALOGV("releaseRecordingFrame");
    162     sp <ICamera> c = mCamera;
    163     if (c == 0) return;
    164     c->releaseRecordingFrame(mem);
    165 }
    166 
    167 // get preview state
    168 bool Camera::previewEnabled()
    169 {
    170     ALOGV("previewEnabled");
    171     sp <ICamera> c = mCamera;
    172     if (c == 0) return false;
    173     return c->previewEnabled();
    174 }
    175 
    176 // get recording state
    177 bool Camera::recordingEnabled()
    178 {
    179     ALOGV("recordingEnabled");
    180     sp <ICamera> c = mCamera;
    181     if (c == 0) return false;
    182     return c->recordingEnabled();
    183 }
    184 
    185 status_t Camera::autoFocus()
    186 {
    187     ALOGV("autoFocus");
    188     sp <ICamera> c = mCamera;
    189     if (c == 0) return NO_INIT;
    190     return c->autoFocus();
    191 }
    192 
    193 status_t Camera::cancelAutoFocus()
    194 {
    195     ALOGV("cancelAutoFocus");
    196     sp <ICamera> c = mCamera;
    197     if (c == 0) return NO_INIT;
    198     return c->cancelAutoFocus();
    199 }
    200 
    201 // take a picture
    202 status_t Camera::takePicture(int msgType)
    203 {
    204     ALOGV("takePicture: 0x%x", msgType);
    205     sp <ICamera> c = mCamera;
    206     if (c == 0) return NO_INIT;
    207     return c->takePicture(msgType);
    208 }
    209 
    210 // set preview/capture parameters - key/value pairs
    211 status_t Camera::setParameters(const String8& params)
    212 {
    213     ALOGV("setParameters");
    214     sp <ICamera> c = mCamera;
    215     if (c == 0) return NO_INIT;
    216     return c->setParameters(params);
    217 }
    218 
    219 // get preview/capture parameters - key/value pairs
    220 String8 Camera::getParameters() const
    221 {
    222     ALOGV("getParameters");
    223     String8 params;
    224     sp <ICamera> c = mCamera;
    225     if (c != 0) params = mCamera->getParameters();
    226     return params;
    227 }
    228 
    229 // send command to camera driver
    230 status_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
    231 {
    232     ALOGV("sendCommand");
    233     sp <ICamera> c = mCamera;
    234     if (c == 0) return NO_INIT;
    235     return c->sendCommand(cmd, arg1, arg2);
    236 }
    237 
    238 void Camera::setListener(const sp<CameraListener>& listener)
    239 {
    240     Mutex::Autolock _l(mLock);
    241     mListener = listener;
    242 }
    243 
    244 void Camera::setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener)
    245 {
    246     Mutex::Autolock _l(mLock);
    247     mRecordingProxyListener = listener;
    248 }
    249 
    250 void Camera::setPreviewCallbackFlags(int flag)
    251 {
    252     ALOGV("setPreviewCallbackFlags");
    253     sp <ICamera> c = mCamera;
    254     if (c == 0) return;
    255     mCamera->setPreviewCallbackFlag(flag);
    256 }
    257 
    258 // callback from camera service
    259 void Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
    260 {
    261     return CameraBaseT::notifyCallback(msgType, ext1, ext2);
    262 }
    263 
    264 // callback from camera service when frame or image is ready
    265 void Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
    266                           camera_frame_metadata_t *metadata)
    267 {
    268     sp<CameraListener> listener;
    269     {
    270         Mutex::Autolock _l(mLock);
    271         listener = mListener;
    272     }
    273     if (listener != NULL) {
    274         listener->postData(msgType, dataPtr, metadata);
    275     }
    276 }
    277 
    278 // callback from camera service when timestamped frame is ready
    279 void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
    280 {
    281     // If recording proxy listener is registered, forward the frame and return.
    282     // The other listener (mListener) is ignored because the receiver needs to
    283     // call releaseRecordingFrame.
    284     sp<ICameraRecordingProxyListener> proxylistener;
    285     {
    286         Mutex::Autolock _l(mLock);
    287         proxylistener = mRecordingProxyListener;
    288     }
    289     if (proxylistener != NULL) {
    290         proxylistener->dataCallbackTimestamp(timestamp, msgType, dataPtr);
    291         return;
    292     }
    293 
    294     sp<CameraListener> listener;
    295     {
    296         Mutex::Autolock _l(mLock);
    297         listener = mListener;
    298     }
    299 
    300     if (listener != NULL) {
    301         listener->postDataTimestamp(timestamp, msgType, dataPtr);
    302     } else {
    303         ALOGW("No listener was set. Drop a recording frame.");
    304         releaseRecordingFrame(dataPtr);
    305     }
    306 }
    307 
    308 sp<ICameraRecordingProxy> Camera::getRecordingProxy() {
    309     ALOGV("getProxy");
    310     return new RecordingProxy(this);
    311 }
    312 
    313 status_t Camera::RecordingProxy::startRecording(const sp<ICameraRecordingProxyListener>& listener)
    314 {
    315     ALOGV("RecordingProxy::startRecording");
    316     mCamera->setRecordingProxyListener(listener);
    317     mCamera->reconnect();
    318     return mCamera->startRecording();
    319 }
    320 
    321 void Camera::RecordingProxy::stopRecording()
    322 {
    323     ALOGV("RecordingProxy::stopRecording");
    324     mCamera->stopRecording();
    325 }
    326 
    327 void Camera::RecordingProxy::releaseRecordingFrame(const sp<IMemory>& mem)
    328 {
    329     ALOGV("RecordingProxy::releaseRecordingFrame");
    330     mCamera->releaseRecordingFrame(mem);
    331 }
    332 
    333 Camera::RecordingProxy::RecordingProxy(const sp<Camera>& camera)
    334 {
    335     mCamera = camera;
    336 }
    337 
    338 }; // namespace android
    339