/* * Copyright (C) Texas Instruments - http://www.ti.com/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BASE_CAMERA_ADAPTER_H #define BASE_CAMERA_ADAPTER_H #include "CameraHal.h" namespace android { class BaseCameraAdapter : public CameraAdapter { public: BaseCameraAdapter(); virtual ~BaseCameraAdapter(); ///Initialzes the camera adapter creates any resources required virtual status_t initialize(CameraProperties::Properties*) = 0; virtual int setErrorHandler(ErrorNotifier *errorNotifier); //Message/Frame notification APIs virtual void enableMsgType(int32_t msgs, frame_callback callback=NULL, event_callback eventCb=NULL, void* cookie=NULL); virtual void disableMsgType(int32_t msgs, void* cookie); virtual void returnFrame(void * frameBuf, CameraFrame::FrameType frameType); virtual void addFramePointers(void *frameBuf, void *y_uv); virtual void removeFramePointers(); //APIs to configure Camera adapter and get the current parameter set virtual status_t setParameters(const CameraParameters& params) = 0; virtual void getParameters(CameraParameters& params) = 0; //API to send a command to the camera virtual status_t sendCommand(CameraCommands operation, int value1 = 0, int value2 = 0, int value3 = 0 ); virtual status_t registerImageReleaseCallback(release_image_buffers_callback callback, void *user_data); virtual status_t registerEndCaptureCallback(end_image_capture_callback callback, void *user_data); //Retrieves the current Adapter state virtual AdapterState getState(); //Retrieves the next Adapter state virtual AdapterState getNextState(); // Rolls the state machine back to INTIALIZED_STATE from the current state virtual status_t rollbackToInitializedState(); protected: //The first two methods will try to switch the adapter state. //Every call to setState() should be followed by a corresponding //call to commitState(). If the state switch fails, then it will //get reset to the previous state via rollbackState(). virtual status_t setState(CameraCommands operation); virtual status_t commitState(); virtual status_t rollbackState(); // Retrieves the current Adapter state - for internal use (not locked) virtual status_t getState(AdapterState &state); // Retrieves the next Adapter state - for internal use (not locked) virtual status_t getNextState(AdapterState &state); //-----------Interface that needs to be implemented by deriving classes -------------------- //Should be implmented by deriving classes in order to start image capture virtual status_t takePicture(); //Should be implmented by deriving classes in order to start image capture virtual status_t stopImageCapture(); //Should be implmented by deriving classes in order to start temporal bracketing virtual status_t startBracketing(int range); //Should be implemented by deriving classes in order to stop temporal bracketing virtual status_t stopBracketing(); //Should be implemented by deriving classes in oder to initiate autoFocus virtual status_t autoFocus(); //Should be implemented by deriving classes in oder to initiate autoFocus virtual status_t cancelAutoFocus(); //Should be called by deriving classes in order to do some bookkeeping virtual status_t startVideoCapture(); //Should be called by deriving classes in order to do some bookkeeping virtual status_t stopVideoCapture(); //Should be implemented by deriving classes in order to start camera preview virtual status_t startPreview(); //Should be implemented by deriving classes in order to stop camera preview virtual status_t stopPreview(); //Should be implemented by deriving classes in order to start smooth zoom virtual status_t startSmoothZoom(int targetIdx); //Should be implemented by deriving classes in order to stop smooth zoom virtual status_t stopSmoothZoom(); //Should be implemented by deriving classes in order to stop smooth zoom virtual status_t useBuffers(CameraMode mode, void* bufArr, int num, size_t length, unsigned int queueable); //Should be implemented by deriving classes in order queue a released buffer in CameraAdapter virtual status_t fillThisBuffer(void* frameBuf, CameraFrame::FrameType frameType); //API to get the frame size required to be allocated. This size is used to override the size passed //by camera service when VSTAB/VNF is turned ON for example virtual status_t getFrameSize(size_t &width, size_t &height); //API to get required data frame size virtual status_t getFrameDataSize(size_t &dataFrameSize, size_t bufferCount); //API to get required picture buffers size with the current configuration in CameraParameters virtual status_t getPictureBufferSize(size_t &length, size_t bufferCount); // Should be implemented by deriving classes in order to start face detection // ( if supported ) virtual status_t startFaceDetection(); // Should be implemented by deriving classes in order to stop face detection // ( if supported ) virtual status_t stopFaceDetection(); virtual status_t switchToExecuting(); // Receive orientation events from CameraHal virtual void onOrientationEvent(uint32_t orientation, uint32_t tilt); // ---------------------Interface ends----------------------------------- status_t notifyFocusSubscribers(CameraHalEvent::FocusStatus status); status_t notifyShutterSubscribers(); status_t notifyZoomSubscribers(int zoomIdx, bool targetReached); status_t notifyFaceSubscribers(sp<CameraFDResult> &faces); //Send the frame to subscribers status_t sendFrameToSubscribers(CameraFrame *frame); //Resets the refCount for this particular frame status_t resetFrameRefCount(CameraFrame &frame); //A couple of helper functions void setFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType, int refCount); int getFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType); int setInitFrameRefCount(void* buf, unsigned int mask); // private member functions private: status_t __sendFrameToSubscribers(CameraFrame* frame, KeyedVector<int, frame_callback> *subscribers, CameraFrame::FrameType frameType); status_t rollbackToPreviousState(); // protected data types and variables protected: enum FrameState { STOPPED = 0, RUNNING }; enum FrameCommands { START_PREVIEW = 0, START_RECORDING, RETURN_FRAME, STOP_PREVIEW, STOP_RECORDING, DO_AUTOFOCUS, TAKE_PICTURE, FRAME_EXIT }; enum AdapterCommands { ACK = 0, ERROR }; #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS struct timeval mStartFocus; struct timeval mStartCapture; #endif mutable Mutex mReturnFrameLock; //Lock protecting the Adapter state mutable Mutex mLock; AdapterState mAdapterState; AdapterState mNextState; //Different frame subscribers get stored using these KeyedVector<int, frame_callback> mFrameSubscribers; KeyedVector<int, frame_callback> mFrameDataSubscribers; KeyedVector<int, frame_callback> mVideoSubscribers; KeyedVector<int, frame_callback> mImageSubscribers; KeyedVector<int, frame_callback> mRawSubscribers; KeyedVector<int, event_callback> mFocusSubscribers; KeyedVector<int, event_callback> mZoomSubscribers; KeyedVector<int, event_callback> mShutterSubscribers; KeyedVector<int, event_callback> mFaceSubscribers; //Preview buffer management data int *mPreviewBuffers; int mPreviewBufferCount; size_t mPreviewBuffersLength; KeyedVector<int, int> mPreviewBuffersAvailable; mutable Mutex mPreviewBufferLock; //Video buffer management data int *mVideoBuffers; KeyedVector<int, int> mVideoBuffersAvailable; int mVideoBuffersCount; size_t mVideoBuffersLength; mutable Mutex mVideoBufferLock; //Image buffer management data int *mCaptureBuffers; KeyedVector<int, bool> mCaptureBuffersAvailable; int mCaptureBuffersCount; size_t mCaptureBuffersLength; mutable Mutex mCaptureBufferLock; //Metadata buffermanagement int *mPreviewDataBuffers; KeyedVector<int, bool> mPreviewDataBuffersAvailable; int mPreviewDataBuffersCount; size_t mPreviewDataBuffersLength; mutable Mutex mPreviewDataBufferLock; TIUTILS::MessageQueue mFrameQ; TIUTILS::MessageQueue mAdapterQ; mutable Mutex mSubscriberLock; ErrorNotifier *mErrorNotifier; release_image_buffers_callback mReleaseImageBuffersCallback; end_image_capture_callback mEndImageCaptureCallback; void *mReleaseData; void *mEndCaptureData; bool mRecording; uint32_t mFramesWithDucati; uint32_t mFramesWithDisplay; uint32_t mFramesWithEncoder; #ifdef DEBUG_LOG KeyedVector<int, bool> mBuffersWithDucati; #endif KeyedVector<void *, CameraFrame *> mFrameQueue; }; }; #endif //BASE_CAMERA_ADAPTER_H