111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Redistribution and use in source and binary forms, with or without 411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * modification, are permitted provided that the following conditions are 511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * met: 611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Redistributions of source code must retain the above copyright 711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * notice, this list of conditions and the following disclaimer. 811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Redistributions in binary form must reproduce the above 911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * copyright notice, this list of conditions and the following 1011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * disclaimer in the documentation and/or other materials provided 1111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * with the distribution. 1211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Neither the name of The Linux Foundation nor the names of its 1311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * contributors may be used to endorse or promote products derived 1411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * from this software without specific prior written permission. 1511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 1611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 2811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev */ 2911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#ifndef __QCAMERA2HWI_MEM_H__ 3111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define __QCAMERA2HWI_MEM_H__ 3211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <hardware/camera.h> 3411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <utils/Mutex.h> 3511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern "C" { 3711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <sys/types.h> 3811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <linux/msm_ion.h> 3911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <mm_camera_interface.h> 4011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 4111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevnamespace qcamera { 4311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// Base class for all memory types. Abstract. 4511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCameraMemory { 4611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic: 4811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int cleanCache(int index) {return cacheOps(index, ION_IOC_CLEAN_CACHES);} 4911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int invalidateCache(int index) {return cacheOps(index, ION_IOC_INV_CACHES);} 5011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int cleanInvalidateCache(int index) {return cacheOps(index, ION_IOC_CLEAN_INV_CACHES);} 5111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int getFd(int index) const; 5211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int getSize(int index) const; 5311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int getCnt() const; 5411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 5511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int allocate(int count, int size) = 0; 5611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual void deallocate() = 0; 5711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int cacheOps(int index, unsigned int cmd) = 0; 5811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int getRegFlags(uint8_t *regFlags) const = 0; 5911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual camera_memory_t *getMemory(int index, bool metadata) const = 0; 6011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int getMatchBufIndex(const void *opaque, bool metadata) const = 0; 6111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual void *getPtr(int index) const= 0; 6211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 6311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraMemory(bool cached); 6411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual ~QCameraMemory(); 6511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 6611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void getBufDef(const cam_frame_len_offset_t &offset, 6711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_camera_buf_def_t &bufDef, int index) const; 6811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 6911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprotected: 7011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct QCameraMemInfo { 7111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int fd; 7211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int main_ion_fd; 7311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_handle *handle; 7411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t size; 7511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev }; 7611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 7711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int alloc(int count, int size, int heap_id); 7811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void dealloc(); 7911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int allocOneBuffer(struct QCameraMemInfo &memInfo, int heap_id, int size); 8011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void deallocOneBuffer(struct QCameraMemInfo &memInfo); 8111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int cacheOpsInternal(int index, unsigned int cmd, void *vaddr); 8211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 8311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bool m_bCached; 8411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int mBufferCount; 8511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct QCameraMemInfo mMemInfo[MM_CAMERA_MAX_NUM_FRAMES]; 8611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; 8711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 8811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// Internal heap memory is used for memories used internally 8911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// They are allocated from /dev/ion. 9011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCameraHeapMemory : public QCameraMemory { 9111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic: 9211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraHeapMemory(bool cached); 9311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual ~QCameraHeapMemory(); 9411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 9511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int allocate(int count, int size); 9611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual void deallocate(); 9711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int cacheOps(int index, unsigned int cmd); 9811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int getRegFlags(uint8_t *regFlags) const; 9911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual camera_memory_t *getMemory(int index, bool metadata) const; 10011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int getMatchBufIndex(const void *opaque, bool metadata) const; 10111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual void *getPtr(int index) const; 10211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 10311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate: 10411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void *mPtr[MM_CAMERA_MAX_NUM_FRAMES]; 10511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; 10611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 10711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// Externel heap memory is used for memories shared with 10811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// framework. They are allocated from /dev/ion or gralloc. 10911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCameraStreamMemory : public QCameraMemory { 11011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic: 11111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraStreamMemory(camera_request_memory getMemory, bool cached); 11211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual ~QCameraStreamMemory(); 11311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 11411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int allocate(int count, int size); 11511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual void deallocate(); 11611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int cacheOps(int index, unsigned int cmd); 11711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int getRegFlags(uint8_t *regFlags) const; 11811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual camera_memory_t *getMemory(int index, bool metadata) const; 11911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int getMatchBufIndex(const void *opaque, bool metadata) const; 12011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual void *getPtr(int index) const; 12111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 12211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprotected: 12311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev camera_request_memory mGetMemory; 12411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev camera_memory_t *mCameraMemory[MM_CAMERA_MAX_NUM_FRAMES]; 12511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; 12611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 12711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// Externel heap memory is used for memories shared with 12811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// framework. They are allocated from /dev/ion or gralloc. 12911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCameraVideoMemory : public QCameraStreamMemory { 13011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic: 13111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraVideoMemory(camera_request_memory getMemory, bool cached); 13211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual ~QCameraVideoMemory(); 13311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 13411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int allocate(int count, int size); 13511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual void deallocate(); 13611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual camera_memory_t *getMemory(int index, bool metadata) const; 13711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int getMatchBufIndex(const void *opaque, bool metadata) const; 13811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 13911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate: 14011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev camera_memory_t *mMetadata[MM_CAMERA_MAX_NUM_FRAMES]; 14111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; 14211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev; 14311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 14411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// Gralloc Memory is acquired from preview window 14511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCameraGrallocMemory : public QCameraMemory { 14611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev enum { 14711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev BUFFER_NOT_OWNED, 14811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev BUFFER_OWNED, 14911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev }; 15011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic: 15111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraGrallocMemory(camera_request_memory getMemory); 15211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void setNativeWindow(preview_stream_ops_t *anw); 15311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual ~QCameraGrallocMemory(); 15411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 15511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int allocate(int count, int size); 15611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual void deallocate(); 15711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int cacheOps(int index, unsigned int cmd); 15811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int getRegFlags(uint8_t *regFlags) const; 15911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual camera_memory_t *getMemory(int index, bool metadata) const; 16011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual int getMatchBufIndex(const void *opaque, bool metadata) const; 16111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual void *getPtr(int index) const; 16211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 16311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void setWindowInfo(preview_stream_ops_t *window, int width, int height, int format); 16411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev // Enqueue/display buffer[index] onto the native window, 16511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev // and dequeue one buffer from it. 16611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev // Returns the buffer index of the dequeued buffer. 16711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int displayBuffer(int index); 16811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 16911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate: 17011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev buffer_handle_t *mBufferHandle[MM_CAMERA_MAX_NUM_FRAMES]; 17111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int mLocalFlag[MM_CAMERA_MAX_NUM_FRAMES]; 17211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct private_handle_t *mPrivateHandle[MM_CAMERA_MAX_NUM_FRAMES]; 17311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev preview_stream_ops_t *mWindow; 17411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int mWidth, mHeight, mFormat; 17511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev camera_request_memory mGetMemory; 17611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev camera_memory_t *mCameraMemory[MM_CAMERA_MAX_NUM_FRAMES]; 17711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int mMinUndequeuedBuffers; 17811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; 17911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 18011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; // namespace qcamera 18111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 18211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#endif /* __QCAMERA2HWI_MEM_H__ */ 183