Home | History | Annotate | Download | only in inc
      1 /*
      2 ** Copyright 2008, Google Inc.
      3 ** Copyright (c) 2009-2012, The Linux Foundation. All rights reserved.
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 #ifndef ANDROID_HARDWARE_QCAMERA_STREAM_H
     19 #define ANDROID_HARDWARE_QCAMERA_STREAM_H
     20 
     21 
     22 #include <utils/threads.h>
     23 
     24 #include <binder/MemoryBase.h>
     25 #include <binder/MemoryHeapBase.h>
     26 #include <utils/threads.h>
     27 
     28 
     29 #include "QCameraHWI.h"
     30 extern "C" {
     31 #include <mm_camera_interface.h>
     32 #include <mm_jpeg_interface.h>
     33 
     34 #define OPAQUE_BUFFER_COUNT 5
     35 #define STREAM_TABLE_SIZE 8
     36 
     37 #define MM_CAMERA_CH_PREVIEW_MASK    (0x01 << MM_CAMERA_CH_PREVIEW)
     38 #define MM_CAMERA_CH_VIDEO_MASK      (0x01 << MM_CAMERA_CH_VIDEO)
     39 #define MM_CAMERA_CH_SNAPSHOT_MASK   (0x01 << MM_CAMERA_CH_SNAPSHOT)
     40 
     41 } /* extern C*/
     42 
     43 namespace android {
     44 
     45 class QCameraHardwareInterface;
     46 
     47 class StreamQueue {
     48 private:
     49     Mutex mQueueLock;
     50     Condition mQueueWait;
     51     bool mInitialized;
     52 
     53     //Vector<struct msm_frame *> mContainer;
     54     Vector<void *> mContainer;
     55 public:
     56     StreamQueue();
     57     virtual ~StreamQueue();
     58     bool enqueue(void *element);
     59     void flush();
     60     void* dequeue();
     61     void init();
     62     void deinit();
     63     bool isInitialized();
     64 bool isEmpty();
     65 };
     66 
     67 typedef struct {
     68      int                     buffer_count;
     69      buffer_handle_t         buffer_handle[MM_CAMERA_MAX_NUM_FRAMES];
     70      struct private_handle_t *private_buffer_handle[MM_CAMERA_MAX_NUM_FRAMES];
     71      int                     stride[MM_CAMERA_MAX_NUM_FRAMES];
     72      uint32_t                addr_offset[MM_CAMERA_MAX_NUM_FRAMES];
     73      uint8_t                 local_flag[MM_CAMERA_MAX_NUM_FRAMES];
     74      int                     main_ion_fd[MM_CAMERA_MAX_NUM_FRAMES];
     75      struct ion_fd_data      ion_info_fd[MM_CAMERA_MAX_NUM_FRAMES];
     76 } QCameraStreamMemory_t;
     77 
     78 class QCameraStream {
     79 
     80 public:
     81     bool mInit;
     82     bool mActive;
     83 
     84     uint32_t mCameraHandle;
     85     uint32_t mChannelId;
     86     uint32_t mMmStreamId;
     87     uint32_t mWidth;
     88     uint32_t mHeight;
     89     cam_format_t mFormat;
     90     uint8_t mNumBuffers;
     91     mm_camera_frame_len_offset mFrameOffsetInfo;
     92     mm_camera_vtbl_t *p_mm_ops;
     93     mm_camera_img_mode mExtImgMode;
     94 
     95     uint8_t mPendingCount;
     96 
     97     pthread_mutex_t mFrameDeliveredMutex;
     98     pthread_cond_t mFrameDeliveredCond;
     99 
    100     virtual status_t    init();
    101     virtual status_t    start();
    102     virtual void        stop();
    103     virtual void        release();
    104 
    105     status_t setFormat();
    106     status_t setMode(int enable);
    107 
    108     int getStreamId() {return mStreamId;}
    109     int getMaxBuffers() {return mMaxBuffers;}
    110 
    111     static QCameraStream *getStreamAtId(int id);
    112     static QCameraStream *getStreamAtMmId(uint32_t mm_id);
    113     static void streamOffAll();
    114 
    115     virtual void setHALCameraControl(QCameraHardwareInterface* ctrl);
    116 
    117     virtual int prepareStream() {return NO_ERROR;}
    118     void onNewRequest();
    119     void dataCallback(mm_camera_super_buf_t *bufs);
    120     int32_t streamOn();
    121     int32_t streamOff(bool aSync);
    122     virtual status_t initStream(mm_camera_img_mode imgmode, cam_format_t format);
    123     virtual status_t deinitStream();
    124     virtual status_t initBuffers(){return NO_ERROR;}
    125     virtual sp<IMemoryHeap> getRawHeap() const {return NULL;}
    126     virtual void *getLastQueuedFrame(void){return NULL;}
    127     virtual status_t processPreviewFrame(mm_camera_super_buf_t *frame){return NO_ERROR;}
    128 
    129     /* Set the ANativeWindow */
    130     virtual int setPreviewWindow(const camera2_stream_ops_t* window) {return NO_ERROR;}
    131     virtual void notifyWDenoiseEvent(cam_ctrl_status_t status, void * cookie) {;}
    132     virtual void resetSnapshotCounters(void ){};
    133     virtual void initHdrInfoForSnapshot(bool HDR_on, int number_frames, int *exp){};
    134     virtual void notifyHdrEvent(cam_ctrl_status_t status, void * cookie){};
    135     virtual status_t receiveRawPicture(mm_camera_super_buf_t* recvd_frame){return NO_ERROR;};
    136 
    137     QCameraStream(uint32_t CameraHandle,
    138                         uint32_t ChannelId,
    139                         uint32_t Width,
    140                         uint32_t Height,
    141                         mm_camera_vtbl_t *mm_ops,
    142                         camera_mode_t mode);
    143     virtual ~QCameraStream();
    144 public:
    145     QCameraHardwareInterface*  mHalCamCtrl;
    146     mm_camera_rect_t mCrop;
    147 
    148     camera_mode_t myMode;
    149 
    150     mutable Mutex mLock;
    151 protected:
    152 
    153     uint32_t mStreamId;
    154     int mMaxBuffers;
    155     int allocateStreamId();
    156     int deallocateStreamId(int id);
    157 
    158 private:
    159     static QCameraStream *mStreamTable[STREAM_TABLE_SIZE];
    160 
    161     StreamQueue mBusyQueue;
    162     StreamQueue mFreeQueue;
    163 
    164     QCameraStream();
    165 public:
    166 //     friend void liveshot_callback(mm_camera_ch_data_buf_t *frame,void *user_data);
    167 };
    168 
    169 class QCameraStream_preview : public QCameraStream {
    170 public:
    171     status_t    init();
    172     status_t    start() ;
    173     void        stop()  ;
    174     void        release() ;
    175 
    176     static QCameraStream* createInstance(uint32_t CameraHandle,
    177                         uint32_t ChannelId,
    178                         uint32_t Width,
    179                         uint32_t Height,
    180                         int requestedFormat,
    181                         mm_camera_vtbl_t *mm_ops,
    182                         camera_mode_t mode);
    183     static void deleteInstance(QCameraStream *p);
    184 
    185     virtual ~QCameraStream_preview();
    186     void *getLastQueuedFrame(void);
    187     status_t initBuffers();
    188     void deinitBuffers();
    189 
    190     virtual int prepareStream();
    191     virtual status_t processPreviewFrame(mm_camera_super_buf_t *frame);
    192 
    193     int setPreviewWindow(const camera2_stream_ops_t* window);
    194     int registerStreamBuffers(int num_buffers, buffer_handle_t *buffers);
    195     friend class QCameraHardwareInterface;
    196 
    197 private:
    198     QCameraStream_preview();
    199     QCameraStream_preview(uint32_t CameraHandle,
    200                         uint32_t ChannelId,
    201                         uint32_t Width,
    202                         uint32_t Height,
    203                         int requestedFormat,
    204                         mm_camera_vtbl_t *mm_ops,
    205                         camera_mode_t mode);
    206 
    207     void                     dumpFrameToFile(mm_camera_buf_def_t* newFrame);
    208 
    209 private:
    210     bool                     mFirstFrameRcvd;
    211     QCameraStreamMemory_t mPreviewMemory;
    212     Mutex         mPreviewMemoryLock;
    213 
    214     int8_t                   my_id;
    215     mm_camera_op_mode_type_t op_mode;
    216     mm_camera_buf_def_t      *mLastQueuedFrame;
    217     mm_camera_buf_def_t      *mDisplayBuf;
    218     Mutex                   mDisplayLock;
    219     const camera2_stream_ops_t   *mPreviewWindow;
    220     mm_camera_super_buf_t mNotifyBuffer[16];
    221     int8_t                  mNumFDRcvd;
    222     int                     mVFEOutputs;
    223     int                     mHFRFrameCnt;
    224     int                     mHFRFrameSkip;
    225 };
    226 
    227 class QCameraStream_SnapshotMain : public QCameraStream {
    228 public:
    229     status_t    init();
    230     status_t    start();
    231     void        stop();
    232     void        release();
    233     status_t    initMainBuffers();
    234     void        releaseMainBuffers();
    235     void        initHdrInfoForSnapshot(bool HDR_on, int number_frames, int *exp);
    236     void        notifyHdrEvent(cam_ctrl_status_t status, void * cookie);
    237     static void            deleteInstance(QCameraStream *p);
    238     status_t receiveRawPicture(mm_camera_super_buf_t* recvd_frame);
    239     mm_camera_buf_def_t mSnapshotStreamBuf[MM_CAMERA_MAX_NUM_FRAMES];
    240     static QCameraStream* createInstance(uint32_t CameraHandle,
    241                         uint32_t ChannelId,
    242                         uint32_t Width,
    243                         uint32_t Height,
    244                         uint32_t Format,
    245                         uint8_t NumBuffers,
    246                         mm_camera_vtbl_t *mm_ops,
    247                         mm_camera_img_mode imgmode,
    248                         camera_mode_t mode);
    249     QCameraStream_SnapshotMain(uint32_t CameraHandle,
    250                         uint32_t ChannelId,
    251                         uint32_t Width,
    252                         uint32_t Height,
    253                         uint32_t Format,
    254                         uint8_t NumBuffers,
    255                         mm_camera_vtbl_t *mm_ops,
    256                         mm_camera_img_mode imgmode,
    257                         camera_mode_t mode);
    258     ~QCameraStream_SnapshotMain();
    259 
    260 private:
    261     status_t doHdrProcessing();
    262     status_t encodeData(mm_camera_super_buf_t* recvd_frame);
    263     /*Member variables*/
    264     mm_jpeg_ops_t mJpegHandle;
    265     uint32_t mJpegClientHandle;
    266     int mSnapshotState;
    267     StreamQueue mSnapshotQueue;
    268 };
    269 
    270 class QCameraStream_SnapshotThumbnail : public QCameraStream {
    271 public:
    272     status_t    init();
    273     status_t    start();
    274     void        stop();
    275     void        release();
    276     status_t    initThumbnailBuffers();
    277     static QCameraStream* createInstance(uint32_t CameraHandle,
    278                         uint32_t ChannelId,
    279                         uint32_t Width,
    280                         uint32_t Height,
    281                         uint32_t Format,
    282                         uint8_t NumBuffers,
    283                         mm_camera_vtbl_t *mm_ops,
    284                         mm_camera_img_mode imgmode,
    285                         camera_mode_t mode);
    286     QCameraStream_SnapshotThumbnail(uint32_t CameraHandle,
    287                         uint32_t ChannelId,
    288                         uint32_t Width,
    289                         uint32_t Height,
    290                         uint32_t Format,
    291                         uint8_t NumBuffers,
    292                         mm_camera_vtbl_t *mm_ops,
    293                         mm_camera_img_mode imgmode,
    294                         camera_mode_t mode);
    295     ~QCameraStream_SnapshotThumbnail();
    296     static void            deleteInstance(QCameraStream *p);
    297     mm_camera_buf_def_t mPostviewStreamBuf[MM_CAMERA_MAX_NUM_FRAMES];
    298 };
    299 
    300 }; // namespace android
    301 
    302 #endif
    303