开发环境 DVRRDK3.5, DM8168。
我在LInux下实现了捕捉GPIO中断的程序,并且实现了视频的采集、播放、ALG等link的创建、运行。现在程序可以成功运行,并将采集的图像送入到DSP中进行处理。
现在的需求是,我想在捕捉到GPIO中断时,获取一张当前时间某一个link的中的帧数据。我找了下demo,没有找到相应的代码实现。
请专家看一下,给出点建议。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
开发环境 DVRRDK3.5, DM8168。
我在LInux下实现了捕捉GPIO中断的程序,并且实现了视频的采集、播放、ALG等link的创建、运行。现在程序可以成功运行,并将采集的图像送入到DSP中进行处理。
现在的需求是,我想在捕捉到GPIO中断时,获取一张当前时间某一个link的中的帧数据。我找了下demo,没有找到相应的代码实现。
请专家看一下,给出点建议。
ipcframesout的那个link是用来从M3上去导出frame数据到A8的。你需要通过这个代码去修改来实现你的功能。
非常感谢,获取YUV数据的问题已经解决了。
我的link流程为,cap(一路)->sclr->nsf->dup
dup[0]->swms->display
dup[1]->ipcFrameOutVpssToHost->ipcInHost.
/* Set ipcFramesOutVpss link info */
ipcFramesOutVpssPrm2.baseCreateParams.inQueParams.prevLinkId = id_set.dupId1;
ipcFramesOutVpssPrm2.baseCreateParams.inQueParams.prevLinkQueId = 1;
ipcFramesOutVpssPrm2.baseCreateParams.noNotifyMode = FALSE;
ipcFramesOutVpssPrm2.baseCreateParams.notifyNextLink = TRUE;
ipcFramesOutVpssPrm2.baseCreateParams.notifyPrevLink = TRUE;
ipcFramesOutVpssPrm2.baseCreateParams.notifyProcessLink = FALSE;
ipcFramesOutVpssPrm2.baseCreateParams.processLink = SYSTEM_LINK_ID_INVALID;
ipcFramesOutVpssPrm2.baseCreateParams.equallyDivideChAcrossOutQues = TRUE;
ipcFramesOutVpssPrm2.baseCreateParams.inputFrameRate = 24;
ipcFramesOutVpssPrm2.baseCreateParams.outputFrameRate = 3;
ipcFramesOutVpssPrm2.baseCreateParams.numOutQue = 1;
ipcFramesOutVpssPrm2.baseCreateParams.outQueParams[0].nextLink = id_set.ipcFramesInHost1;
// ipc frames to host
ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkId = id_set.ipcFramesOutVpssId2;
ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesInHostPrm.baseCreateParams.noNotifyMode = FALSE;
ipcFramesInHostPrm.baseCreateParams.notifyNextLink = TRUE;
ipcFramesInHostPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcFramesInHostPrm.baseCreateParams.numOutQue = 1;
ipcFramesInHostPrm.baseCreateParams.inputFrameRate = 24;
ipcFramesInHostPrm.baseCreateParams.outputFrameRate = 4;
ipcFramesInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;
ipcFramesInHostPrm.exportOnlyPhyAddr = TRUE;
ipcFramesInHostPrm.cbCtx = NULL;
ipcFramesInHostPrm.cbFxn = cbFxnFrames_Host;
然后实现回调函数中:
IpcFramesInLink_getFullVideoFrames()
IpcFramesInLink_putEmptyVideoFrames()。
参考demo在dvrrdk3.5中, /dvrrdk/demo/mcfw_api_demos/mcfw_demo/demo_vcap_venc_vdis_ipc_frames_exch.c文件。
Eason Wang, 我成功的获取到了帧数据。但是将帧数据写成文件后,通过YUV工具查看 存的图像完全不对。图像本来该是彩色的,我仿照demo写入得出下面的结果。
从vpss出来的帧格式应该为YUV420SP。
我的存储代码如下:
for(frameId = 0; frameId < frameBufList.numFrames; frameId++){
pFrame = &frameBufList.frames[frameId];
framesizeY = pFrame->frameWidth * pFrame->frameHeight ; //Y planar
framesizeU = pFrame->frameWidth * pFrame->frameHeight / 2; //UV planar
pMemVirtAddrY = NULL;
OSA_mapMem((UInt32)pFrame->phyAddr[0][0], framesizeY, &pMemVirtAddrY);
if(pMemVirtAddrY)
fwrite((Ptr)pMemVirtAddrY, framesizeY, 1, fp);
OSA_unmapMem(pMemVirtAddrY, framesizeY);
pMemVirtAddrU = NULL;
OSA_mapMem((UInt32)pFrame->phyAddr[0][1], framesizeU, &pMemVirtAddrU);
if(pMemVirtAddrU)
fwrite((Ptr)pMemVirtAddrU, framesizeU, 1, fp);
OSA_unmapMem(pMemVirtAddrU, framesizeU);
}
存储后用yuvtools播放的图像是:
你好,
一般工具显示的YUV420是planar的,你把UV数据再分开存储一下,然后看看显示是否正常?
感谢你的回复,这个问题已经解决了。
原因是我使用的yuvtool的解析帧图像时不是semiplanar。