/*
* 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