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