1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
3.3 KiB

/*
* Copyright (c) 2018, Fuzhou Rockchip Electronics Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_HARDWARE_CAMERA360_MEM_MANAGER
#define ANDROID_HARDWARE_CAMERA360_MEM_MANAGER
#include <dlfcn.h>
#include "utils/LightRefBase.h"
#include <sys/mman.h>
#ifndef RK_GRALLOC_4
#include "ExternalCameraGralloc.h"
#else
#include "ExternalCameraGralloc4.h"
#endif
namespace android {
enum buffer_type_enum{
PREVIEWBUFFER,
RAWBUFFER,
JPEGBUFFER,
VIDEOENCBUFFER,
DISPBUFFER,
};
enum io_method {
IO_METHOD_MMAP,
IO_METHOD_USERPTR,
IO_METHOD_DMABUF,
};
struct bufferinfo_s{
unsigned int mNumBffers; //invaild if this value is 0
size_t mPerBuffersize;
size_t mBufferSizes;
unsigned long mPhyBaseAddr;
unsigned long mVirBaseAddr;
unsigned long mShareFd;
buffer_type_enum mBufType;
io_method mIoMethod;
uint32_t width;
uint32_t height;
int mcameraFd;
short mStatus; // 0:idle, 1:activel
};
typedef enum buffer_addr_e {
buffer_addr_phy,
buffer_addr_vir,
buffer_sharre_fd
}buffer_addr_t;
typedef unsigned long ulong_t;
class MemManagerBase : public virtual VirtualLightRefBase {
public :
MemManagerBase();
virtual ~MemManagerBase();
virtual int createPreviewBuffer(struct bufferinfo_s* previewbuf) = 0;
virtual int createDisplayBuffer(struct bufferinfo_s* displaybuf) = 0;
virtual int destroyPreviewBuffer() = 0;
virtual int destroyDisplayBuffer() = 0;
virtual int flushCacheMem(buffer_type_enum buftype) = 0;
void setBufferStatus(enum buffer_type_enum buf_type,
unsigned int buf_idx, int status);
unsigned long getBufferAddr(enum buffer_type_enum buf_type,
unsigned int buf_idx, buffer_addr_t addr_type);
int getIdleBufferIndex(enum buffer_type_enum buf_type);
int dump();
protected:
struct bufferinfo_s* mPreviewBufferInfo;
struct bufferinfo_s* mDisplayBufferInfo;
mutable Mutex mLock;
};
class GrallocDrmMemManager:public MemManagerBase {
public :
GrallocDrmMemManager(bool iommuEnabled);
~GrallocDrmMemManager();
virtual int createPreviewBuffer(struct bufferinfo_s* previewbuf);
virtual int createDisplayBuffer(struct bufferinfo_s* displaybuf);
virtual int destroyPreviewBuffer();
virtual int destroyDisplayBuffer();
virtual int flushCacheMem(buffer_type_enum buftype);
private:
int createGrallocDrmBuffer(struct bufferinfo_s* grallocbuf, unsigned int halPixFmt);
void destroyGrallocDrmBuffer(buffer_type_enum buftype);
cam_mem_info_t** mPreviewData;
cam_mem_info_t** mDisplayData;
cam_mem_handle_t* mHandle;
cam_mem_ops_t* mOps;
int mDrmfd;
unsigned int mDrmHandle;
};
}/* namespace android */
#endif // ANDROID_HARDWARE_CAMERA_MEM_MANAGER