16d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev/*
26d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** Copyright (c) 2011-2012 The Linux Foundation. All rights reserved.
36d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev**
46d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** Licensed under the Apache License, Version 2.0 (the "License");
56d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** you may not use this file except in compliance with the License.
66d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** You may obtain a copy of the License at
76d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev**
86d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev**     http://www.apache.org/licenses/LICENSE-2.0
96d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev**
106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** Unless required by applicable law or agreed to in writing, software
116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** distributed under the License is distributed on an "AS IS" BASIS,
126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** See the License for the specific language governing permissions and
146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** limitations under the License.
156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev*/
166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#ifndef __QCAMERAHWI_MEM_H
196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#define __QCAMERAHWI_MEM_H
206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <binder/MemoryBase.h>
226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <binder/MemoryHeapBase.h>
236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <utils/threads.h>
246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <stdint.h>
256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevextern "C" {
276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <linux/ion.h>
286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <camera_defs_i.h>
296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#define VIDEO_BUFFER_COUNT 5
346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#define VIDEO_BUFFER_COUNT_LOW_POWER_CAMCORDER 9
356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#define PREVIEW_BUFFER_COUNT 5
376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevnamespace android {
396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// This class represents a heap which maintains several contiguous
416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// buffers.  The heap may be backed by pmem (when pmem_pool contains
426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// the name of a /dev/pmem* file), or by ashmem (when pmem_pool == NULL).
436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevstruct MemPool : public RefBase {
456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    MemPool(int buffer_size, int num_buffers,
466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            int frame_size,
476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            const char *name);
486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    virtual ~MemPool() = 0;
506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    void completeInitialization();
526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    bool initialized() const {
536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        return mHeap != NULL && mHeap->base() != MAP_FAILED;
546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    virtual status_t dump(int fd, const Vector<String16>& args) const;
576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mBufferSize;
596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mAlignedBufferSize;
606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mNumBuffers;
616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mFrameSize;
626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    sp<MemoryHeapBase> mHeap;
636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    sp<MemoryBase> *mBuffers;
646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    const char *mName;
666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev};
676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevclass AshmemPool : public MemPool {
696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevpublic:
706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    AshmemPool(int buffer_size, int num_buffers,
716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               int frame_size,
726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               const char *name);
736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev};
746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevclass PmemPool : public MemPool {
766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevpublic:
776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    PmemPool(const char *pmem_pool,
786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             int flags, int pmem_type,
796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             int buffer_size, int num_buffers,
806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             int frame_size, int cbcr_offset,
816d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             int yoffset, const char *name);
826d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    virtual ~PmemPool();
836d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mFd;
846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mPmemType;
856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mCbCrOffset;
866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int myOffset;
876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mCameraControlFd;
886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    uint32_t mAlignedSize;
896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    struct pmem_region mSize;
906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev};
916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevclass IonPool : public MemPool {
936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevpublic:
946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    IonPool( int flags,
956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             int buffer_size, int num_buffers,
966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             int frame_size, int cbcr_offset,
976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             int yoffset, const char *name);
986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    virtual ~IonPool();
996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mFd;
1006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mCbCrOffset;
1016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int myOffset;
1026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int mCameraControlFd;
1036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    uint32_t mAlignedSize;
1046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevprivate:
1056d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    static const char mIonDevName[];
1066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev};
1076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
1086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev};
1096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#endif
110