开门见山:
这里给出rk 在cameraHAL层的camera数据结构:
typedef struct FramInfo
{
int phy_addr;
int vir_addr;
int frame_width;
int frame_height;
int frame_index;
int frame_fmt;
int zoom_value;
int used_flag;
int frame_size;
void* res;
}FramInfo_s;
主要是第二个成员,虚拟地址,也就是保存buffer的地址。
camera数据是在接口getFrame中填充的:
int CameraAdapter::getFrame(FramInfo_s** tmpFrame){
}
看一下具体的填充过程:
// fill frame info:w,h,phy,vir
mPreviewFrameInfos[cfilledbuffer1.index].frame_fmt= mCamDriverPreviewFmt;
mPreviewFrameInfos[cfilledbuffer1.index].frame_height = mCamDrvHeight;
mPreviewFrameInfos[cfilledbuffer1.index].frame_width = mCamDrvWidth;
mPreviewFrameInfos[cfilledbuffer1.index].frame_index = cfilledbuffer1.index;
if(mCamDriverV4l2MemType == V4L2_MEMORY_OVERLAY){
#if (defined(TARGET_RK312x) && (IOMMU_ENABLED == 1))
mPreviewFrameInfos[cfilledbuffer1.index].phy_addr = mPreviewBufProvider->getBufShareFd(cfilledbuffer1.index);
#else
mPreviewFrameInfos[cfilledbuffer1.index].phy_addr = mPreviewBufProvider->getBufPhyAddr(cfilledbuffer1.index);
#endif
}else
mPreviewFrameInfos[cfilledbuffer1.index].phy_addr = 0;
mPreviewFrameInfos[cfilledbuffer1.index].vir_addr = (int)mCamDriverV4l2Buffer[cfilledbuffer1.index];
//get zoom_value
mPreviewFrameInfos[cfilledbuffer1.index].zoom_value = mZoomVal;
mPreviewFrameInfos[cfilledbuffer1.index].used_flag = 0;
mPreviewFrameInfos[cfilledbuffer1.index].frame_size = cfilledbuffer1.bytesused;
mPreviewFrameInfos[cfilledbuffer1.index].res = NULL;
*tmpFrame = &(mPreviewFrameInfos[cfilledbuffer1.index]);
比较关键的就是:
mPreviewFrameInfos[cfilledbuffer1.index].vir_addr = (int)mCamDriverV4l2Buffer[cfilledbuffer1.index];
把之前初始化mmap到用户地址空间的buffer地址赋值给了vir_addr。最后把整个结构体的地址传给了tmpFrame
然后通过:
notifyNewPreviewCbFrame(tmpFrame);
把这个frame封装成msg:
void AppMsgNotifier::notifyNewPreviewCbFrame(FramInfo_s* frame)
{
//send to app msg thread
Message msg;
Mutex::Autolock lock(mDataCbLock);
if(mRunningState & STA_RECEIVE_PREVIEWCB_FRAME){
msg.