diff options
Diffstat (limited to 'camera/inc/CameraHal.h')
-rw-r--r-- | camera/inc/CameraHal.h | 1484 |
1 files changed, 0 insertions, 1484 deletions
diff --git a/camera/inc/CameraHal.h b/camera/inc/CameraHal.h deleted file mode 100644 index 4fded38..0000000 --- a/camera/inc/CameraHal.h +++ /dev/null @@ -1,1484 +0,0 @@ -/* - * 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 ANDROID_HARDWARE_CAMERA_HARDWARE_H -#define ANDROID_HARDWARE_CAMERA_HARDWARE_H - -#include <stdio.h> -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <time.h> -#include <fcntl.h> -#include <sys/ioctl.h> -#include <sys/mman.h> -#include <sys/stat.h> - -#include <hardware/camera.h> -#include <utils/Log.h> -#include <utils/threads.h> -#include <utils/threads.h> -#include <binder/MemoryBase.h> -#include <binder/MemoryHeapBase.h> -#include <camera/CameraParameters.h> -#ifdef OMAP_ENHANCEMENT_CPCAM -#include <camera/CameraMetadata.h> -#include <camera/ShotParameters.h> -#endif -#include <ui/GraphicBufferAllocator.h> -#include <ui/GraphicBuffer.h> - -/* For IMG_native_handle_t */ -#include <ui/GraphicBufferMapper.h> -#include <hal_public.h> - -#include <ion_ti/ion.h> - -#include "Common.h" -#include "MessageQueue.h" -#include "Semaphore.h" -#include "CameraProperties.h" -#include "SensorListener.h" - -//temporarily define format here -#define HAL_PIXEL_FORMAT_TI_NV12 0x100 -#define HAL_PIXEL_FORMAT_TI_Y8 0x103 -#define HAL_PIXEL_FORMAT_TI_Y16 0x104 - -#define MIN_WIDTH 640 -#define MIN_HEIGHT 480 -#ifdef OMAP_TUNA -#define PICTURE_WIDTH 2592 /* 5mp - 2560. 8mp - 3280 */ /* Make sure it is a multiple of 16. */ -#define PICTURE_HEIGHT 1944 /* 5mp - 2048. 8mp - 2464 */ /* Make sure it is a multiple of 16. */ -#else -#define PICTURE_WIDTH 3264 /* 5mp - 2560. 8mp - 3280 */ /* Make sure it is a multiple of 16. */ -#define PICTURE_HEIGHT 2448 /* 5mp - 2048. 8mp - 2464 */ /* Make sure it is a multiple of 16. */ -#endif -#define PREVIEW_WIDTH 176 -#define PREVIEW_HEIGHT 144 -#define PIXEL_FORMAT V4L2_PIX_FMT_UYVY - -#define VIDEO_FRAME_COUNT_MAX 8 //NUM_OVERLAY_BUFFERS_REQUESTED -#define MAX_CAMERA_BUFFERS 8 //NUM_OVERLAY_BUFFERS_REQUESTED -#define MAX_ZOOM 3 -#define THUMB_WIDTH 80 -#define THUMB_HEIGHT 60 -#define PIX_YUV422I 0 -#define PIX_YUV420P 1 - -#define SATURATION_OFFSET 100 -#define SHARPNESS_OFFSET 100 -#define CONTRAST_OFFSET 100 - -#define FRAME_RATE_HIGH_HD 60 - -#define CAMHAL_GRALLOC_USAGE GRALLOC_USAGE_HW_TEXTURE | \ - GRALLOC_USAGE_HW_RENDER | \ - GRALLOC_USAGE_SW_READ_RARELY | \ - GRALLOC_USAGE_SW_WRITE_NEVER - -//Enables Absolute PPM measurements in logcat -#ifdef CAMERAHAL_SUPERVERBOSE -#define PPM_INSTRUMENTATION_ABS 1 -#endif - -#define LOCK_BUFFER_TRIES 5 -#define HAL_PIXEL_FORMAT_NV12 0x100 - -#define NONNEG_ASSIGN(x,y) \ - if(x > -1) \ - y = x - -#define CAMHAL_SIZE_OF_ARRAY(x) static_cast<int>(sizeof(x)/sizeof(x[0])) - -namespace Ti { -namespace Camera { - -#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING -extern const char * const kRawImagesOutputDirPath; -extern const char * const kYuvImagesOutputDirPath; -#endif -#define V4L_CAMERA_NAME_USB "USBCAMERA" -#define OMX_CAMERA_NAME_OV "OV5640" -#define OMX_CAMERA_NAME_SONY "IMX060" - - -///Forward declarations -class CameraHal; -class CameraFrame; -class CameraHalEvent; -class DisplayFrame; - -class FpsRange { -public: - static int compare(const FpsRange * left, const FpsRange * right); - - FpsRange(int min, int max); - FpsRange(); - - bool operator==(const FpsRange & fpsRange) const; - - bool isNull() const; - bool isFixed() const; - - int min() const; - int max() const; - -private: - int mMin; - int mMax; -}; - - -inline int FpsRange::compare(const FpsRange * const left, const FpsRange * const right) { - if ( left->max() < right->max() ) { - return -1; - } - - if ( left->max() > right->max() ) { - return 1; - } - - if ( left->min() < right->min() ) { - return -1; - } - - if ( left->min() > right->min() ) { - return 1; - } - - return 0; -} - -inline FpsRange::FpsRange(const int min, const int max) : mMin(min), mMax(max) {} - -inline FpsRange::FpsRange() : mMin(-1), mMax(-1) {} - -inline bool FpsRange::operator==(const FpsRange & fpsRange) const { - return mMin == fpsRange.mMin && mMax == fpsRange.mMax; -} - -inline bool FpsRange::isNull() const { - return mMin == -1 || mMax == -1; -} - -inline bool FpsRange::isFixed() const { - return mMin == mMax; -} - -inline int FpsRange::min() const { return mMin; } - -inline int FpsRange::max() const { return mMax; } - -class CameraArea : public android::RefBase -{ -public: - - CameraArea(ssize_t top, - ssize_t left, - ssize_t bottom, - ssize_t right, - size_t weight) : mTop(top), - mLeft(left), - mBottom(bottom), - mRight(right), - mWeight(weight) {} - - status_t transfrom(size_t width, - size_t height, - size_t &top, - size_t &left, - size_t &areaWidth, - size_t &areaHeight); - - bool isValid() - { - return ( ( 0 != mTop ) || ( 0 != mLeft ) || ( 0 != mBottom ) || ( 0 != mRight) ); - } - - bool isZeroArea() - { - return ( (0 == mTop ) && ( 0 == mLeft ) && ( 0 == mBottom ) - && ( 0 == mRight ) && ( 0 == mWeight )); - } - - size_t getWeight() - { - return mWeight; - } - - bool compare(const android::sp<CameraArea> &area); - - static status_t parseAreas(const char *area, - size_t areaLength, - android::Vector< android::sp<CameraArea> > &areas); - - static status_t checkArea(ssize_t top, - ssize_t left, - ssize_t bottom, - ssize_t right, - ssize_t weight); - - static bool areAreasDifferent(android::Vector< android::sp<CameraArea> > &, android::Vector< android::sp<CameraArea> > &); - -protected: - static const ssize_t TOP = -1000; - static const ssize_t LEFT = -1000; - static const ssize_t BOTTOM = 1000; - static const ssize_t RIGHT = 1000; - static const ssize_t WEIGHT_MIN = 1; - static const ssize_t WEIGHT_MAX = 1000; - - ssize_t mTop; - ssize_t mLeft; - ssize_t mBottom; - ssize_t mRight; - size_t mWeight; -}; - -class CameraMetadataResult : public android::RefBase -{ -public: - -#ifdef OMAP_ENHANCEMENT_CPCAM - CameraMetadataResult(camera_memory_t * extMeta) : mExtendedMetadata(extMeta) { - mMetadata.faces = NULL; - mMetadata.number_of_faces = 0; -#ifdef OMAP_ENHANCEMENT - mMetadata.analog_gain = 0; - mMetadata.exposure_time = 0; -#endif - }; -#endif - - CameraMetadataResult() { - mMetadata.faces = NULL; - mMetadata.number_of_faces = 0; -#ifdef OMAP_ENHANCEMENT_CPCAM - mMetadata.analog_gain = 0; - mMetadata.exposure_time = 0; -#endif - -#ifdef OMAP_ENHANCEMENT_CPCAM - mExtendedMetadata = NULL; -#endif - } - - virtual ~CameraMetadataResult() { - if ( NULL != mMetadata.faces ) { - free(mMetadata.faces); - } -#ifdef OMAP_ENHANCEMENT_CPCAM - if ( NULL != mExtendedMetadata ) { - mExtendedMetadata->release(mExtendedMetadata); - } -#endif - } - - camera_frame_metadata_t *getMetadataResult() { return &mMetadata; }; - -#ifdef OMAP_ENHANCEMENT_CPCAM - camera_memory_t *getExtendedMetadata() { return mExtendedMetadata; }; -#endif - - static const ssize_t TOP = -1000; - static const ssize_t LEFT = -1000; - static const ssize_t BOTTOM = 1000; - static const ssize_t RIGHT = 1000; - static const ssize_t INVALID_DATA = -2000; - -private: - - camera_frame_metadata_t mMetadata; -#ifdef OMAP_ENHANCEMENT_CPCAM - camera_memory_t *mExtendedMetadata; -#endif -}; - -typedef enum { - CAMERA_BUFFER_NONE = 0, - CAMERA_BUFFER_GRALLOC, - CAMERA_BUFFER_ANW, - CAMERA_BUFFER_MEMORY, - CAMERA_BUFFER_ION -} CameraBufferType; - -typedef struct _CameraBuffer { - CameraBufferType type; - /* opaque is the generic drop-in replacement for the pointers - * that were used previously */ - void *opaque; - - /* opaque has different meanings depending on the buffer type: - * GRALLOC - gralloc_handle_t - * ANW - a pointer to the buffer_handle_t (which corresponds to - * the ANativeWindowBuffer *) - * MEMORY - address of allocated memory - * ION - address of mapped ion allocation - * - * FIXME opaque should be split into several fields: - * - handle/pointer we got from the allocator - * - handle/value we pass to OMX - * - pointer to mapped memory (if the buffer is mapped) - */ - - /* mapped holds ptr to mapped memory in userspace */ - void *mapped; - - /* These are specific to ION buffers */ - struct ion_handle * ion_handle; - int ion_fd; - int fd; - size_t size; - int index; - - /* These describe the camera buffer */ - int width; - int stride; - int height; - const char *format; -} CameraBuffer; - -void * camera_buffer_get_omx_ptr (CameraBuffer *buffer); - -class CameraFrame -{ - public: - - enum FrameType - { - PREVIEW_FRAME_SYNC = 0x1, ///SYNC implies that the frame needs to be explicitly returned after consuming in order to be filled by camera again - PREVIEW_FRAME = 0x2 , ///Preview frame includes viewfinder and snapshot frames - IMAGE_FRAME_SYNC = 0x4, ///Image Frame is the image capture output frame - IMAGE_FRAME = 0x8, - VIDEO_FRAME_SYNC = 0x10, ///Timestamp will be updated for these frames - VIDEO_FRAME = 0x20, - FRAME_DATA_SYNC = 0x40, ///Any extra data assosicated with the frame. Always synced with the frame - FRAME_DATA= 0x80, - RAW_FRAME = 0x100, - SNAPSHOT_FRAME = 0x200, - REPROCESS_INPUT_FRAME = 0x400, - ALL_FRAMES = 0xFFFF ///Maximum of 16 frame types supported - }; - - enum FrameQuirks - { - ENCODE_RAW_YUV422I_TO_JPEG = 0x1 << 0, - HAS_EXIF_DATA = 0x1 << 1, - FORMAT_YUV422I_YUYV = 0x1 << 2, - FORMAT_YUV422I_UYVY = 0x1 << 3, - }; - - //default contrustor - CameraFrame(): - mCookie(NULL), - mCookie2(NULL), - mBuffer(NULL), - mFrameType(0), - mTimestamp(0), - mWidth(0), - mHeight(0), - mOffset(0), - mAlignment(0), - mFd(0), - mLength(0), - mFrameMask(0), - mQuirks(0) - { - mYuv[0] = 0; //NULL; - mYuv[1] = 0; //NULL; - -#ifdef OMAP_ENHANCEMENT_CPCAM - mMetaData = 0; -#endif - } - - void *mCookie; - void *mCookie2; - CameraBuffer *mBuffer; - int mFrameType; - nsecs_t mTimestamp; - unsigned int mWidth, mHeight; - uint32_t mOffset; - unsigned int mAlignment; - int mFd; - size_t mLength; - unsigned mFrameMask; - unsigned int mQuirks; - unsigned int mYuv[2]; -#ifdef OMAP_ENHANCEMENT_CPCAM - android::sp<CameraMetadataResult> mMetaData; -#endif - ///@todo add other member vars like stride etc -}; - -enum CameraHalError -{ - CAMERA_ERROR_FATAL = 0x1, //Fatal errors can only be recovered by restarting media server - CAMERA_ERROR_HARD = 0x2, // Hard errors are hardware hangs that may be recoverable by resetting the hardware internally within the adapter - CAMERA_ERROR_SOFT = 0x4, // Soft errors are non fatal errors that can be recovered from without needing to stop use-case -}; - -///Common Camera Hal Event class which is visible to CameraAdapter,DisplayAdapter and AppCallbackNotifier -///@todo Rename this class to CameraEvent -class CameraHalEvent -{ -public: - //Enums - enum CameraHalEventType { - NO_EVENTS = 0x0, - EVENT_FOCUS_LOCKED = 0x1, - EVENT_FOCUS_ERROR = 0x2, - EVENT_ZOOM_INDEX_REACHED = 0x4, - EVENT_SHUTTER = 0x8, - EVENT_METADATA = 0x10, - ///@remarks Future enum related to display, like frame displayed event, could be added here - ALL_EVENTS = 0xFFFF ///Maximum of 16 event types supported - }; - - enum FocusStatus { - FOCUS_STATUS_SUCCESS = 0x1, - FOCUS_STATUS_FAIL = 0x2, - FOCUS_STATUS_PENDING = 0x4, - FOCUS_STATUS_DONE = 0x8, - }; - - ///Class declarations - ///@remarks Add a new class for a new event type added above - - //Shutter event specific data - typedef struct ShutterEventData_t { - bool shutterClosed; - }ShutterEventData; - - ///Focus event specific data - typedef struct FocusEventData_t { - FocusStatus focusStatus; - int currentFocusValue; - } FocusEventData; - - ///Zoom specific event data - typedef struct ZoomEventData_t { - int currentZoomIndex; - bool targetZoomIndexReached; - } ZoomEventData; - - typedef struct FaceData_t { - ssize_t top; - ssize_t left; - ssize_t bottom; - ssize_t right; - size_t score; - } FaceData; - - typedef android::sp<CameraMetadataResult> MetaEventData; - - class CameraHalEventData : public android::RefBase{ - - public: - - CameraHalEvent::FocusEventData focusEvent; - CameraHalEvent::ZoomEventData zoomEvent; - CameraHalEvent::ShutterEventData shutterEvent; - CameraHalEvent::MetaEventData metadataEvent; - }; - - //default contrustor - CameraHalEvent(): - mCookie(NULL), - mEventType(NO_EVENTS) {} - - //copy constructor - CameraHalEvent(const CameraHalEvent &event) : - mCookie(event.mCookie), - mEventType(event.mEventType), - mEventData(event.mEventData) {}; - - void* mCookie; - CameraHalEventType mEventType; - android::sp<CameraHalEventData> mEventData; - -}; - -/// Have a generic callback class based on template - to adapt CameraFrame and Event -typedef void (*frame_callback) (CameraFrame *cameraFrame); -typedef void (*event_callback) (CameraHalEvent *event); - -//signals CameraHAL to relase image buffers -typedef void (*release_image_buffers_callback) (void *userData); -typedef void (*end_image_capture_callback) (void *userData); - -/** - * Interface class implemented by classes that have some events to communicate to dependendent classes - * Dependent classes use this interface for registering for events - */ -class MessageNotifier -{ -public: - static const uint32_t EVENT_BIT_FIELD_POSITION; - static const uint32_t FRAME_BIT_FIELD_POSITION; - - ///@remarks Msg type comes from CameraFrame and CameraHalEvent classes - /// MSB 16 bits is for events and LSB 16 bits is for frame notifications - /// FrameProvider and EventProvider classes act as helpers to event/frame - /// consumers to call this api - virtual void enableMsgType(int32_t msgs, frame_callback frameCb=NULL, event_callback eventCb=NULL, void* cookie=NULL) = 0; - virtual void disableMsgType(int32_t msgs, void* cookie) = 0; - - virtual ~MessageNotifier() {}; -}; - -class ErrorNotifier : public virtual android::RefBase -{ -public: - virtual void errorNotify(int error) = 0; - - virtual ~ErrorNotifier() {}; -}; - - -/** - * Interace class abstraction for Camera Adapter to act as a frame provider - * This interface is fully implemented by Camera Adapter - */ -class FrameNotifier : public MessageNotifier -{ -public: - virtual void returnFrame(CameraBuffer* frameBuf, CameraFrame::FrameType frameType) = 0; - virtual void addFramePointers(CameraBuffer *frameBuf, void *buf) = 0; - virtual void removeFramePointers() = 0; - - virtual ~FrameNotifier() {}; -}; - -/** * Wrapper class around Frame Notifier, which is used by display and notification classes for interacting with Camera Adapter - */ -class FrameProvider -{ - FrameNotifier* mFrameNotifier; - void* mCookie; - frame_callback mFrameCallback; - -public: - FrameProvider(FrameNotifier *fn, void* cookie, frame_callback frameCallback) - :mFrameNotifier(fn), mCookie(cookie),mFrameCallback(frameCallback) { } - - int enableFrameNotification(int32_t frameTypes); - int disableFrameNotification(int32_t frameTypes); - int returnFrame(CameraBuffer *frameBuf, CameraFrame::FrameType frameType); - void addFramePointers(CameraBuffer *frameBuf, void *buf); - void removeFramePointers(); -}; - -/** Wrapper class around MessageNotifier, which is used by display and notification classes for interacting with - * Camera Adapter - */ -class EventProvider -{ -public: - MessageNotifier* mEventNotifier; - void* mCookie; - event_callback mEventCallback; - -public: - EventProvider(MessageNotifier *mn, void* cookie, event_callback eventCallback) - :mEventNotifier(mn), mCookie(cookie), mEventCallback(eventCallback) {} - - int enableEventNotification(int32_t eventTypes); - int disableEventNotification(int32_t eventTypes); -}; - -/* - * Interface for providing buffers - */ -class BufferProvider -{ -public: - virtual CameraBuffer * allocateBufferList(int width, int height, const char* format, int &bytes, int numBufs) = 0; - - // gets a buffer list from BufferProvider when buffers are sent from external source and already pre-allocated - // only call this function for an input source into CameraHal. If buffers are not from a pre-allocated source - // this function will return NULL and numBufs of -1 - virtual CameraBuffer *getBufferList(int *numBufs) = 0; - - //additional methods used for memory mapping - virtual uint32_t * getOffsets() = 0; - virtual int getFd() = 0; - - virtual int freeBufferList(CameraBuffer * buf) = 0; - - virtual ~BufferProvider() {} -}; - -/** - * Class for handling data and notify callbacks to application - */ -class AppCallbackNotifier: public ErrorNotifier , public virtual android::RefBase -{ - -public: - - ///Constants - static const int NOTIFIER_TIMEOUT; - static const int32_t MAX_BUFFERS = 8; - - enum NotifierCommands - { - NOTIFIER_CMD_PROCESS_EVENT, - NOTIFIER_CMD_PROCESS_FRAME, - NOTIFIER_CMD_PROCESS_ERROR - }; - - enum NotifierState - { - NOTIFIER_STOPPED, - NOTIFIER_STARTED, - NOTIFIER_EXITED - }; - -public: - - ~AppCallbackNotifier(); - - ///Initialzes the callback notifier, creates any resources required - status_t initialize(); - - ///Starts the callbacks to application - status_t start(); - - ///Stops the callbacks from going to application - status_t stop(); - - void setEventProvider(int32_t eventMask, MessageNotifier * eventProvider); - void setFrameProvider(FrameNotifier *frameProvider); - - //All sub-components of Camera HAL call this whenever any error happens - virtual void errorNotify(int error); - - status_t startPreviewCallbacks(android::CameraParameters ¶ms, CameraBuffer *buffers, uint32_t *offsets, int fd, size_t length, size_t count); - status_t stopPreviewCallbacks(); - - status_t enableMsgType(int32_t msgType); - status_t disableMsgType(int32_t msgType); - - //API for enabling/disabling measurement data - void setMeasurements(bool enable); - - //thread loops - bool notificationThread(); - - ///Notification callback functions - static void frameCallbackRelay(CameraFrame* caFrame); - static void eventCallbackRelay(CameraHalEvent* chEvt); - void frameCallback(CameraFrame* caFrame); - void eventCallback(CameraHalEvent* chEvt); - void flushAndReturnFrames(); - - void setCallbacks(CameraHal *cameraHal, - camera_notify_callback notify_cb, - camera_data_callback data_cb, - camera_data_timestamp_callback data_cb_timestamp, - camera_request_memory get_memory, - void *user); - - //Set Burst mode - void setBurst(bool burst); - - //Notifications from CameraHal for video recording case - status_t startRecording(); - status_t stopRecording(); - status_t initSharedVideoBuffers(CameraBuffer *buffers, uint32_t *offsets, int fd, size_t length, size_t count, CameraBuffer *vidBufs); - status_t releaseRecordingFrame(const void *opaque); - - status_t useMetaDataBufferMode(bool enable); - - void EncoderDoneCb(void*, void*, CameraFrame::FrameType type, void* cookie1, void* cookie2, void *cookie3); - - void useVideoBuffers(bool useVideoBuffers); - - bool getUesVideoBuffers(); - void setVideoRes(int width, int height); - - void flushEventQueue(); - - //Internal class definitions - class NotificationThread : public android::Thread { - AppCallbackNotifier* mAppCallbackNotifier; - Utils::MessageQueue mNotificationThreadQ; - public: - enum NotificationThreadCommands - { - NOTIFIER_START, - NOTIFIER_STOP, - NOTIFIER_EXIT, - }; - public: - NotificationThread(AppCallbackNotifier* nh) - : Thread(false), mAppCallbackNotifier(nh) { } - virtual bool threadLoop() { - return mAppCallbackNotifier->notificationThread(); - } - - Utils::MessageQueue &msgQ() { return mNotificationThreadQ;} - }; - - //Friend declarations - friend class NotificationThread; - -private: - void notifyEvent(); - void notifyFrame(); - bool processMessage(); - void releaseSharedVideoBuffers(); - status_t dummyRaw(); - void copyAndSendPictureFrame(CameraFrame* frame, int32_t msgType); - void copyAndSendPreviewFrame(CameraFrame* frame, int32_t msgType); - size_t calculateBufferSize(size_t width, size_t height, const char *pixelFormat); - const char* getContstantForPixelFormat(const char *pixelFormat); - -private: - mutable android::Mutex mLock; - mutable android::Mutex mBurstLock; - CameraHal* mCameraHal; - camera_notify_callback mNotifyCb; - camera_data_callback mDataCb; - camera_data_timestamp_callback mDataCbTimestamp; - camera_request_memory mRequestMemory; - void *mCallbackCookie; - - //Keeps Video MemoryHeaps and Buffers within - //these objects - android::KeyedVector<unsigned int, unsigned int> mVideoHeaps; - android::KeyedVector<unsigned int, unsigned int> mVideoBuffers; - android::KeyedVector<void *, CameraBuffer *> mVideoMap; - - //Keeps list of Gralloc handles and associated Video Metadata Buffers - android::KeyedVector<void *, camera_memory_t *> mVideoMetadataBufferMemoryMap; - android::KeyedVector<void *, CameraBuffer *> mVideoMetadataBufferReverseMap; - - bool mBufferReleased; - - android::sp< NotificationThread> mNotificationThread; - EventProvider *mEventProvider; - FrameProvider *mFrameProvider; - Utils::MessageQueue mEventQ; - Utils::MessageQueue mFrameQ; - NotifierState mNotifierState; - - bool mPreviewing; - camera_memory_t* mPreviewMemory; - CameraBuffer mPreviewBuffers[MAX_BUFFERS]; - int mPreviewBufCount; - int mPreviewWidth; - int mPreviewHeight; - int mPreviewStride; - const char *mPreviewPixelFormat; - android::KeyedVector<unsigned int, android::sp<android::MemoryHeapBase> > mSharedPreviewHeaps; - android::KeyedVector<unsigned int, android::sp<android::MemoryBase> > mSharedPreviewBuffers; - - //Burst mode active - bool mBurst; - mutable android::Mutex mRecordingLock; - bool mRecording; - bool mMeasurementEnabled; - - bool mUseMetaDataBufferMode; - bool mRawAvailable; - - bool mUseVideoBuffers; - - int mVideoWidth; - int mVideoHeight; - -}; - - -/** - * Class used for allocating memory for JPEG bit stream buffers, output buffers of camera in no overlay case - */ -class MemoryManager : public BufferProvider, public virtual android::RefBase -{ -public: - MemoryManager(); - ~MemoryManager(); - - status_t initialize(); - - int setErrorHandler(ErrorNotifier *errorNotifier); - virtual CameraBuffer * allocateBufferList(int width, int height, const char* format, int &bytes, int numBufs); - virtual CameraBuffer *getBufferList(int *numBufs); - virtual uint32_t * getOffsets(); - virtual int getFd() ; - virtual int freeBufferList(CameraBuffer * buflist); - -private: - android::sp<ErrorNotifier> mErrorNotifier; - int mIonFd; -}; - - - - -/** - * CameraAdapter interface class - * Concrete classes derive from this class and provide implementations based on the specific camera h/w interface - */ - -class CameraAdapter: public FrameNotifier, public virtual android::RefBase -{ -protected: - enum AdapterActiveStates { - INTIALIZED_ACTIVE = 1 << 0, - LOADED_PREVIEW_ACTIVE = 1 << 1, - PREVIEW_ACTIVE = 1 << 2, - LOADED_CAPTURE_ACTIVE = 1 << 3, - CAPTURE_ACTIVE = 1 << 4, - BRACKETING_ACTIVE = 1 << 5, - AF_ACTIVE = 1 << 6, - ZOOM_ACTIVE = 1 << 7, - VIDEO_ACTIVE = 1 << 8, - LOADED_REPROCESS_ACTIVE = 1 << 9, - REPROCESS_ACTIVE = 1 << 10, - }; -public: - typedef struct - { - CameraBuffer *mBuffers; - uint32_t *mOffsets; - int mFd; - size_t mLength; - size_t mCount; - size_t mMaxQueueable; - } BuffersDescriptor; - - enum CameraCommands - { - CAMERA_START_PREVIEW = 0, - CAMERA_STOP_PREVIEW = 1, - CAMERA_START_VIDEO = 2, - CAMERA_STOP_VIDEO = 3, - CAMERA_START_IMAGE_CAPTURE = 4, - CAMERA_STOP_IMAGE_CAPTURE = 5, - CAMERA_PERFORM_AUTOFOCUS = 6, - CAMERA_CANCEL_AUTOFOCUS = 7, - CAMERA_PREVIEW_FLUSH_BUFFERS = 8, - CAMERA_START_SMOOTH_ZOOM = 9, - CAMERA_STOP_SMOOTH_ZOOM = 10, - CAMERA_USE_BUFFERS_PREVIEW = 11, - CAMERA_SET_TIMEOUT = 12, - CAMERA_CANCEL_TIMEOUT = 13, - CAMERA_START_BRACKET_CAPTURE = 14, - CAMERA_STOP_BRACKET_CAPTURE = 15, - CAMERA_QUERY_RESOLUTION_PREVIEW = 16, - CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE = 17, - CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA = 18, - CAMERA_USE_BUFFERS_IMAGE_CAPTURE = 19, - CAMERA_USE_BUFFERS_PREVIEW_DATA = 20, - CAMERA_TIMEOUT_EXPIRED = 21, - CAMERA_START_FD = 22, - CAMERA_STOP_FD = 23, - CAMERA_SWITCH_TO_EXECUTING = 24, - CAMERA_USE_BUFFERS_VIDEO_CAPTURE = 25, -#ifdef OMAP_ENHANCEMENT_CPCAM - CAMERA_USE_BUFFERS_REPROCESS = 26, - CAMERA_START_REPROCESS = 27, -#endif -#ifdef OMAP_ENHANCEMENT_VTC - CAMERA_SETUP_TUNNEL = 28, - CAMERA_DESTROY_TUNNEL = 29, -#endif - CAMERA_PREVIEW_INITIALIZATION = 30, - }; - - enum CameraMode - { - CAMERA_PREVIEW, - CAMERA_IMAGE_CAPTURE, - CAMERA_VIDEO, - CAMERA_MEASUREMENT, - CAMERA_REPROCESS, - }; - - enum AdapterState { - INTIALIZED_STATE = INTIALIZED_ACTIVE, - LOADED_PREVIEW_STATE = LOADED_PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - PREVIEW_STATE = PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - LOADED_CAPTURE_STATE = LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - CAPTURE_STATE = CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - BRACKETING_STATE = BRACKETING_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE , - AF_STATE = AF_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - ZOOM_STATE = ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - VIDEO_STATE = VIDEO_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - VIDEO_AF_STATE = VIDEO_ACTIVE | AF_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - VIDEO_ZOOM_STATE = VIDEO_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - VIDEO_LOADED_CAPTURE_STATE = VIDEO_ACTIVE | LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - VIDEO_CAPTURE_STATE = VIDEO_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - AF_ZOOM_STATE = AF_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - BRACKETING_ZOOM_STATE = BRACKETING_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - LOADED_REPROCESS_STATE = LOADED_REPROCESS_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - LOADED_REPROCESS_CAPTURE_STATE = LOADED_REPROCESS_ACTIVE | LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - REPROCESS_STATE = REPROCESS_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, - }; - - -public: - - ///Initialzes the camera adapter creates any resources required - virtual int initialize(CameraProperties::Properties*) = 0; - - virtual int setErrorHandler(ErrorNotifier *errorNotifier) = 0; - - //Message/Frame notification APIs - virtual void enableMsgType(int32_t msgs, - frame_callback callback = NULL, - event_callback eventCb = NULL, - void *cookie = NULL) = 0; - virtual void disableMsgType(int32_t msgs, void* cookie) = 0; - virtual void returnFrame(CameraBuffer* frameBuf, CameraFrame::FrameType frameType) = 0; - virtual void addFramePointers(CameraBuffer *frameBuf, void *buf) = 0; - virtual void removeFramePointers() = 0; - - //APIs to configure Camera adapter and get the current parameter set - virtual int setParameters(const android::CameraParameters& params) = 0; - virtual void getParameters(android::CameraParameters& params) = 0; - - //Registers callback for returning image buffers back to CameraHAL - virtual int registerImageReleaseCallback(release_image_buffers_callback callback, void *user_data) = 0; - - //Registers callback, which signals a completed image capture - virtual int registerEndCaptureCallback(end_image_capture_callback callback, void *user_data) = 0; - - //API to send a command to the camera - virtual status_t sendCommand(CameraCommands operation, int value1=0, int value2=0, int value3=0, int value4=0) = 0; - - virtual ~CameraAdapter() {}; - - //Retrieves the current Adapter state - virtual AdapterState getState() = 0; - - //Retrieves the next Adapter state - virtual AdapterState getNextState() = 0; - - // Receive orientation events from CameraHal - virtual void onOrientationEvent(uint32_t orientation, uint32_t tilt) = 0; - - // Rolls the state machine back to INTIALIZED_STATE from the current state - virtual status_t rollbackToInitializedState() = 0; - - // Retrieves the current Adapter state - for internal use (not locked) - virtual status_t getState(AdapterState &state) = 0; - // Retrieves the next Adapter state - for internal use (not locked) - virtual status_t getNextState(AdapterState &state) = 0; - - virtual status_t setSharedAllocator(camera_request_memory shmem_alloc) = 0; - -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) = 0; - virtual status_t commitState() = 0; - virtual status_t rollbackState() = 0; -}; - -class DisplayAdapter : public BufferProvider, public virtual android::RefBase -{ -public: - DisplayAdapter(); - -#ifdef OMAP_ENHANCEMENT - preview_stream_extended_ops_t * extendedOps() const { - return mExtendedOps; - } - - void setExtendedOps(preview_stream_extended_ops_t * extendedOps); -#endif - - ///Initializes the display adapter creates any resources required - virtual int initialize() = 0; - - virtual int setPreviewWindow(struct preview_stream_ops *window) = 0; - virtual int setFrameProvider(FrameNotifier *frameProvider) = 0; - virtual int setErrorHandler(ErrorNotifier *errorNotifier) = 0; - virtual int enableDisplay(int width, int height, struct timeval *refTime = NULL) = 0; - virtual int disableDisplay(bool cancel_buffer = true) = 0; - //Used for Snapshot review temp. pause - virtual int pauseDisplay(bool pause) = 0; - -#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS - //Used for shot to snapshot measurement - virtual int setSnapshotTimeRef(struct timeval *refTime = NULL) = 0; -#endif - - virtual bool supportsExternalBuffering() = 0; - - // Get max queueable buffers display supports - // This function should only be called after - // allocateBufferList - virtual status_t maxQueueableBuffers(unsigned int& queueable) = 0; - - // Get min buffers display needs at any given time - virtual status_t minUndequeueableBuffers(int& unqueueable) = 0; -protected: - virtual const char* getPixFormatConstant(const char* parameters_format) const; - virtual size_t getBufSize(const char* parameters_format, int width, int height) const; - -private: -#ifdef OMAP_ENHANCEMENT - preview_stream_extended_ops_t * mExtendedOps; -#endif -}; - -static void releaseImageBuffers(void *userData); - -static void endImageCapture(void *userData); - - /** - Implementation of the Android Camera hardware abstraction layer - - This class implements the interface methods defined in CameraHardwareInterface - for the OMAP4 platform - -*/ -class CameraHal - -{ - -public: - ///Constants - static const int NO_BUFFERS_PREVIEW; - static const int NO_BUFFERS_IMAGE_CAPTURE; - static const int NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP; - static const uint32_t VFR_SCALE = 1000; - - - /*--------------------Interface Methods---------------------------------*/ - - //@{ -public: - - /** Set the notification and data callbacks */ - void setCallbacks(camera_notify_callback notify_cb, - camera_data_callback data_cb, - camera_data_timestamp_callback data_cb_timestamp, - camera_request_memory get_memory, - void *user); - - /** Receives orientation events from SensorListener **/ - void onOrientationEvent(uint32_t orientation, uint32_t tilt); - - /** - * The following three functions all take a msgtype, - * which is a bitmask of the messages defined in - * include/ui/Camera.h - */ - - /** - * Enable a message, or set of messages. - */ - void enableMsgType(int32_t msgType); - - /** - * Disable a message, or a set of messages. - */ - void disableMsgType(int32_t msgType); - - /** - * Query whether a message, or a set of messages, is enabled. - * Note that this is operates as an AND, if any of the messages - * queried are off, this will return false. - */ - int msgTypeEnabled(int32_t msgType); - - /** - * Start preview mode. - */ - int startPreview(); - - /** - * Set preview mode related initialization. - * Only used when slice based processing is enabled. - */ - int cameraPreviewInitialization(); - - /** - * Only used if overlays are used for camera preview. - */ - int setPreviewWindow(struct preview_stream_ops *window); - -#ifdef OMAP_ENHANCEMENT_CPCAM - void setExtendedPreviewStreamOps(preview_stream_extended_ops_t *ops); - - /** - * Set a tap-in or tap-out point. - */ - int setBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout); -#endif - - /** - * Stop a previously started preview. - */ - void stopPreview(); - - /** - * Returns true if preview is enabled. - */ - bool previewEnabled(); - - /** - * Start record mode. When a record image is available a CAMERA_MSG_VIDEO_FRAME - * message is sent with the corresponding frame. Every record frame must be released - * by calling releaseRecordingFrame(). - */ - int startRecording(); - - /** - * Stop a previously started recording. - */ - void stopRecording(); - - /** - * Returns true if recording is enabled. - */ - int recordingEnabled(); - - /** - * Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME. - */ - void releaseRecordingFrame(const void *opaque); - - /** - * Start auto focus, the notification callback routine is called - * with CAMERA_MSG_FOCUS once when focusing is complete. autoFocus() - * will be called again if another auto focus is needed. - */ - int autoFocus(); - - /** - * Cancels auto-focus function. If the auto-focus is still in progress, - * this function will cancel it. Whether the auto-focus is in progress - * or not, this function will return the focus position to the default. - * If the camera does not support auto-focus, this is a no-op. - */ - int cancelAutoFocus(); - - /** - * Take a picture. - */ - int takePicture(const char* params); - - /** - * Cancel a picture that was started with takePicture. Calling this - * method when no picture is being taken is a no-op. - */ - int cancelPicture(); - - /** Set the camera parameters. */ - int setParameters(const char* params); - int setParameters(const android::CameraParameters& params); - - /** Return the camera parameters. */ - char* getParameters(); - void putParameters(char *); - - /** - * Send command to camera driver. - */ - int sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); - - /** - * Release the hardware resources owned by this object. Note that this is - * *not* done in the destructor. - */ - void release(); - - /** - * Dump state of the camera hardware - */ - int dump(int fd) const; - -#ifdef OMAP_ENHANCEMENT_CPCAM - /** - * start a reprocessing operation. - */ - int reprocess(const char* params); - - /** - * cancels current reprocessing operation - */ - int cancel_reprocess(); -#endif - - status_t storeMetaDataInBuffers(bool enable); - - //@} - -/*--------------------Internal Member functions - Public---------------------------------*/ - -public: - /** @name internalFunctionsPublic */ - //@{ - - /** Constructor of CameraHal */ - CameraHal(int cameraId); - - // Destructor of CameraHal - ~CameraHal(); - - /** Initialize CameraHal */ - status_t initialize(CameraProperties::Properties*); - - /** Deinitialize CameraHal */ - void deinitialize(); - -#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS - - //Uses the constructor timestamp as a reference to calcluate the - // elapsed time - static void PPM(const char *); - //Uses a user provided timestamp as a reference to calcluate the - // elapsed time - static void PPM(const char *, struct timeval*, ...); - -#endif - - /** Free image bufs */ - status_t freeImageBufs(); - - //Signals the end of image capture - status_t signalEndImageCapture(); - - //Events - static void eventCallbackRelay(CameraHalEvent* event); - void eventCallback(CameraHalEvent* event); - void setEventProvider(int32_t eventMask, MessageNotifier * eventProvider); - -/*--------------------Internal Member functions - Private---------------------------------*/ -private: - - /** @name internalFunctionsPrivate */ - //@{ - - /** Set the camera parameters specific to Video Recording. */ - bool setVideoModeParameters(const android::CameraParameters&); - - /** Reset the camera parameters specific to Video Recording. */ - bool resetVideoModeParameters(); - - /** Restart the preview with setParameter. */ - status_t restartPreview(); - - status_t parseResolution(const char *resStr, int &width, int &height); - - void insertSupportedParams(); - - /** Allocate preview data buffers */ - status_t allocPreviewDataBufs(size_t size, size_t bufferCount); - - /** Free preview data buffers */ - status_t freePreviewDataBufs(); - - /** Allocate preview buffers */ - status_t allocPreviewBufs(int width, int height, const char* previewFormat, unsigned int bufferCount, unsigned int &max_queueable); - - /** Allocate video buffers */ - status_t allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount); - - /** Allocate image capture buffers */ - status_t allocImageBufs(unsigned int width, unsigned int height, size_t length, - const char* previewFormat, unsigned int bufferCount, - unsigned int *max_queueable); - - /** Allocate Raw buffers */ - status_t allocRawBufs(int width, int height, const char* previewFormat, int bufferCount); - - /** Free preview buffers */ - status_t freePreviewBufs(); - - /** Free video bufs */ - status_t freeVideoBufs(CameraBuffer *bufs); - - /** Free RAW bufs */ - status_t freeRawBufs(); - - //Check if a given resolution is supported by the current camera - //instance - bool isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions); - - //Check if a given variable frame rate range is supported by the current camera - //instance - bool isFpsRangeValid(int fpsMin, int fpsMax, const char *supportedFpsRanges); - - //Check if a given parameter is supported by the current camera - // instance - bool isParameterValid(const char *param, const char *supportedParams); - bool isParameterValid(int param, const char *supportedParams); - status_t doesSetParameterNeedUpdate(const char *new_param, const char *old_params, bool &update); - - /** Initialize default parameters */ - void initDefaultParameters(); - - void dumpProperties(CameraProperties::Properties& cameraProps); - - status_t startImageBracketing(); - - status_t stopImageBracketing(); - - void setShutter(bool enable); - - void forceStopPreview(); - - void getPreferredPreviewRes(int *width, int *height); - void resetPreviewRes(android::CameraParameters *params); - - // Internal __takePicture function - used in public takePicture() and reprocess() - int __takePicture(const char* params); - //@} - - -/*----------Member variables - Public ---------------------*/ -public: - int32_t mMsgEnabled; - bool mRecordEnabled; - nsecs_t mCurrentTime; - bool mFalsePreview; - bool mPreviewEnabled; - uint32_t mTakePictureQueue; - bool mBracketingEnabled; - bool mBracketingRunning; - //User shutter override - bool mShutterEnabled; - bool mMeasurementEnabled; - //Google's parameter delimiter - static const char PARAMS_DELIMITER[]; - - CameraAdapter *mCameraAdapter; - android::sp<AppCallbackNotifier> mAppCallbackNotifier; - android::sp<DisplayAdapter> mDisplayAdapter; - android::sp<MemoryManager> mMemoryManager; - // TODO(XXX): May need to keep this as a vector in the future - // when we can have multiple tap-in/tap-out points - android::sp<DisplayAdapter> mBufferSourceAdapter_In; - android::sp<DisplayAdapter> mBufferSourceAdapter_Out; - -#ifdef OMAP_ENHANCEMENT - preview_stream_extended_ops_t * mExtendedPreviewStreamOps; -#endif - - android::sp<android::IMemoryHeap> mPictureHeap; - - int* mGrallocHandles; - bool mFpsRangeChangedByApp; - - - int mRawWidth; - int mRawHeight; - bool mRawCapture; - - -///static member vars - - static const int SW_SCALING_FPS_LIMIT; - -#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS - - //Timestamp from the CameraHal constructor - static struct timeval ppm_start; - //Timestamp of the autoFocus command - static struct timeval mStartFocus; - //Timestamp of the startPreview command - static struct timeval mStartPreview; - //Timestamp of the takePicture command - static struct timeval mStartCapture; - -#endif - -/*----------Member variables - Private ---------------------*/ -private: - bool mDynamicPreviewSwitch; - //keeps paused state of display - bool mDisplayPaused; - -#ifdef OMAP_ENHANCEMENT_VTC - bool mTunnelSetup; - bool mVTCUseCase; -#endif - - //Index of current camera adapter - int mCameraIndex; - - mutable android::Mutex mLock; - - android::sp<SensorListener> mSensorListener; - - void* mCameraAdapterHandle; - - android::CameraParameters mParameters; - bool mPreviewRunning; - bool mPreviewStateOld; - bool mRecordingEnabled; - EventProvider *mEventProvider; - - CameraBuffer *mPreviewDataBuffers; - uint32_t *mPreviewDataOffsets; - int mPreviewDataFd; - int mPreviewDataLength; - CameraBuffer *mImageBuffers; - uint32_t *mImageOffsets; - int mImageFd; - int mImageLength; - CameraBuffer *mPreviewBuffers; - uint32_t *mPreviewOffsets; - int mPreviewLength; - int mPreviewFd; - CameraBuffer *mVideoBuffers; - uint32_t *mVideoOffsets; - int mVideoFd; - int mVideoLength; - - int mBracketRangePositive; - int mBracketRangeNegative; - - ///@todo Rename this as preview buffer provider - BufferProvider *mBufProvider; - BufferProvider *mVideoBufProvider; - - - CameraProperties::Properties* mCameraProperties; - - bool mPreviewStartInProgress; - bool mPreviewInitializationDone; - - bool mSetPreviewWindowCalled; - - uint32_t mPreviewWidth; - uint32_t mPreviewHeight; - int32_t mMaxZoomSupported; - - int mVideoWidth; - int mVideoHeight; - - android::String8 mCapModeBackup; -}; - -} // namespace Camera -} // namespace Ti - -#endif |