Home | History | Annotate | Download | only in camera
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_HARDWARE_CAMERA_H
     18 #define ANDROID_HARDWARE_CAMERA_H
     19 
     20 #include <utils/Timers.h>
     21 
     22 #include <android/hardware/ICameraService.h>
     23 
     24 #include <gui/IGraphicBufferProducer.h>
     25 #include <system/camera.h>
     26 #include <camera/ICameraRecordingProxy.h>
     27 #include <camera/ICameraRecordingProxyListener.h>
     28 #include <camera/android/hardware/ICamera.h>
     29 #include <camera/android/hardware/ICameraClient.h>
     30 #include <camera/CameraBase.h>
     31 
     32 namespace android {
     33 
     34 class Surface;
     35 class String8;
     36 class String16;
     37 
     38 // ref-counted object for callbacks
     39 class CameraListener: virtual public RefBase
     40 {
     41 public:
     42     virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0;
     43     virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr,
     44                           camera_frame_metadata_t *metadata) = 0;
     45     virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) = 0;
     46     virtual void postRecordingFrameHandleTimestamp(nsecs_t timestamp, native_handle_t* handle) = 0;
     47 };
     48 
     49 class Camera;
     50 
     51 template <>
     52 struct CameraTraits<Camera>
     53 {
     54     typedef CameraListener                     TCamListener;
     55     typedef ::android::hardware::ICamera       TCamUser;
     56     typedef ::android::hardware::ICameraClient TCamCallbacks;
     57     typedef ::android::binder::Status(::android::hardware::ICameraService::*TCamConnectService)
     58         (const sp<::android::hardware::ICameraClient>&,
     59         int, const String16&, int, int,
     60         /*out*/
     61         sp<::android::hardware::ICamera>*);
     62     static TCamConnectService     fnConnectService;
     63 };
     64 
     65 
     66 class Camera :
     67     public CameraBase<Camera>,
     68     public ::android::hardware::BnCameraClient
     69 {
     70 public:
     71     enum {
     72         USE_CALLING_UID = ::android::hardware::ICameraService::USE_CALLING_UID
     73     };
     74     enum {
     75         USE_CALLING_PID = ::android::hardware::ICameraService::USE_CALLING_PID
     76     };
     77 
     78             // construct a camera client from an existing remote
     79     static  sp<Camera>  create(const sp<::android::hardware::ICamera>& camera);
     80     static  sp<Camera>  connect(int cameraId,
     81                                 const String16& clientPackageName,
     82                                 int clientUid, int clientPid);
     83 
     84     static  status_t  connectLegacy(int cameraId, int halVersion,
     85                                      const String16& clientPackageName,
     86                                      int clientUid, sp<Camera>& camera);
     87 
     88             virtual     ~Camera();
     89 
     90             status_t    reconnect();
     91             status_t    lock();
     92             status_t    unlock();
     93 
     94             // pass the buffered IGraphicBufferProducer to the camera service
     95             status_t    setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer);
     96 
     97             // start preview mode, must call setPreviewTarget first
     98             status_t    startPreview();
     99 
    100             // stop preview mode
    101             void        stopPreview();
    102 
    103             // get preview state
    104             bool        previewEnabled();
    105 
    106             // start recording mode, must call setPreviewTarget first
    107             status_t    startRecording();
    108 
    109             // stop recording mode
    110             void        stopRecording();
    111 
    112             // get recording state
    113             bool        recordingEnabled();
    114 
    115             // release a recording frame
    116             void        releaseRecordingFrame(const sp<IMemory>& mem);
    117 
    118             // release a recording frame handle
    119             void        releaseRecordingFrameHandle(native_handle_t *handle);
    120 
    121             // autoFocus - status returned from callback
    122             status_t    autoFocus();
    123 
    124             // cancel auto focus
    125             status_t    cancelAutoFocus();
    126 
    127             // take a picture - picture returned from callback
    128             status_t    takePicture(int msgType);
    129 
    130             // set preview/capture parameters - key/value pairs
    131             status_t    setParameters(const String8& params);
    132 
    133             // get preview/capture parameters - key/value pairs
    134             String8     getParameters() const;
    135 
    136             // send command to camera driver
    137             status_t    sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
    138 
    139             // Tell camera how to pass video buffers. videoBufferMode is one of VIDEO_BUFFER_MODE_*.
    140             // Returns OK if the specified video buffer mode is supported. If videoBufferMode is
    141             // VIDEO_BUFFER_MODE_BUFFER_QUEUE, setVideoTarget() must be called before starting
    142             // video recording.
    143             status_t    setVideoBufferMode(int32_t videoBufferMode);
    144 
    145             // Set the video buffer producer for camera to use in VIDEO_BUFFER_MODE_BUFFER_QUEUE
    146             // mode.
    147             status_t    setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer);
    148 
    149             void        setListener(const sp<CameraListener>& listener);
    150             void        setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener);
    151 
    152             // Configure preview callbacks to app. Only one of the older
    153             // callbacks or the callback surface can be active at the same time;
    154             // enabling one will disable the other if active. Flags can be
    155             // disabled by calling it with CAMERA_FRAME_CALLBACK_FLAG_NOOP, and
    156             // Target by calling it with a NULL interface.
    157             void        setPreviewCallbackFlags(int preview_callback_flag);
    158             status_t    setPreviewCallbackTarget(
    159                     const sp<IGraphicBufferProducer>& callbackProducer);
    160 
    161             sp<ICameraRecordingProxy> getRecordingProxy();
    162 
    163     // ICameraClient interface
    164     virtual void        notifyCallback(int32_t msgType, int32_t ext, int32_t ext2);
    165     virtual void        dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
    166                                      camera_frame_metadata_t *metadata);
    167     virtual void        dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);
    168     virtual void        recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle);
    169 
    170     class RecordingProxy : public BnCameraRecordingProxy
    171     {
    172     public:
    173         RecordingProxy(const sp<Camera>& camera);
    174 
    175         // ICameraRecordingProxy interface
    176         virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener);
    177         virtual void stopRecording();
    178         virtual void releaseRecordingFrame(const sp<IMemory>& mem);
    179         virtual void releaseRecordingFrameHandle(native_handle_t* handle);
    180 
    181     private:
    182         sp<Camera>         mCamera;
    183     };
    184 
    185 protected:
    186                         Camera(int cameraId);
    187                         Camera(const Camera&);
    188                         Camera& operator=(const Camera);
    189 
    190     sp<ICameraRecordingProxyListener>  mRecordingProxyListener;
    191 
    192     friend class        CameraBase;
    193 };
    194 
    195 }; // namespace android
    196 
    197 #endif
    198