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 ANDROID_HARDWARE_CAMERA_HARDWARE_H
     20 #define ANDROID_HARDWARE_CAMERA_HARDWARE_H
     21 
     22 #include <stdio.h>
     23 #include <stdarg.h>
     24 #include <stdlib.h>
     25 #include <string.h>
     26 #include <unistd.h>
     27 #include <time.h>
     28 #include <fcntl.h>
     29 #include <sys/ioctl.h>
     30 #include <sys/mman.h>
     31 #include <sys/stat.h>
     32 
     33 #include <hardware/camera.h>
     34 #include <utils/Log.h>
     35 #include <utils/threads.h>
     36 #include <utils/threads.h>
     37 #include <binder/MemoryBase.h>
     38 #include <binder/MemoryHeapBase.h>
     39 #include <camera/CameraParameters.h>
     40 #ifdef OMAP_ENHANCEMENT_CPCAM
     41 #include <camera/CameraMetadata.h>
     42 #include <camera/ShotParameters.h>
     43 #endif
     44 #include <ui/GraphicBufferAllocator.h>
     45 #include <ui/GraphicBuffer.h>
     46 
     47 /* For IMG_native_handle_t */
     48 #include <ui/GraphicBufferMapper.h>
     49 #include <hal_public.h>
     50 
     51 #include <ion/ion.h>
     52 
     53 #include "Common.h"
     54 #include "MessageQueue.h"
     55 #include "Semaphore.h"
     56 #include "CameraProperties.h"
     57 #include "SensorListener.h"
     58 
     59 //temporarily define format here
     60 #define HAL_PIXEL_FORMAT_TI_NV12 0x100
     61 #define HAL_PIXEL_FORMAT_TI_Y8 0x103
     62 #define HAL_PIXEL_FORMAT_TI_Y16 0x104
     63 #define HAL_PIXEL_FORMAT_TI_UYVY 0x105
     64 
     65 #define MIN_WIDTH           640
     66 #define MIN_HEIGHT          480
     67 #define PICTURE_WIDTH   3264 /* 5mp - 2560. 8mp - 3280 */ /* Make sure it is a multiple of 16. */
     68 #define PICTURE_HEIGHT  2448 /* 5mp - 2048. 8mp - 2464 */ /* Make sure it is a multiple of 16. */
     69 #define PREVIEW_WIDTH 176
     70 #define PREVIEW_HEIGHT 144
     71 #define PIXEL_FORMAT           V4L2_PIX_FMT_UYVY
     72 
     73 #define VIDEO_FRAME_COUNT_MAX    8 //NUM_OVERLAY_BUFFERS_REQUESTED
     74 #define MAX_CAMERA_BUFFERS    8 //NUM_OVERLAY_BUFFERS_REQUESTED
     75 #define MAX_ZOOM        3
     76 #define THUMB_WIDTH     80
     77 #define THUMB_HEIGHT    60
     78 #define PIX_YUV422I 0
     79 #define PIX_YUV420P 1
     80 
     81 #define SATURATION_OFFSET 100
     82 #define SHARPNESS_OFFSET 100
     83 #define CONTRAST_OFFSET 100
     84 
     85 #define FRAME_RATE_HIGH_HD 60
     86 
     87 #define CAMHAL_GRALLOC_USAGE GRALLOC_USAGE_HW_TEXTURE | \
     88                              GRALLOC_USAGE_HW_RENDER | \
     89                              GRALLOC_USAGE_SW_READ_RARELY | \
     90                              GRALLOC_USAGE_SW_WRITE_NEVER
     91 
     92 //Enables Absolute PPM measurements in logcat
     93 #define PPM_INSTRUMENTATION_ABS 1
     94 
     95 #define LOCK_BUFFER_TRIES 5
     96 #define HAL_PIXEL_FORMAT_NV12 0x100
     97 
     98 #define OP_STR_SIZE 100
     99 
    100 #define NONNEG_ASSIGN(x,y) \
    101     if(x > -1) \
    102         y = x
    103 
    104 #define CAMHAL_SIZE_OF_ARRAY(x) static_cast<int>(sizeof(x)/sizeof(x[0]))
    105 
    106 namespace Ti {
    107 namespace Camera {
    108 
    109 #ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
    110 extern const char * const kRawImagesOutputDirPath;
    111 extern const char * const kYuvImagesOutputDirPath;
    112 #endif
    113 #define V4L_CAMERA_NAME_USB     "USBCAMERA"
    114 #define OMX_CAMERA_NAME_OV      "OV5640"
    115 #define OMX_CAMERA_NAME_SONY    "IMX060"
    116 
    117 
    118 ///Forward declarations
    119 class CameraHal;
    120 class CameraFrame;
    121 class CameraHalEvent;
    122 class DisplayFrame;
    123 
    124 class FpsRange {
    125 public:
    126     static int compare(const FpsRange * left, const FpsRange * right);
    127 
    128     FpsRange(int min, int max);
    129     FpsRange();
    130 
    131     bool operator==(const FpsRange & fpsRange) const;
    132 
    133     bool isNull() const;
    134     bool isFixed() const;
    135 
    136     int min() const;
    137     int max() const;
    138 
    139 private:
    140     int mMin;
    141     int mMax;
    142 };
    143 
    144 
    145 inline int FpsRange::compare(const FpsRange * const left, const FpsRange * const right) {
    146     if ( left->max() < right->max() ) {
    147         return -1;
    148     }
    149 
    150     if ( left->max() > right->max() ) {
    151         return 1;
    152     }
    153 
    154     if ( left->min() < right->min() ) {
    155         return -1;
    156     }
    157 
    158     if ( left->min() > right->min() ) {
    159         return 1;
    160     }
    161 
    162     return 0;
    163 }
    164 
    165 inline FpsRange::FpsRange(const int min, const int max) : mMin(min), mMax(max) {}
    166 
    167 inline FpsRange::FpsRange() : mMin(-1), mMax(-1) {}
    168 
    169 inline bool FpsRange::operator==(const FpsRange & fpsRange) const {
    170     return mMin == fpsRange.mMin && mMax == fpsRange.mMax;
    171 }
    172 
    173 inline bool FpsRange::isNull() const {
    174     return mMin == -1 || mMax == -1;
    175 }
    176 
    177 inline bool FpsRange::isFixed() const {
    178     return mMin == mMax;
    179 }
    180 
    181 inline int FpsRange::min() const { return mMin; }
    182 
    183 inline int FpsRange::max() const { return mMax; }
    184 
    185 class CameraArea : public android::RefBase
    186 {
    187 public:
    188 
    189     CameraArea(ssize_t top,
    190                ssize_t left,
    191                ssize_t bottom,
    192                ssize_t right,
    193                size_t weight) : mTop(top),
    194                                 mLeft(left),
    195                                 mBottom(bottom),
    196                                 mRight(right),
    197                                 mWeight(weight) {}
    198 
    199     status_t transfrom(size_t width,
    200                        size_t height,
    201                        size_t &top,
    202                        size_t &left,
    203                        size_t &areaWidth,
    204                        size_t &areaHeight);
    205 
    206     bool isValid()
    207         {
    208         return ( ( 0 != mTop ) || ( 0 != mLeft ) || ( 0 != mBottom ) || ( 0 != mRight) );
    209         }
    210 
    211     bool isZeroArea()
    212     {
    213         return  ( (0 == mTop ) && ( 0 == mLeft ) && ( 0 == mBottom )
    214                  && ( 0 == mRight ) && ( 0 == mWeight ));
    215     }
    216 
    217     size_t getWeight()
    218         {
    219         return mWeight;
    220         }
    221 
    222     bool compare(const android::sp<CameraArea> &area);
    223 
    224     static status_t parseAreas(const char *area,
    225                                size_t areaLength,
    226                                android::Vector< android::sp<CameraArea> > &areas);
    227 
    228     static status_t checkArea(ssize_t top,
    229                               ssize_t left,
    230                               ssize_t bottom,
    231                               ssize_t right,
    232                               ssize_t weight);
    233 
    234     static bool areAreasDifferent(android::Vector< android::sp<CameraArea> > &, android::Vector< android::sp<CameraArea> > &);
    235 
    236 protected:
    237     static const ssize_t TOP = -1000;
    238     static const ssize_t LEFT = -1000;
    239     static const ssize_t BOTTOM = 1000;
    240     static const ssize_t RIGHT = 1000;
    241     static const ssize_t WEIGHT_MIN = 1;
    242     static const ssize_t WEIGHT_MAX = 1000;
    243 
    244     ssize_t mTop;
    245     ssize_t mLeft;
    246     ssize_t mBottom;
    247     ssize_t mRight;
    248     size_t mWeight;
    249 };
    250 
    251 class CameraMetadataResult : public android::RefBase
    252 {
    253 public:
    254 
    255 #ifdef OMAP_ENHANCEMENT_CPCAM
    256     CameraMetadataResult(camera_memory_t * extMeta) : mExtendedMetadata(extMeta) {
    257         mMetadata.faces = NULL;
    258         mMetadata.number_of_faces = 0;
    259 #ifdef OMAP_ENHANCEMENT
    260         mMetadata.analog_gain = 0;
    261         mMetadata.exposure_time = 0;
    262 #endif
    263     };
    264 #endif
    265 
    266     CameraMetadataResult() {
    267         mMetadata.faces = NULL;
    268         mMetadata.number_of_faces = 0;
    269 #ifdef OMAP_ENHANCEMENT_CPCAM
    270         mMetadata.analog_gain = 0;
    271         mMetadata.exposure_time = 0;
    272 #endif
    273 
    274 #ifdef OMAP_ENHANCEMENT_CPCAM
    275         mExtendedMetadata = NULL;
    276 #endif
    277    }
    278 
    279     virtual ~CameraMetadataResult() {
    280         if ( NULL != mMetadata.faces ) {
    281             free(mMetadata.faces);
    282         }
    283 #ifdef OMAP_ENHANCEMENT_CPCAM
    284         if ( NULL != mExtendedMetadata ) {
    285             mExtendedMetadata->release(mExtendedMetadata);
    286         }
    287 #endif
    288     }
    289 
    290     camera_frame_metadata_t *getMetadataResult() { return &mMetadata; };
    291 
    292 #ifdef OMAP_ENHANCEMENT_CPCAM
    293     camera_memory_t *getExtendedMetadata() { return mExtendedMetadata; };
    294 #endif
    295 
    296     static const ssize_t TOP = -1000;
    297     static const ssize_t LEFT = -1000;
    298     static const ssize_t BOTTOM = 1000;
    299     static const ssize_t RIGHT = 1000;
    300     static const ssize_t INVALID_DATA = -2000;
    301 
    302 private:
    303 
    304     camera_frame_metadata_t mMetadata;
    305 #ifdef OMAP_ENHANCEMENT_CPCAM
    306     camera_memory_t *mExtendedMetadata;
    307 #endif
    308 };
    309 
    310 typedef enum {
    311     CAMERA_BUFFER_NONE = 0,
    312     CAMERA_BUFFER_GRALLOC,
    313     CAMERA_BUFFER_ANW,
    314     CAMERA_BUFFER_MEMORY,
    315     CAMERA_BUFFER_ION
    316 } CameraBufferType;
    317 
    318 typedef struct _CameraBuffer {
    319     CameraBufferType type;
    320     /* opaque is the generic drop-in replacement for the pointers
    321      * that were used previously */
    322     void *opaque;
    323 
    324     /* opaque has different meanings depending on the buffer type:
    325      *   GRALLOC - gralloc_handle_t
    326      *   ANW - a pointer to the buffer_handle_t (which corresponds to
    327      *         the ANativeWindowBuffer *)
    328      *   MEMORY - address of allocated memory
    329      *   ION - address of mapped ion allocation
    330      *
    331      * FIXME opaque should be split into several fields:
    332      *   - handle/pointer we got from the allocator
    333      *   - handle/value we pass to OMX
    334      *   - pointer to mapped memory (if the buffer is mapped)
    335      */
    336 
    337     /* mapped holds ptr to mapped memory in userspace */
    338     void *mapped;
    339 
    340     /* These are specific to ION buffers */
    341     struct ion_handle * ion_handle;
    342     int ion_fd;
    343     int fd;
    344     size_t size;
    345     int index;
    346 
    347     /* These describe the camera buffer */
    348     int width;
    349     int stride;
    350     int height;
    351     const char *format;
    352 
    353 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
    354 
    355     struct timeval ppmStamp;
    356 
    357 #endif
    358 
    359     /* These are for buffers which include borders */
    360     int offset; // where valid data starts
    361     int actual_size; // size of the entire buffer with borders
    362 } CameraBuffer;
    363 
    364 void * camera_buffer_get_omx_ptr (CameraBuffer *buffer);
    365 
    366 class CameraFrame
    367 {
    368     public:
    369 
    370     enum FrameType
    371         {
    372             PREVIEW_FRAME_SYNC = 0x1, ///SYNC implies that the frame needs to be explicitly returned after consuming in order to be filled by camera again
    373             PREVIEW_FRAME = 0x2   , ///Preview frame includes viewfinder and snapshot frames
    374             IMAGE_FRAME_SYNC = 0x4, ///Image Frame is the image capture output frame
    375             IMAGE_FRAME = 0x8,
    376             VIDEO_FRAME_SYNC = 0x10, ///Timestamp will be updated for these frames
    377             VIDEO_FRAME = 0x20,
    378             FRAME_DATA_SYNC = 0x40, ///Any extra data assosicated with the frame. Always synced with the frame
    379             FRAME_DATA= 0x80,
    380             RAW_FRAME = 0x100,
    381             SNAPSHOT_FRAME = 0x200,
    382             REPROCESS_INPUT_FRAME = 0x400,
    383             ALL_FRAMES = 0xFFFF   ///Maximum of 16 frame types supported
    384         };
    385 
    386     enum FrameQuirks
    387     {
    388         ENCODE_RAW_YUV422I_TO_JPEG = 0x1 << 0,
    389         HAS_EXIF_DATA = 0x1 << 1,
    390         FORMAT_YUV422I_YUYV = 0x1 << 2,
    391         FORMAT_YUV422I_UYVY = 0x1 << 3,
    392     };
    393 
    394     //default contrustor
    395     CameraFrame():
    396     mCookie(NULL),
    397     mCookie2(NULL),
    398     mBuffer(NULL),
    399     mFrameType(0),
    400     mTimestamp(0),
    401     mWidth(0),
    402     mHeight(0),
    403     mOffset(0),
    404     mAlignment(0),
    405     mFd(0),
    406     mLength(0),
    407     mFrameMask(0),
    408     mQuirks(0)
    409     {
    410       mYuv[0] = 0;
    411       mYuv[1] = 0;
    412 
    413 #ifdef OMAP_ENHANCEMENT_CPCAM
    414         mMetaData = 0;
    415 #endif
    416     }
    417 
    418     void *mCookie;
    419     void *mCookie2;
    420     CameraBuffer *mBuffer;
    421     int mFrameType;
    422     nsecs_t mTimestamp;
    423     unsigned int mWidth, mHeight;
    424     uint32_t mOffset;
    425     unsigned int mAlignment;
    426     int mFd;
    427     size_t mLength;
    428     unsigned mFrameMask;
    429     unsigned int mQuirks;
    430     unsigned int mYuv[2];
    431 #ifdef OMAP_ENHANCEMENT_CPCAM
    432     android::sp<CameraMetadataResult> mMetaData;
    433 #endif
    434     ///@todo add other member vars like  stride etc
    435 };
    436 
    437 enum CameraHalError
    438 {
    439     CAMERA_ERROR_FATAL = 0x1, //Fatal errors can only be recovered by restarting media server
    440     CAMERA_ERROR_HARD = 0x2,  // Hard errors are hardware hangs that may be recoverable by resetting the hardware internally within the adapter
    441     CAMERA_ERROR_SOFT = 0x4, // Soft errors are non fatal errors that can be recovered from without needing to stop use-case
    442 };
    443 
    444 ///Common Camera Hal Event class which is visible to CameraAdapter,DisplayAdapter and AppCallbackNotifier
    445 ///@todo Rename this class to CameraEvent
    446 class CameraHalEvent
    447 {
    448 public:
    449     //Enums
    450     enum CameraHalEventType {
    451         NO_EVENTS = 0x0,
    452         EVENT_FOCUS_LOCKED = 0x1,
    453         EVENT_FOCUS_ERROR = 0x2,
    454         EVENT_ZOOM_INDEX_REACHED = 0x4,
    455         EVENT_SHUTTER = 0x8,
    456         EVENT_METADATA = 0x10,
    457         ///@remarks Future enum related to display, like frame displayed event, could be added here
    458         ALL_EVENTS = 0xFFFF ///Maximum of 16 event types supported
    459     };
    460 
    461     enum FocusStatus {
    462         FOCUS_STATUS_SUCCESS = 0x1,
    463         FOCUS_STATUS_FAIL = 0x2,
    464         FOCUS_STATUS_PENDING = 0x4,
    465         FOCUS_STATUS_DONE = 0x8,
    466     };
    467 
    468     ///Class declarations
    469     ///@remarks Add a new class for a new event type added above
    470 
    471     //Shutter event specific data
    472     typedef struct ShutterEventData_t {
    473         bool shutterClosed;
    474     }ShutterEventData;
    475 
    476     ///Focus event specific data
    477     typedef struct FocusEventData_t {
    478         FocusStatus focusStatus;
    479         int currentFocusValue;
    480     } FocusEventData;
    481 
    482     ///Zoom specific event data
    483     typedef struct ZoomEventData_t {
    484         int currentZoomIndex;
    485         bool targetZoomIndexReached;
    486     } ZoomEventData;
    487 
    488     typedef struct FaceData_t {
    489         ssize_t top;
    490         ssize_t left;
    491         ssize_t bottom;
    492         ssize_t right;
    493         size_t score;
    494     } FaceData;
    495 
    496     typedef android::sp<CameraMetadataResult> MetaEventData;
    497 
    498     class CameraHalEventData : public android::RefBase{
    499 
    500     public:
    501 
    502         CameraHalEvent::FocusEventData focusEvent;
    503         CameraHalEvent::ZoomEventData zoomEvent;
    504         CameraHalEvent::ShutterEventData shutterEvent;
    505         CameraHalEvent::MetaEventData metadataEvent;
    506     };
    507 
    508     //default contrustor
    509     CameraHalEvent():
    510     mCookie(NULL),
    511     mEventType(NO_EVENTS) {}
    512 
    513     //copy constructor
    514     CameraHalEvent(const CameraHalEvent &event) :
    515         mCookie(event.mCookie),
    516         mEventType(event.mEventType),
    517         mEventData(event.mEventData) {};
    518 
    519     void* mCookie;
    520     CameraHalEventType mEventType;
    521     android::sp<CameraHalEventData> mEventData;
    522 
    523 };
    524 
    525 ///      Have a generic callback class based on template - to adapt CameraFrame and Event
    526 typedef void (*frame_callback) (CameraFrame *cameraFrame);
    527 typedef void (*event_callback) (CameraHalEvent *event);
    528 
    529 //signals CameraHAL to relase image buffers
    530 typedef void (*release_image_buffers_callback) (void *userData);
    531 typedef void (*end_image_capture_callback) (void *userData);
    532 
    533 /**
    534   * Interface class implemented by classes that have some events to communicate to dependendent classes
    535   * Dependent classes use this interface for registering for events
    536   */
    537 class MessageNotifier
    538 {
    539 public:
    540     static const uint32_t EVENT_BIT_FIELD_POSITION;
    541     static const uint32_t FRAME_BIT_FIELD_POSITION;
    542 
    543     ///@remarks Msg type comes from CameraFrame and CameraHalEvent classes
    544     ///           MSB 16 bits is for events and LSB 16 bits is for frame notifications
    545     ///         FrameProvider and EventProvider classes act as helpers to event/frame
    546     ///         consumers to call this api
    547     virtual void enableMsgType(int32_t msgs, frame_callback frameCb=NULL, event_callback eventCb=NULL, void* cookie=NULL) = 0;
    548     virtual void disableMsgType(int32_t msgs, void* cookie) = 0;
    549 
    550     virtual ~MessageNotifier() {};
    551 };
    552 
    553 class ErrorNotifier : public virtual android::RefBase
    554 {
    555 public:
    556     virtual void errorNotify(int error) = 0;
    557 
    558     virtual ~ErrorNotifier() {};
    559 };
    560 
    561 
    562 /**
    563   * Interace class abstraction for Camera Adapter to act as a frame provider
    564   * This interface is fully implemented by Camera Adapter
    565   */
    566 class FrameNotifier : public MessageNotifier
    567 {
    568 public:
    569     virtual void returnFrame(CameraBuffer* frameBuf, CameraFrame::FrameType frameType) = 0;
    570     virtual void addFramePointers(CameraBuffer *frameBuf, void *buf) = 0;
    571     virtual void removeFramePointers() = 0;
    572 
    573     virtual ~FrameNotifier() {};
    574 };
    575 
    576 /**   * Wrapper class around Frame Notifier, which is used by display and notification classes for interacting with Camera Adapter
    577   */
    578 class FrameProvider
    579 {
    580     FrameNotifier* mFrameNotifier;
    581     void* mCookie;
    582     frame_callback mFrameCallback;
    583 
    584 public:
    585     FrameProvider(FrameNotifier *fn, void* cookie, frame_callback frameCallback)
    586         :mFrameNotifier(fn), mCookie(cookie),mFrameCallback(frameCallback) { }
    587 
    588     int enableFrameNotification(int32_t frameTypes);
    589     int disableFrameNotification(int32_t frameTypes);
    590     int returnFrame(CameraBuffer *frameBuf, CameraFrame::FrameType frameType);
    591     void addFramePointers(CameraBuffer *frameBuf, void *buf);
    592     void removeFramePointers();
    593 };
    594 
    595 /** Wrapper class around MessageNotifier, which is used by display and notification classes for interacting with
    596    *  Camera Adapter
    597   */
    598 class EventProvider
    599 {
    600 public:
    601     MessageNotifier* mEventNotifier;
    602     void* mCookie;
    603     event_callback mEventCallback;
    604 
    605 public:
    606     EventProvider(MessageNotifier *mn, void* cookie, event_callback eventCallback)
    607         :mEventNotifier(mn), mCookie(cookie), mEventCallback(eventCallback) {}
    608 
    609     int enableEventNotification(int32_t eventTypes);
    610     int disableEventNotification(int32_t eventTypes);
    611 };
    612 
    613 /*
    614   * Interface for providing buffers
    615   */
    616 class BufferProvider
    617 {
    618 public:
    619     virtual CameraBuffer * allocateBufferList(int width, int height, const char* format, int &bytes, int numBufs) = 0;
    620 
    621     // gets a buffer list from BufferProvider when buffers are sent from external source and already pre-allocated
    622     // only call this function for an input source into CameraHal. If buffers are not from a pre-allocated source
    623     // this function will return NULL and numBufs of -1
    624     virtual CameraBuffer *getBufferList(int *numBufs) = 0;
    625 
    626     //additional methods used for memory mapping
    627     virtual uint32_t * getOffsets() = 0;
    628     virtual int getFd() = 0;
    629     virtual CameraBuffer * getBuffers(bool reset = false) { return NULL; }
    630     virtual unsigned int getSize() {return 0; }
    631     virtual int getBufferCount() {return -1; }
    632 
    633     virtual int freeBufferList(CameraBuffer * buf) = 0;
    634 
    635     virtual ~BufferProvider() {}
    636 };
    637 
    638 /**
    639   * Class for handling data and notify callbacks to application
    640   */
    641 class   AppCallbackNotifier: public ErrorNotifier , public virtual android::RefBase
    642 {
    643 
    644 public:
    645 
    646     ///Constants
    647     static const int NOTIFIER_TIMEOUT;
    648     static const int32_t MAX_BUFFERS = 8;
    649 
    650     enum NotifierCommands
    651         {
    652         NOTIFIER_CMD_PROCESS_EVENT,
    653         NOTIFIER_CMD_PROCESS_FRAME,
    654         NOTIFIER_CMD_PROCESS_ERROR
    655         };
    656 
    657     enum NotifierState
    658         {
    659         NOTIFIER_STOPPED,
    660         NOTIFIER_STARTED,
    661         NOTIFIER_EXITED
    662         };
    663 
    664 public:
    665 
    666     ~AppCallbackNotifier();
    667 
    668     ///Initialzes the callback notifier, creates any resources required
    669     status_t initialize();
    670 
    671     ///Starts the callbacks to application
    672     status_t start();
    673 
    674     ///Stops the callbacks from going to application
    675     status_t stop();
    676 
    677     void setEventProvider(int32_t eventMask, MessageNotifier * eventProvider);
    678     void setFrameProvider(FrameNotifier *frameProvider);
    679 
    680     //All sub-components of Camera HAL call this whenever any error happens
    681     virtual void errorNotify(int error);
    682 
    683     status_t startPreviewCallbacks(android::CameraParameters &params, CameraBuffer *buffers, uint32_t *offsets, int fd, size_t length, size_t count);
    684     status_t stopPreviewCallbacks();
    685 
    686     status_t enableMsgType(int32_t msgType);
    687     status_t disableMsgType(int32_t msgType);
    688 
    689     //API for enabling/disabling measurement data
    690     void setMeasurements(bool enable);
    691 
    692     //thread loops
    693     bool notificationThread();
    694 
    695     ///Notification callback functions
    696     static void frameCallbackRelay(CameraFrame* caFrame);
    697     static void eventCallbackRelay(CameraHalEvent* chEvt);
    698     void frameCallback(CameraFrame* caFrame);
    699     void eventCallback(CameraHalEvent* chEvt);
    700     void flushAndReturnFrames();
    701 
    702     void setCallbacks(CameraHal *cameraHal,
    703                         camera_notify_callback notify_cb,
    704                         camera_data_callback data_cb,
    705                         camera_data_timestamp_callback data_cb_timestamp,
    706                         camera_request_memory get_memory,
    707                         void *user);
    708 
    709     //Set Burst mode
    710     void setBurst(bool burst);
    711 
    712     //Notifications from CameraHal for video recording case
    713     status_t startRecording();
    714     status_t stopRecording();
    715     status_t initSharedVideoBuffers(CameraBuffer *buffers, uint32_t *offsets, int fd, size_t length, size_t count, CameraBuffer *vidBufs);
    716     status_t releaseRecordingFrame(const void *opaque);
    717 
    718     status_t useMetaDataBufferMode(bool enable);
    719 
    720     void EncoderDoneCb(void*, void*, CameraFrame::FrameType type, void* cookie1, void* cookie2, void *cookie3);
    721 
    722     void useVideoBuffers(bool useVideoBuffers);
    723 
    724     bool getUesVideoBuffers();
    725     void setVideoRes(int width, int height);
    726 
    727     void flushEventQueue();
    728 
    729     //Internal class definitions
    730     class NotificationThread : public android::Thread {
    731         AppCallbackNotifier* mAppCallbackNotifier;
    732         Utils::MessageQueue mNotificationThreadQ;
    733     public:
    734         enum NotificationThreadCommands
    735         {
    736         NOTIFIER_START,
    737         NOTIFIER_STOP,
    738         NOTIFIER_EXIT,
    739         };
    740     public:
    741         NotificationThread(AppCallbackNotifier* nh)
    742             : Thread(false), mAppCallbackNotifier(nh) { }
    743         virtual bool threadLoop() {
    744             return mAppCallbackNotifier->notificationThread();
    745         }
    746 
    747         Utils::MessageQueue &msgQ() { return mNotificationThreadQ;}
    748     };
    749 
    750     //Friend declarations
    751     friend class NotificationThread;
    752 
    753 private:
    754     void notifyEvent();
    755     void notifyFrame();
    756     bool processMessage();
    757     void releaseSharedVideoBuffers();
    758     status_t dummyRaw();
    759     void copyAndSendPictureFrame(CameraFrame* frame, int32_t msgType);
    760     void copyAndSendPreviewFrame(CameraFrame* frame, int32_t msgType);
    761     size_t calculateBufferSize(size_t width, size_t height, const char *pixelFormat);
    762     const char* getContstantForPixelFormat(const char *pixelFormat);
    763 
    764 private:
    765     mutable android::Mutex mLock;
    766     mutable android::Mutex mBurstLock;
    767     CameraHal* mCameraHal;
    768     camera_notify_callback mNotifyCb;
    769     camera_data_callback   mDataCb;
    770     camera_data_timestamp_callback mDataCbTimestamp;
    771     camera_request_memory mRequestMemory;
    772     void *mCallbackCookie;
    773 
    774     //Keeps Video MemoryHeaps and Buffers within
    775     //these objects
    776     android::KeyedVector<unsigned int, unsigned int> mVideoHeaps;
    777     android::KeyedVector<unsigned int, unsigned int> mVideoBuffers;
    778     android::KeyedVector<void *, CameraBuffer *> mVideoMap;
    779 
    780     //Keeps list of Gralloc handles and associated Video Metadata Buffers
    781     android::KeyedVector<void *, camera_memory_t *> mVideoMetadataBufferMemoryMap;
    782     android::KeyedVector<void *, CameraBuffer *> mVideoMetadataBufferReverseMap;
    783 
    784     bool mBufferReleased;
    785 
    786     android::sp< NotificationThread> mNotificationThread;
    787     EventProvider *mEventProvider;
    788     FrameProvider *mFrameProvider;
    789     Utils::MessageQueue mEventQ;
    790     Utils::MessageQueue mFrameQ;
    791     NotifierState mNotifierState;
    792 
    793     bool mPreviewing;
    794     camera_memory_t* mPreviewMemory;
    795     CameraBuffer mPreviewBuffers[MAX_BUFFERS];
    796     int mPreviewBufCount;
    797     int mPreviewWidth;
    798     int mPreviewHeight;
    799     int mPreviewStride;
    800     const char *mPreviewPixelFormat;
    801     android::KeyedVector<unsigned int, android::sp<android::MemoryHeapBase> > mSharedPreviewHeaps;
    802     android::KeyedVector<unsigned int, android::sp<android::MemoryBase> > mSharedPreviewBuffers;
    803 
    804     //Burst mode active
    805     bool mBurst;
    806     mutable android::Mutex mRecordingLock;
    807     bool mRecording;
    808     bool mMeasurementEnabled;
    809 
    810     bool mUseMetaDataBufferMode;
    811     bool mRawAvailable;
    812 
    813     bool mUseVideoBuffers;
    814 
    815     int mVideoWidth;
    816     int mVideoHeight;
    817 
    818 };
    819 
    820 
    821 /**
    822   * Class used for allocating memory for JPEG bit stream buffers, output buffers of camera in no overlay case
    823   */
    824 class MemoryManager : public BufferProvider, public virtual android::RefBase
    825 {
    826 public:
    827     MemoryManager();
    828     ~MemoryManager();
    829 
    830     status_t initialize();
    831 
    832     int setErrorHandler(ErrorNotifier *errorNotifier);
    833     virtual CameraBuffer * allocateBufferList(int width, int height, const char* format, int &bytes, int numBufs);
    834     virtual CameraBuffer *getBufferList(int *numBufs);
    835     virtual uint32_t * getOffsets();
    836     virtual int getFd() ;
    837     virtual int freeBufferList(CameraBuffer * buflist);
    838 
    839 private:
    840     android::sp<ErrorNotifier> mErrorNotifier;
    841     int mIonFd;
    842 };
    843 
    844 
    845 
    846 
    847 /**
    848   * CameraAdapter interface class
    849   * Concrete classes derive from this class and provide implementations based on the specific camera h/w interface
    850   */
    851 
    852 class CameraAdapter: public FrameNotifier, public virtual android::RefBase
    853 {
    854 protected:
    855     enum AdapterActiveStates {
    856         INTIALIZED_ACTIVE =         1 << 0,
    857         LOADED_PREVIEW_ACTIVE =     1 << 1,
    858         PREVIEW_ACTIVE =            1 << 2,
    859         LOADED_CAPTURE_ACTIVE =     1 << 3,
    860         CAPTURE_ACTIVE =            1 << 4,
    861         BRACKETING_ACTIVE =         1 << 5,
    862         AF_ACTIVE =                 1 << 6,
    863         ZOOM_ACTIVE =               1 << 7,
    864         VIDEO_ACTIVE =              1 << 8,
    865         LOADED_REPROCESS_ACTIVE =   1 << 9,
    866         REPROCESS_ACTIVE =          1 << 10,
    867     };
    868 public:
    869     typedef struct
    870         {
    871          CameraBuffer *mBuffers;
    872          uint32_t *mOffsets;
    873          int mFd;
    874          size_t mLength;
    875          size_t mCount;
    876          size_t mMaxQueueable;
    877         } BuffersDescriptor;
    878 
    879     enum CameraCommands
    880         {
    881         CAMERA_START_PREVIEW                        = 0,
    882         CAMERA_STOP_PREVIEW                         = 1,
    883         CAMERA_START_VIDEO                          = 2,
    884         CAMERA_STOP_VIDEO                           = 3,
    885         CAMERA_START_IMAGE_CAPTURE                  = 4,
    886         CAMERA_STOP_IMAGE_CAPTURE                   = 5,
    887         CAMERA_PERFORM_AUTOFOCUS                    = 6,
    888         CAMERA_CANCEL_AUTOFOCUS                     = 7,
    889         CAMERA_PREVIEW_FLUSH_BUFFERS                = 8,
    890         CAMERA_START_SMOOTH_ZOOM                    = 9,
    891         CAMERA_STOP_SMOOTH_ZOOM                     = 10,
    892         CAMERA_USE_BUFFERS_PREVIEW                  = 11,
    893         CAMERA_SET_TIMEOUT                          = 12,
    894         CAMERA_CANCEL_TIMEOUT                       = 13,
    895         CAMERA_START_BRACKET_CAPTURE                = 14,
    896         CAMERA_STOP_BRACKET_CAPTURE                 = 15,
    897         CAMERA_QUERY_RESOLUTION_PREVIEW             = 16,
    898         CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE      = 17,
    899         CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA       = 18,
    900         CAMERA_USE_BUFFERS_IMAGE_CAPTURE            = 19,
    901         CAMERA_USE_BUFFERS_PREVIEW_DATA             = 20,
    902         CAMERA_TIMEOUT_EXPIRED                      = 21,
    903         CAMERA_START_FD                             = 22,
    904         CAMERA_STOP_FD                              = 23,
    905         CAMERA_SWITCH_TO_EXECUTING                  = 24,
    906         CAMERA_USE_BUFFERS_VIDEO_CAPTURE            = 25,
    907 #ifdef OMAP_ENHANCEMENT_CPCAM
    908         CAMERA_USE_BUFFERS_REPROCESS                = 26,
    909         CAMERA_START_REPROCESS                      = 27,
    910 #endif
    911 #ifdef OMAP_ENHANCEMENT_VTC
    912         CAMERA_SETUP_TUNNEL                         = 28,
    913         CAMERA_DESTROY_TUNNEL                       = 29,
    914 #endif
    915         CAMERA_PREVIEW_INITIALIZATION               = 30,
    916         };
    917 
    918     enum CameraMode
    919         {
    920         CAMERA_PREVIEW,
    921         CAMERA_IMAGE_CAPTURE,
    922         CAMERA_VIDEO,
    923         CAMERA_MEASUREMENT,
    924         CAMERA_REPROCESS,
    925         };
    926 
    927     enum AdapterState {
    928         INTIALIZED_STATE                = INTIALIZED_ACTIVE,
    929         LOADED_PREVIEW_STATE            = LOADED_PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    930         PREVIEW_STATE                   = PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    931         LOADED_CAPTURE_STATE            = LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    932         CAPTURE_STATE                   = CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    933         BRACKETING_STATE                = BRACKETING_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE ,
    934         AF_STATE                        = AF_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    935         ZOOM_STATE                      = ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    936         VIDEO_STATE                     = VIDEO_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    937         VIDEO_AF_STATE                  = VIDEO_ACTIVE | AF_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    938         VIDEO_ZOOM_STATE                = VIDEO_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    939         VIDEO_LOADED_CAPTURE_STATE      = VIDEO_ACTIVE | LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    940         VIDEO_CAPTURE_STATE             = VIDEO_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    941         AF_ZOOM_STATE                   = AF_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    942         BRACKETING_ZOOM_STATE           = BRACKETING_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    943         LOADED_REPROCESS_STATE          = LOADED_REPROCESS_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    944         LOADED_REPROCESS_CAPTURE_STATE  = LOADED_REPROCESS_ACTIVE | LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    945         REPROCESS_STATE                 = REPROCESS_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
    946     };
    947 
    948 
    949 public:
    950 
    951     ///Initialzes the camera adapter creates any resources required
    952     virtual int initialize(CameraProperties::Properties*) = 0;
    953 
    954     virtual int setErrorHandler(ErrorNotifier *errorNotifier) = 0;
    955 
    956     //Message/Frame notification APIs
    957     virtual void enableMsgType(int32_t msgs,
    958                                frame_callback callback = NULL,
    959                                event_callback eventCb = NULL,
    960                                void *cookie = NULL) = 0;
    961     virtual void disableMsgType(int32_t msgs, void* cookie) = 0;
    962     virtual void returnFrame(CameraBuffer* frameBuf, CameraFrame::FrameType frameType) = 0;
    963     virtual void addFramePointers(CameraBuffer *frameBuf, void *buf) = 0;
    964     virtual void removeFramePointers() = 0;
    965 
    966     //APIs to configure Camera adapter and get the current parameter set
    967     virtual int setParameters(const android::CameraParameters& params) = 0;
    968     virtual void getParameters(android::CameraParameters& params) = 0;
    969 
    970     //Registers callback for returning image buffers back to CameraHAL
    971     virtual int registerImageReleaseCallback(release_image_buffers_callback callback, void *user_data) = 0;
    972 
    973     //Registers callback, which signals a completed image capture
    974     virtual int registerEndCaptureCallback(end_image_capture_callback callback, void *user_data) = 0;
    975 
    976     //API to send a command to the camera
    977     virtual status_t sendCommand(CameraCommands operation, int value1=0, int value2=0, int value3=0, int value4=0) = 0;
    978 
    979     virtual ~CameraAdapter() {};
    980 
    981     //Retrieves the current Adapter state
    982     virtual AdapterState getState() = 0;
    983 
    984     //Retrieves the next Adapter state
    985     virtual AdapterState getNextState() = 0;
    986 
    987     // Receive orientation events from CameraHal
    988     virtual void onOrientationEvent(uint32_t orientation, uint32_t tilt) = 0;
    989 
    990     // Rolls the state machine back to INTIALIZED_STATE from the current state
    991     virtual status_t rollbackToInitializedState() = 0;
    992 
    993     // Retrieves the current Adapter state - for internal use (not locked)
    994     virtual status_t getState(AdapterState &state) = 0;
    995     // Retrieves the next Adapter state - for internal use (not locked)
    996     virtual status_t getNextState(AdapterState &state) = 0;
    997 
    998     virtual status_t setSharedAllocator(camera_request_memory shmem_alloc) = 0;
    999 
   1000 protected:
   1001     //The first two methods will try to switch the adapter state.
   1002     //Every call to setState() should be followed by a corresponding
   1003     //call to commitState(). If the state switch fails, then it will
   1004     //get reset to the previous state via rollbackState().
   1005     virtual status_t setState(CameraCommands operation) = 0;
   1006     virtual status_t commitState() = 0;
   1007     virtual status_t rollbackState() = 0;
   1008 };
   1009 
   1010 class DisplayAdapter : public BufferProvider, public virtual android::RefBase
   1011 {
   1012 public:
   1013     DisplayAdapter();
   1014 
   1015 #ifdef OMAP_ENHANCEMENT
   1016     preview_stream_extended_ops_t * extendedOps() const {
   1017         return mExtendedOps;
   1018     }
   1019 
   1020     void setExtendedOps(preview_stream_extended_ops_t * extendedOps);
   1021 #endif
   1022 
   1023     ///Initializes the display adapter creates any resources required
   1024     virtual int initialize() = 0;
   1025 
   1026     virtual int setPreviewWindow(struct preview_stream_ops *window) = 0;
   1027     virtual int setFrameProvider(FrameNotifier *frameProvider) = 0;
   1028     virtual int setErrorHandler(ErrorNotifier *errorNotifier) = 0;
   1029     virtual int enableDisplay(int width, int height, struct timeval *refTime = NULL) = 0;
   1030     virtual int disableDisplay(bool cancel_buffer = true) = 0;
   1031     //Used for Snapshot review temp. pause
   1032     virtual int pauseDisplay(bool pause) = 0;
   1033 
   1034 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   1035     //Used for shot to snapshot measurement
   1036     virtual int setSnapshotTimeRef(struct timeval *refTime = NULL) = 0;
   1037 #endif
   1038 
   1039     virtual bool supportsExternalBuffering() = 0;
   1040 
   1041     // Get max queueable buffers display supports
   1042     // This function should only be called after
   1043     // allocateBufferList
   1044     virtual status_t maxQueueableBuffers(unsigned int& queueable) = 0;
   1045 
   1046     // Get min buffers display needs at any given time
   1047     virtual status_t minUndequeueableBuffers(int& unqueueable) = 0;
   1048 
   1049     // Given a vector of DisplayAdapters find the one corresponding to str
   1050     virtual bool match(const char * str) { return false; }
   1051 
   1052 private:
   1053 #ifdef OMAP_ENHANCEMENT
   1054     preview_stream_extended_ops_t * mExtendedOps;
   1055 #endif
   1056 };
   1057 
   1058 static void releaseImageBuffers(void *userData);
   1059 
   1060 static void endImageCapture(void *userData);
   1061 
   1062  /**
   1063     Implementation of the Android Camera hardware abstraction layer
   1064 
   1065     This class implements the interface methods defined in CameraHardwareInterface
   1066     for the OMAP4 platform
   1067 
   1068 */
   1069 class CameraHal
   1070 
   1071 {
   1072 
   1073 public:
   1074     ///Constants
   1075     static const int NO_BUFFERS_PREVIEW;
   1076     static const int NO_BUFFERS_IMAGE_CAPTURE;
   1077     static const int NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP;
   1078     static const uint32_t VFR_SCALE = 1000;
   1079 
   1080 
   1081     /*--------------------Interface Methods---------------------------------*/
   1082 
   1083      //@{
   1084 public:
   1085 
   1086     /** Set the notification and data callbacks */
   1087     void setCallbacks(camera_notify_callback notify_cb,
   1088                         camera_data_callback data_cb,
   1089                         camera_data_timestamp_callback data_cb_timestamp,
   1090                         camera_request_memory get_memory,
   1091                         void *user);
   1092 
   1093     /** Receives orientation events from SensorListener **/
   1094     void onOrientationEvent(uint32_t orientation, uint32_t tilt);
   1095 
   1096     /**
   1097      * The following three functions all take a msgtype,
   1098      * which is a bitmask of the messages defined in
   1099      * include/ui/Camera.h
   1100      */
   1101 
   1102     /**
   1103      * Enable a message, or set of messages.
   1104      */
   1105     void        enableMsgType(int32_t msgType);
   1106 
   1107     /**
   1108      * Disable a message, or a set of messages.
   1109      */
   1110     void        disableMsgType(int32_t msgType);
   1111 
   1112     /**
   1113      * Query whether a message, or a set of messages, is enabled.
   1114      * Note that this is operates as an AND, if any of the messages
   1115      * queried are off, this will return false.
   1116      */
   1117     int        msgTypeEnabled(int32_t msgType);
   1118 
   1119     /**
   1120      * Start preview mode.
   1121      */
   1122     int    startPreview();
   1123 
   1124     /**
   1125      * Set preview mode related initialization.
   1126      * Only used when slice based processing is enabled.
   1127      */
   1128     int    cameraPreviewInitialization();
   1129 
   1130     /**
   1131      * Only used if overlays are used for camera preview.
   1132      */
   1133     int setPreviewWindow(struct preview_stream_ops *window);
   1134 
   1135 #ifdef OMAP_ENHANCEMENT_CPCAM
   1136     void setExtendedPreviewStreamOps(preview_stream_extended_ops_t *ops);
   1137 
   1138     /**
   1139      * Set a tap-in or tap-out point.
   1140      */
   1141     int setBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout);
   1142 #endif
   1143 
   1144     /**
   1145      * Release a tap-in or tap-out point.
   1146      */
   1147     int releaseBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout);
   1148 
   1149     /**
   1150      * Stop a previously started preview.
   1151      */
   1152     void        stopPreview();
   1153 
   1154     /**
   1155      * Returns true if preview is enabled.
   1156      */
   1157     bool        previewEnabled();
   1158 
   1159     /**
   1160      * Start record mode. When a record image is available a CAMERA_MSG_VIDEO_FRAME
   1161      * message is sent with the corresponding frame. Every record frame must be released
   1162      * by calling releaseRecordingFrame().
   1163      */
   1164     int    startRecording();
   1165 
   1166     /**
   1167      * Stop a previously started recording.
   1168      */
   1169     void        stopRecording();
   1170 
   1171     /**
   1172      * Returns true if recording is enabled.
   1173      */
   1174     int        recordingEnabled();
   1175 
   1176     /**
   1177      * Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
   1178      */
   1179     void        releaseRecordingFrame(const void *opaque);
   1180 
   1181     /**
   1182      * Start auto focus, the notification callback routine is called
   1183      * with CAMERA_MSG_FOCUS once when focusing is complete. autoFocus()
   1184      * will be called again if another auto focus is needed.
   1185      */
   1186     int    autoFocus();
   1187 
   1188     /**
   1189      * Cancels auto-focus function. If the auto-focus is still in progress,
   1190      * this function will cancel it. Whether the auto-focus is in progress
   1191      * or not, this function will return the focus position to the default.
   1192      * If the camera does not support auto-focus, this is a no-op.
   1193      */
   1194     int    cancelAutoFocus();
   1195 
   1196     /**
   1197      * Take a picture.
   1198      */
   1199     int    takePicture(const char* params);
   1200 
   1201     /**
   1202      * Cancel a picture that was started with takePicture.  Calling this
   1203      * method when no picture is being taken is a no-op.
   1204      */
   1205     int    cancelPicture();
   1206 
   1207     /** Set the camera parameters. */
   1208     int    setParameters(const char* params);
   1209     int    setParameters(const android::CameraParameters& params);
   1210 
   1211     /** Return the camera parameters. */
   1212     char*  getParameters();
   1213     void putParameters(char *);
   1214 
   1215     /**
   1216      * Send command to camera driver.
   1217      */
   1218     int sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
   1219 
   1220     /**
   1221      * Release the hardware resources owned by this object.  Note that this is
   1222      * *not* done in the destructor.
   1223      */
   1224     void release();
   1225 
   1226     /**
   1227      * Dump state of the camera hardware
   1228      */
   1229     int dump(int fd) const;
   1230 
   1231 #ifdef OMAP_ENHANCEMENT_CPCAM
   1232     /**
   1233      * start a reprocessing operation.
   1234      */
   1235     int    reprocess(const char* params);
   1236 
   1237     /**
   1238      * cancels current reprocessing operation
   1239      */
   1240     int    cancel_reprocess();
   1241 #endif
   1242 
   1243     status_t storeMetaDataInBuffers(bool enable);
   1244 
   1245      //@}
   1246 
   1247 /*--------------------Internal Member functions - Public---------------------------------*/
   1248 
   1249 public:
   1250  /** @name internalFunctionsPublic */
   1251   //@{
   1252 
   1253     /** Constructor of CameraHal */
   1254     CameraHal(int cameraId);
   1255 
   1256     // Destructor of CameraHal
   1257     ~CameraHal();
   1258 
   1259     /** Initialize CameraHal */
   1260     status_t initialize(CameraProperties::Properties*);
   1261 
   1262     /** Deinitialize CameraHal */
   1263     void deinitialize();
   1264 
   1265 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   1266 
   1267     //Uses the constructor timestamp as a reference to calcluate the
   1268     // elapsed time
   1269     static void PPM(const char *);
   1270     //Uses a user provided timestamp as a reference to calcluate the
   1271     // elapsed time
   1272     static void PPM(const char *, struct timeval*, ...);
   1273 
   1274 #endif
   1275 
   1276     /** Free image bufs */
   1277     status_t freeImageBufs();
   1278 
   1279     //Signals the end of image capture
   1280     status_t signalEndImageCapture();
   1281 
   1282     //Events
   1283     static void eventCallbackRelay(CameraHalEvent* event);
   1284     void eventCallback(CameraHalEvent* event);
   1285     void setEventProvider(int32_t eventMask, MessageNotifier * eventProvider);
   1286 
   1287     static const char* getPixelFormatConstant(const char* parameters_format);
   1288     static size_t calculateBufferSize(const char* parameters_format, int width, int height);
   1289     static void getXYFromOffset(unsigned int *x, unsigned int *y,
   1290                                 unsigned int offset, unsigned int stride,
   1291                                 const char* format);
   1292     static unsigned int getBPP(const char* format);
   1293 
   1294 /*--------------------Internal Member functions - Private---------------------------------*/
   1295 private:
   1296 
   1297     /** @name internalFunctionsPrivate */
   1298     //@{
   1299 
   1300     /**  Set the camera parameters specific to Video Recording. */
   1301     bool        setVideoModeParameters(const android::CameraParameters&);
   1302 
   1303     /** Reset the camera parameters specific to Video Recording. */
   1304     bool       resetVideoModeParameters();
   1305 
   1306     /** Restart the preview with setParameter. */
   1307     status_t        restartPreview();
   1308 
   1309     status_t parseResolution(const char *resStr, int &width, int &height);
   1310 
   1311     void insertSupportedParams();
   1312 
   1313     /** Allocate preview data buffers */
   1314     status_t allocPreviewDataBufs(size_t size, size_t bufferCount);
   1315 
   1316     /** Free preview data buffers */
   1317     status_t freePreviewDataBufs();
   1318 
   1319     /** Allocate preview buffers */
   1320     status_t allocPreviewBufs(int width, int height, const char* previewFormat, unsigned int bufferCount, unsigned int &max_queueable);
   1321 
   1322     /** Allocate video buffers */
   1323     status_t allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount);
   1324 
   1325     /** Allocate image capture buffers */
   1326     status_t allocImageBufs(unsigned int width, unsigned int height, size_t length,
   1327                             const char* previewFormat, unsigned int bufferCount);
   1328 
   1329     /** Allocate Raw buffers */
   1330     status_t allocRawBufs(int width, int height, const char* previewFormat, int bufferCount);
   1331 
   1332     /** Free preview buffers */
   1333     status_t freePreviewBufs();
   1334 
   1335     /** Free video bufs */
   1336     status_t freeVideoBufs(CameraBuffer *bufs);
   1337 
   1338     /** Free RAW bufs */
   1339     status_t freeRawBufs();
   1340 
   1341     //Check if a given resolution is supported by the current camera
   1342     //instance
   1343     bool isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions);
   1344 
   1345     //Check if a given variable frame rate range is supported by the current camera
   1346     //instance
   1347     bool isFpsRangeValid(int fpsMin, int fpsMax, const char *supportedFpsRanges);
   1348 
   1349     //Check if a given parameter is supported by the current camera
   1350     // instance
   1351     bool isParameterValid(const char *param, const char *supportedParams);
   1352     bool isParameterValid(int param, const char *supportedParams);
   1353     status_t doesSetParameterNeedUpdate(const char *new_param, const char *old_params, bool &update);
   1354 
   1355     /** Initialize default parameters */
   1356     void initDefaultParameters();
   1357 
   1358     void dumpProperties(CameraProperties::Properties& cameraProps);
   1359 
   1360     status_t startImageBracketing();
   1361 
   1362     status_t stopImageBracketing();
   1363 
   1364     void setShutter(bool enable);
   1365 
   1366     void forceStopPreview();
   1367 
   1368     void getPreferredPreviewRes(int *width, int *height);
   1369     void resetPreviewRes(android::CameraParameters *params);
   1370 
   1371     // Internal __takePicture function - used in public takePicture() and reprocess()
   1372     int   __takePicture(const char* params, struct timeval *captureStart = NULL);
   1373     //@}
   1374 
   1375     status_t setTapoutLocked(struct preview_stream_ops *out);
   1376     status_t releaseTapoutLocked(struct preview_stream_ops *out);
   1377     status_t setTapinLocked(struct preview_stream_ops *in);
   1378     status_t releaseTapinLocked(struct preview_stream_ops *in);
   1379 /*----------Member variables - Public ---------------------*/
   1380 public:
   1381     int32_t mMsgEnabled;
   1382     bool mRecordEnabled;
   1383     nsecs_t mCurrentTime;
   1384     bool mFalsePreview;
   1385     bool mPreviewEnabled;
   1386     uint32_t mTakePictureQueue;
   1387     bool mBracketingEnabled;
   1388     bool mBracketingRunning;
   1389     //User shutter override
   1390     bool mShutterEnabled;
   1391     bool mMeasurementEnabled;
   1392     //Google's parameter delimiter
   1393     static const char PARAMS_DELIMITER[];
   1394 
   1395     CameraAdapter *mCameraAdapter;
   1396     android::sp<AppCallbackNotifier> mAppCallbackNotifier;
   1397     android::sp<DisplayAdapter> mDisplayAdapter;
   1398     android::sp<MemoryManager> mMemoryManager;
   1399 
   1400     android::Vector< android::sp<DisplayAdapter> > mOutAdapters;
   1401     android::Vector< android::sp<DisplayAdapter> > mInAdapters;
   1402 
   1403     // TODO(XXX): Even though we support user setting multiple BufferSourceAdapters now
   1404     // only one tap in surface and one tap out surface is supported at a time.
   1405     android::sp<DisplayAdapter> mBufferSourceAdapter_In;
   1406     android::sp<DisplayAdapter> mBufferSourceAdapter_Out;
   1407 
   1408 #ifdef OMAP_ENHANCEMENT
   1409     preview_stream_extended_ops_t * mExtendedPreviewStreamOps;
   1410 #endif
   1411 
   1412     android::sp<android::IMemoryHeap> mPictureHeap;
   1413 
   1414     int* mGrallocHandles;
   1415     bool mFpsRangeChangedByApp;
   1416 
   1417 
   1418     int mRawWidth;
   1419     int mRawHeight;
   1420     bool mRawCapture;
   1421 
   1422 
   1423 ///static member vars
   1424 
   1425     static const int SW_SCALING_FPS_LIMIT;
   1426 
   1427 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   1428 
   1429     //Timestamp from the CameraHal constructor
   1430     static struct timeval ppm_start;
   1431     //Timestamp of the autoFocus command
   1432     static struct timeval mStartFocus;
   1433     //Timestamp of the startPreview command
   1434     static struct timeval mStartPreview;
   1435     //Timestamp of the takePicture command
   1436     static struct timeval mStartCapture;
   1437 
   1438 #endif
   1439 
   1440 /*----------Member variables - Private ---------------------*/
   1441 private:
   1442     bool mDynamicPreviewSwitch;
   1443     //keeps paused state of display
   1444     bool mDisplayPaused;
   1445 
   1446 #ifdef OMAP_ENHANCEMENT_VTC
   1447     bool mTunnelSetup;
   1448     bool mVTCUseCase;
   1449 #endif
   1450 
   1451     //Index of current camera adapter
   1452     int mCameraIndex;
   1453 
   1454     mutable android::Mutex mLock;
   1455 
   1456     android::sp<SensorListener> mSensorListener;
   1457 
   1458     void* mCameraAdapterHandle;
   1459 
   1460     android::CameraParameters mParameters;
   1461     bool mPreviewRunning;
   1462     bool mPreviewStateOld;
   1463     bool mRecordingEnabled;
   1464     EventProvider *mEventProvider;
   1465 
   1466     CameraBuffer *mPreviewDataBuffers;
   1467     uint32_t *mPreviewDataOffsets;
   1468     int mPreviewDataFd;
   1469     int mPreviewDataLength;
   1470     CameraBuffer *mImageBuffers;
   1471     uint32_t *mImageOffsets;
   1472     int mImageFd;
   1473     int mImageLength;
   1474     unsigned int mImageCount;
   1475     CameraBuffer *mPreviewBuffers;
   1476     uint32_t *mPreviewOffsets;
   1477     int mPreviewLength;
   1478     int mPreviewFd;
   1479     CameraBuffer *mVideoBuffers;
   1480     uint32_t *mVideoOffsets;
   1481     int mVideoFd;
   1482     int mVideoLength;
   1483 
   1484     int mBracketRangePositive;
   1485     int mBracketRangeNegative;
   1486 
   1487     ///@todo Rename this as preview buffer provider
   1488     BufferProvider *mBufProvider;
   1489     BufferProvider *mVideoBufProvider;
   1490 
   1491 
   1492     CameraProperties::Properties* mCameraProperties;
   1493 
   1494     bool mPreviewStartInProgress;
   1495     bool mPreviewInitializationDone;
   1496 
   1497     bool mSetPreviewWindowCalled;
   1498 
   1499     uint32_t mPreviewWidth;
   1500     uint32_t mPreviewHeight;
   1501     int32_t mMaxZoomSupported;
   1502 
   1503     int mVideoWidth;
   1504     int mVideoHeight;
   1505 
   1506     android::String8 mCapModeBackup;
   1507 };
   1508 
   1509 } // namespace Camera
   1510 } // namespace Ti
   1511 
   1512 #endif
   1513