Home | History | Annotate | Download | only in inc
      1 /*
      2  * Copyright (C) Texas Instruments - http://www.ti.com/
      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 
     18 
     19 #ifndef BASE_CAMERA_ADAPTER_H
     20 #define BASE_CAMERA_ADAPTER_H
     21 
     22 #include "CameraHal.h"
     23 
     24 namespace android {
     25 
     26 class BaseCameraAdapter : public CameraAdapter
     27 {
     28 
     29 public:
     30 
     31     BaseCameraAdapter();
     32     virtual ~BaseCameraAdapter();
     33 
     34     ///Initialzes the camera adapter creates any resources required
     35     virtual status_t initialize(CameraProperties::Properties*) = 0;
     36 
     37     virtual int setErrorHandler(ErrorNotifier *errorNotifier);
     38 
     39     //Message/Frame notification APIs
     40     virtual void enableMsgType(int32_t msgs, frame_callback callback=NULL, event_callback eventCb=NULL, void* cookie=NULL);
     41     virtual void disableMsgType(int32_t msgs, void* cookie);
     42     virtual void returnFrame(void * frameBuf, CameraFrame::FrameType frameType);
     43     virtual void addFramePointers(void *frameBuf, void *y_uv);
     44     virtual void removeFramePointers();
     45 
     46     //APIs to configure Camera adapter and get the current parameter set
     47     virtual status_t setParameters(const CameraParameters& params) = 0;
     48     virtual void getParameters(CameraParameters& params)  = 0;
     49 
     50     //API to send a command to the camera
     51     virtual status_t sendCommand(CameraCommands operation, int value1 = 0, int value2 = 0, int value3 = 0 );
     52 
     53     virtual status_t registerImageReleaseCallback(release_image_buffers_callback callback, void *user_data);
     54 
     55     virtual status_t registerEndCaptureCallback(end_image_capture_callback callback, void *user_data);
     56 
     57     //Retrieves the current Adapter state
     58     virtual AdapterState getState();
     59     //Retrieves the next Adapter state
     60     virtual AdapterState getNextState();
     61 
     62     // Rolls the state machine back to INTIALIZED_STATE from the current state
     63     virtual status_t rollbackToInitializedState();
     64 
     65 protected:
     66     //The first two methods will try to switch the adapter state.
     67     //Every call to setState() should be followed by a corresponding
     68     //call to commitState(). If the state switch fails, then it will
     69     //get reset to the previous state via rollbackState().
     70     virtual status_t setState(CameraCommands operation);
     71     virtual status_t commitState();
     72     virtual status_t rollbackState();
     73 
     74     // Retrieves the current Adapter state - for internal use (not locked)
     75     virtual status_t getState(AdapterState &state);
     76     // Retrieves the next Adapter state - for internal use (not locked)
     77     virtual status_t getNextState(AdapterState &state);
     78 
     79     //-----------Interface that needs to be implemented by deriving classes --------------------
     80 
     81     //Should be implmented by deriving classes in order to start image capture
     82     virtual status_t takePicture();
     83 
     84     //Should be implmented by deriving classes in order to start image capture
     85     virtual status_t stopImageCapture();
     86 
     87     //Should be implmented by deriving classes in order to start temporal bracketing
     88     virtual status_t startBracketing(int range);
     89 
     90     //Should be implemented by deriving classes in order to stop temporal bracketing
     91     virtual status_t stopBracketing();
     92 
     93     //Should be implemented by deriving classes in oder to initiate autoFocus
     94     virtual status_t autoFocus();
     95 
     96     //Should be implemented by deriving classes in oder to initiate autoFocus
     97     virtual status_t cancelAutoFocus();
     98 
     99     //Should be called by deriving classes in order to do some bookkeeping
    100     virtual status_t startVideoCapture();
    101 
    102     //Should be called by deriving classes in order to do some bookkeeping
    103     virtual status_t stopVideoCapture();
    104 
    105     //Should be implemented by deriving classes in order to start camera preview
    106     virtual status_t startPreview();
    107 
    108     //Should be implemented by deriving classes in order to stop camera preview
    109     virtual status_t stopPreview();
    110 
    111     //Should be implemented by deriving classes in order to start smooth zoom
    112     virtual status_t startSmoothZoom(int targetIdx);
    113 
    114     //Should be implemented by deriving classes in order to stop smooth zoom
    115     virtual status_t stopSmoothZoom();
    116 
    117     //Should be implemented by deriving classes in order to stop smooth zoom
    118     virtual status_t useBuffers(CameraMode mode, void* bufArr, int num, size_t length, unsigned int queueable);
    119 
    120     //Should be implemented by deriving classes in order queue a released buffer in CameraAdapter
    121     virtual status_t fillThisBuffer(void* frameBuf, CameraFrame::FrameType frameType);
    122 
    123     //API to get the frame size required to be allocated. This size is used to override the size passed
    124     //by camera service when VSTAB/VNF is turned ON for example
    125     virtual status_t getFrameSize(size_t &width, size_t &height);
    126 
    127     //API to get required data frame size
    128     virtual status_t getFrameDataSize(size_t &dataFrameSize, size_t bufferCount);
    129 
    130     //API to get required picture buffers size with the current configuration in CameraParameters
    131     virtual status_t getPictureBufferSize(size_t &length, size_t bufferCount);
    132 
    133     // Should be implemented by deriving classes in order to start face detection
    134     // ( if supported )
    135     virtual status_t startFaceDetection();
    136 
    137     // Should be implemented by deriving classes in order to stop face detection
    138     // ( if supported )
    139     virtual status_t stopFaceDetection();
    140 
    141     virtual status_t switchToExecuting();
    142 
    143     // Receive orientation events from CameraHal
    144     virtual void onOrientationEvent(uint32_t orientation, uint32_t tilt);
    145 
    146     // ---------------------Interface ends-----------------------------------
    147 
    148     status_t notifyFocusSubscribers(CameraHalEvent::FocusStatus status);
    149     status_t notifyShutterSubscribers();
    150     status_t notifyZoomSubscribers(int zoomIdx, bool targetReached);
    151     status_t notifyFaceSubscribers(sp<CameraFDResult> &faces);
    152 
    153     //Send the frame to subscribers
    154     status_t sendFrameToSubscribers(CameraFrame *frame);
    155 
    156     //Resets the refCount for this particular frame
    157     status_t resetFrameRefCount(CameraFrame &frame);
    158 
    159     //A couple of helper functions
    160     void setFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType, int refCount);
    161     int getFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType);
    162     int setInitFrameRefCount(void* buf, unsigned int mask);
    163 
    164 // private member functions
    165 private:
    166     status_t __sendFrameToSubscribers(CameraFrame* frame,
    167                                       KeyedVector<int, frame_callback> *subscribers,
    168                                       CameraFrame::FrameType frameType);
    169     status_t rollbackToPreviousState();
    170 
    171 // protected data types and variables
    172 protected:
    173     enum FrameState {
    174         STOPPED = 0,
    175         RUNNING
    176     };
    177 
    178     enum FrameCommands {
    179         START_PREVIEW = 0,
    180         START_RECORDING,
    181         RETURN_FRAME,
    182         STOP_PREVIEW,
    183         STOP_RECORDING,
    184         DO_AUTOFOCUS,
    185         TAKE_PICTURE,
    186         FRAME_EXIT
    187     };
    188 
    189     enum AdapterCommands {
    190         ACK = 0,
    191         ERROR
    192     };
    193 
    194 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
    195 
    196     struct timeval mStartFocus;
    197     struct timeval mStartCapture;
    198 
    199 #endif
    200 
    201     mutable Mutex mReturnFrameLock;
    202 
    203     //Lock protecting the Adapter state
    204     mutable Mutex mLock;
    205     AdapterState mAdapterState;
    206     AdapterState mNextState;
    207 
    208     //Different frame subscribers get stored using these
    209     KeyedVector<int, frame_callback> mFrameSubscribers;
    210     KeyedVector<int, frame_callback> mFrameDataSubscribers;
    211     KeyedVector<int, frame_callback> mVideoSubscribers;
    212     KeyedVector<int, frame_callback> mImageSubscribers;
    213     KeyedVector<int, frame_callback> mRawSubscribers;
    214     KeyedVector<int, event_callback> mFocusSubscribers;
    215     KeyedVector<int, event_callback> mZoomSubscribers;
    216     KeyedVector<int, event_callback> mShutterSubscribers;
    217     KeyedVector<int, event_callback> mFaceSubscribers;
    218 
    219     //Preview buffer management data
    220     int *mPreviewBuffers;
    221     int mPreviewBufferCount;
    222     size_t mPreviewBuffersLength;
    223     KeyedVector<int, int> mPreviewBuffersAvailable;
    224     mutable Mutex mPreviewBufferLock;
    225 
    226     //Video buffer management data
    227     int *mVideoBuffers;
    228     KeyedVector<int, int> mVideoBuffersAvailable;
    229     int mVideoBuffersCount;
    230     size_t mVideoBuffersLength;
    231     mutable Mutex mVideoBufferLock;
    232 
    233     //Image buffer management data
    234     int *mCaptureBuffers;
    235     KeyedVector<int, bool> mCaptureBuffersAvailable;
    236     int mCaptureBuffersCount;
    237     size_t mCaptureBuffersLength;
    238     mutable Mutex mCaptureBufferLock;
    239 
    240     //Metadata buffermanagement
    241     int *mPreviewDataBuffers;
    242     KeyedVector<int, bool> mPreviewDataBuffersAvailable;
    243     int mPreviewDataBuffersCount;
    244     size_t mPreviewDataBuffersLength;
    245     mutable Mutex mPreviewDataBufferLock;
    246 
    247     TIUTILS::MessageQueue mFrameQ;
    248     TIUTILS::MessageQueue mAdapterQ;
    249     mutable Mutex mSubscriberLock;
    250     ErrorNotifier *mErrorNotifier;
    251     release_image_buffers_callback mReleaseImageBuffersCallback;
    252     end_image_capture_callback mEndImageCaptureCallback;
    253     void *mReleaseData;
    254     void *mEndCaptureData;
    255     bool mRecording;
    256 
    257     uint32_t mFramesWithDucati;
    258     uint32_t mFramesWithDisplay;
    259     uint32_t mFramesWithEncoder;
    260 
    261 #ifdef DEBUG_LOG
    262     KeyedVector<int, bool> mBuffersWithDucati;
    263 #endif
    264 
    265     KeyedVector<void *, CameraFrame *> mFrameQueue;
    266 };
    267 
    268 };
    269 
    270 #endif //BASE_CAMERA_ADAPTER_H
    271 
    272 
    273