Home | History | Annotate | Download | only in HAL
      1 /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
      2  *
      3  * Redistribution and use in source and binary forms, with or without
      4  * modification, are permitted provided that the following conditions are
      5  * met:
      6  *     * Redistributions of source code must retain the above copyright
      7  *       notice, this list of conditions and the following disclaimer.
      8  *     * Redistributions in binary form must reproduce the above
      9  *       copyright notice, this list of conditions and the following
     10  *       disclaimer in the documentation and/or other materials provided
     11  *       with the distribution.
     12  *     * Neither the name of The Linux Foundation nor the names of its
     13  *       contributors may be used to endorse or promote products derived
     14  *       from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  */
     29 
     30 #ifndef __QCAMERA2HWI_MEM_H__
     31 #define __QCAMERA2HWI_MEM_H__
     32 
     33 // System dependencies
     34 #include <linux/msm_ion.h>
     35 #include <utils/Mutex.h>
     36 #include <utils/List.h>
     37 
     38 // Display dependencies
     39 #include "qdMetaData.h"
     40 
     41 // Camera dependencies
     42 #include "camera.h"
     43 
     44 extern "C" {
     45 #include "mm_camera_interface.h"
     46 }
     47 
     48 namespace qcamera {
     49 
     50 class QCameraMemoryPool;
     51 
     52 //OFFSET, SIZE, USAGE, TIMESTAMP, FORMAT
     53 #define VIDEO_METADATA_NUM_INTS          5
     54 
     55 enum QCameraMemType {
     56     QCAMERA_MEM_TYPE_DEFAULT      = 0,
     57     QCAMERA_MEM_TYPE_SECURE       = 1,
     58     QCAMERA_MEM_TYPE_BATCH        = (1 << 1),
     59     QCAMERA_MEM_TYPE_COMPRESSED   = (1 << 2),
     60 };
     61 
     62 // Base class for all memory types. Abstract.
     63 class QCameraMemory {
     64 
     65 public:
     66     int cleanCache(uint32_t index)
     67     {
     68         return cacheOps(index, ION_IOC_CLEAN_CACHES);
     69     }
     70     int invalidateCache(uint32_t index)
     71     {
     72         return cacheOps(index, ION_IOC_INV_CACHES);
     73     }
     74     int cleanInvalidateCache(uint32_t index)
     75     {
     76         return cacheOps(index, ION_IOC_CLEAN_INV_CACHES);
     77     }
     78     int getFd(uint32_t index) const;
     79     ssize_t getSize(uint32_t index) const;
     80     uint8_t getCnt() const;
     81     virtual uint8_t getMappable() const;
     82     virtual uint8_t checkIfAllBuffersMapped() const;
     83 
     84     virtual int allocate(uint8_t count, size_t size, uint32_t is_secure) = 0;
     85     virtual void deallocate() = 0;
     86     virtual int allocateMore(uint8_t count, size_t size) = 0;
     87     virtual int cacheOps(uint32_t index, unsigned int cmd) = 0;
     88     virtual int getRegFlags(uint8_t *regFlags) const = 0;
     89     virtual camera_memory_t *getMemory(uint32_t index,
     90             bool metadata) const = 0;
     91     virtual int getMatchBufIndex(const void *opaque, bool metadata) const = 0;
     92     virtual void *getPtr(uint32_t index) const= 0;
     93 
     94     QCameraMemory(bool cached,
     95                   QCameraMemoryPool *pool = NULL,
     96                   cam_stream_type_t streamType = CAM_STREAM_TYPE_DEFAULT,
     97                   QCameraMemType buf_Type = QCAMERA_MEM_TYPE_DEFAULT);
     98     virtual ~QCameraMemory();
     99     virtual void reset();
    100 
    101     void getBufDef(const cam_frame_len_offset_t &offset,
    102             mm_camera_buf_def_t &bufDef, uint32_t index) const;
    103 
    104     int32_t getUserBufDef(const cam_stream_user_buf_info_t &buf_info,
    105             mm_camera_buf_def_t &bufDef, uint32_t index,
    106             const cam_frame_len_offset_t &plane_offset,
    107             mm_camera_buf_def_t *planebufDef, QCameraMemory *bufs) const;
    108 
    109 protected:
    110 
    111     friend class QCameraMemoryPool;
    112 
    113     struct QCameraMemInfo {
    114         int fd;
    115         int main_ion_fd;
    116         ion_user_handle_t handle;
    117         size_t size;
    118         bool cached;
    119         unsigned int heap_id;
    120     };
    121 
    122     int alloc(int count, size_t size, unsigned int heap_id,
    123             uint32_t is_secure);
    124     void dealloc();
    125     static int allocOneBuffer(struct QCameraMemInfo &memInfo,
    126             unsigned int heap_id, size_t size, bool cached, uint32_t is_secure);
    127     static void deallocOneBuffer(struct QCameraMemInfo &memInfo);
    128     int cacheOpsInternal(uint32_t index, unsigned int cmd, void *vaddr);
    129 
    130     bool m_bCached;
    131     uint8_t mBufferCount;
    132     struct QCameraMemInfo mMemInfo[MM_CAMERA_MAX_NUM_FRAMES];
    133     QCameraMemoryPool *mMemoryPool;
    134     cam_stream_type_t mStreamType;
    135     QCameraMemType mBufType;
    136 };
    137 
    138 class QCameraMemoryPool {
    139 
    140 public:
    141 
    142     QCameraMemoryPool();
    143     virtual ~QCameraMemoryPool();
    144 
    145     int allocateBuffer(struct QCameraMemory::QCameraMemInfo &memInfo,
    146             unsigned int heap_id, size_t size, bool cached,
    147             cam_stream_type_t streamType, uint32_t is_secure);
    148     void releaseBuffer(struct QCameraMemory::QCameraMemInfo &memInfo,
    149             cam_stream_type_t streamType);
    150     void clear();
    151 
    152 protected:
    153 
    154     int findBufferLocked(struct QCameraMemory::QCameraMemInfo &memInfo,
    155             unsigned int heap_id, size_t size, bool cached,
    156             cam_stream_type_t streamType);
    157 
    158     android::List<QCameraMemory::QCameraMemInfo> mPools[CAM_STREAM_TYPE_MAX];
    159     pthread_mutex_t mLock;
    160 };
    161 
    162 // Internal heap memory is used for memories used internally
    163 // They are allocated from /dev/ion.
    164 class QCameraHeapMemory : public QCameraMemory {
    165 public:
    166     QCameraHeapMemory(bool cached);
    167     virtual ~QCameraHeapMemory();
    168 
    169     virtual int allocate(uint8_t count, size_t size, uint32_t is_secure);
    170     virtual int allocateMore(uint8_t count, size_t size);
    171     virtual void deallocate();
    172     virtual int cacheOps(uint32_t index, unsigned int cmd);
    173     virtual int getRegFlags(uint8_t *regFlags) const;
    174     virtual camera_memory_t *getMemory(uint32_t index, bool metadata) const;
    175     virtual int getMatchBufIndex(const void *opaque, bool metadata) const;
    176     virtual void *getPtr(uint32_t index) const;
    177 
    178 private:
    179     void *mPtr[MM_CAMERA_MAX_NUM_FRAMES];
    180 };
    181 
    182 class QCameraMetadataStreamMemory : public QCameraHeapMemory {
    183 public:
    184     QCameraMetadataStreamMemory(bool cached);
    185     virtual ~QCameraMetadataStreamMemory();
    186 
    187     virtual int getRegFlags(uint8_t *regFlags) const;
    188 };
    189 
    190 // Externel heap memory is used for memories shared with
    191 // framework. They are allocated from /dev/ion or gralloc.
    192 class QCameraStreamMemory : public QCameraMemory {
    193 public:
    194     QCameraStreamMemory(camera_request_memory getMemory,
    195                         bool cached,
    196                         QCameraMemoryPool *pool = NULL,
    197                         cam_stream_type_t streamType = CAM_STREAM_TYPE_DEFAULT,
    198                         cam_stream_buf_type buf_Type = CAM_STREAM_BUF_TYPE_MPLANE);
    199     virtual ~QCameraStreamMemory();
    200 
    201     virtual int allocate(uint8_t count, size_t size, uint32_t is_secure);
    202     virtual int allocateMore(uint8_t count, size_t size);
    203     virtual void deallocate();
    204     virtual int cacheOps(uint32_t index, unsigned int cmd);
    205     virtual int getRegFlags(uint8_t *regFlags) const;
    206     virtual camera_memory_t *getMemory(uint32_t index, bool metadata) const;
    207     virtual int getMatchBufIndex(const void *opaque, bool metadata) const;
    208     virtual void *getPtr(uint32_t index) const;
    209 
    210 protected:
    211     camera_request_memory mGetMemory;
    212     camera_memory_t *mCameraMemory[MM_CAMERA_MAX_NUM_FRAMES];
    213 };
    214 
    215 // Externel heap memory is used for memories shared with
    216 // framework. They are allocated from /dev/ion or gralloc.
    217 class QCameraVideoMemory : public QCameraStreamMemory {
    218 public:
    219     QCameraVideoMemory(camera_request_memory getMemory, bool cached,
    220             QCameraMemType bufType = QCAMERA_MEM_TYPE_DEFAULT);
    221     virtual ~QCameraVideoMemory();
    222 
    223     virtual int allocate(uint8_t count, size_t size, uint32_t is_secure);
    224     virtual int allocateMore(uint8_t count, size_t size);
    225     virtual void deallocate();
    226     virtual camera_memory_t *getMemory(uint32_t index, bool metadata) const;
    227     virtual int getMatchBufIndex(const void *opaque, bool metadata) const;
    228     int allocateMeta(uint8_t buf_cnt, int numFDs, int numInts);
    229     void deallocateMeta();
    230     void setVideoInfo(int usage, cam_format_t format);
    231     int getUsage(){return mUsage;};
    232     int getFormat(){return mFormat;};
    233     int convCamtoOMXFormat(cam_format_t format);
    234     native_handle_t *updateNativeHandle(uint32_t index, bool metadata = true);
    235     int closeNativeHandle(const void *data, bool metadata = true);
    236 private:
    237     camera_memory_t *mMetadata[MM_CAMERA_MAX_NUM_FRAMES];
    238     uint8_t mMetaBufCount;
    239     int mUsage, mFormat;
    240     native_handle_t *mNativeHandle[MM_CAMERA_MAX_NUM_FRAMES];
    241 };
    242 
    243 
    244 // Gralloc Memory is acquired from preview window
    245 class QCameraGrallocMemory : public QCameraMemory {
    246     enum {
    247         BUFFER_NOT_OWNED,
    248         BUFFER_OWNED,
    249     };
    250 public:
    251     QCameraGrallocMemory(camera_request_memory getMemory);
    252     void setNativeWindow(preview_stream_ops_t *anw);
    253     virtual ~QCameraGrallocMemory();
    254 
    255     virtual int allocate(uint8_t count, size_t size, uint32_t is_secure);
    256     virtual int allocateMore(uint8_t count, size_t size);
    257     virtual void deallocate();
    258     virtual int cacheOps(uint32_t index, unsigned int cmd);
    259     virtual int getRegFlags(uint8_t *regFlags) const;
    260     virtual camera_memory_t *getMemory(uint32_t index, bool metadata) const;
    261     virtual int getMatchBufIndex(const void *opaque, bool metadata) const;
    262     virtual void *getPtr(uint32_t index) const;
    263     virtual void setMappable(uint8_t mappable);
    264     virtual uint8_t getMappable() const;
    265     virtual uint8_t checkIfAllBuffersMapped() const;
    266 
    267     void setWindowInfo(preview_stream_ops_t *window, int width, int height,
    268         int stride, int scanline, int format, int maxFPS, int usage = 0);
    269     // Enqueue/display buffer[index] onto the native window,
    270     // and dequeue one buffer from it.
    271     // Returns the buffer index of the dequeued buffer.
    272     int displayBuffer(uint32_t index);
    273     void setMaxFPS(int maxFPS);
    274     int32_t enqueueBuffer(uint32_t index, nsecs_t timeStamp = 0);
    275     int32_t dequeueBuffer();
    276     inline bool isBufOwnedByCamera(uint32_t index){return mLocalFlag[index] == BUFFER_OWNED;};
    277 
    278 private:
    279     buffer_handle_t *mBufferHandle[MM_CAMERA_MAX_NUM_FRAMES];
    280     int mLocalFlag[MM_CAMERA_MAX_NUM_FRAMES];
    281     struct private_handle_t *mPrivateHandle[MM_CAMERA_MAX_NUM_FRAMES];
    282     preview_stream_ops_t *mWindow;
    283     int mWidth, mHeight, mFormat, mStride, mScanline, mUsage, mMaxFPS;
    284     camera_request_memory mGetMemory;
    285     camera_memory_t *mCameraMemory[MM_CAMERA_MAX_NUM_FRAMES];
    286     int mMinUndequeuedBuffers;
    287     enum ColorSpace_t mColorSpace;
    288     uint8_t mMappableBuffers;
    289     pthread_mutex_t mLock;
    290     uint8_t mEnqueuedBuffers;
    291 };
    292 
    293 }; // namespace qcamera
    294 
    295 #endif /* __QCAMERA2HWI_MEM_H__ */
    296