小弟刚学DM8168,最近刚刚调通ARM写点数据直接给VPSS显示,代码如下,欢迎各界人士改善~~
#include <demos/link_api_demos/common/chains.h>
#include <demos/link_api_demos/common/chains_ipcBuf.h>
#include <demos/link_api_demos/common/chains_ipcFrames.h>
Void Chains_singleChDis(Chains_Ctrl *chainsCfg)
{
CaptureLink_CreateParams capturePrm;
DisplayLink_CreateParams displayPrm;
CaptureLink_VipInstParams *pCaptureInstPrm;
CaptureLink_OutParams *pCaptureOutPrm;
IpcFramesOutLinkRTOS_CreateParams ipcFramesOutVpssToHostPrm;
IpcFramesInLinkHLOS_CreateParams ipcFramesInHostPrm;
IpcFramesOutLinkHLOS_CreateParams ipcFramesOutHostPrm;
IpcFramesInLinkRTOS_CreateParams ipcFramesInVpssFromHostPrm;
System_LinkInfo framesProducerLinkInfo;
UInt32 displayId, captureId;
UInt32 vipInstId;
Uint32 ipcFramesOutVpssToHost, ipcFramesInHost;
Uint32 ipcFramesOutHost, ipcFramesInVpssFromHost;
Uint32 i;
char ch;
Bool enableVidFrameExport = TRUE;
Bool enableGrpx = FALSE;
Vsys_AllocBufInfo bufInfo;
VIDFrame_BufList bufList;
VIDFrame_Buf *pFrame;
Vsys_allocBuf(0,1920*1200*2,0,&bufInfo);
bufList.numFrames = 1;
bufList.frames[0].frameWidth = 1920;
bufList.frames[0].frameHeight = 1080;
bufList.frames[0].framePitch[0] = 1920*2;
bufList.frames[0].fid = 0;
bufList.frames[0].timeStamp = 0;
bufList.frames[0].channelNum = 0;
pFrame = &bufList.frames[0];
pFrame->addr[0][0] = (Ptr)bufInfo.virtAddr;
pFrame->phyAddr[0][0] = (Ptr)bufInfo.physAddr;
memset(bufInfo.virtAddr,0xaa,1920*1200*2); //这里暂时没搞明白图像数据该怎么存放,addr[0][0]到底是个什么地址,存放的又是啥内容
CHAINS_INIT_STRUCT(DisplayLink_CreateParams,displayPrm);
CHAINS_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams ,ipcFramesOutVpssToHostPrm);
CHAINS_INIT_STRUCT(IpcFramesInLinkHLOS_CreateParams ,ipcFramesInHostPrm);
CHAINS_INIT_STRUCT(IpcFramesOutLinkHLOS_CreateParams ,ipcFramesOutHostPrm);
CHAINS_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams ,ipcFramesInVpssFromHostPrm);
captureId = SYSTEM_LINK_ID_CAPTURE;
displayId = SYSTEM_LINK_ID_DISPLAY_0;
ipcFramesOutVpssToHost = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_0;
ipcFramesInHost = SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0;
ipcFramesOutHost = SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0;
ipcFramesInVpssFromHost = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_IN_0;
chainsCfg->displayRes[0] = SYSTEM_STD_1080P_60;//16;//capturePrm.vipInst[0].standard;
Vsys_getResSize(chainsCfg->displayRes[0], &chainsCfg->channelConf[0].width, &chainsCfg->channelConf[0].height);
Vsys_getResRate(chainsCfg->displayRes[0], &chainsCfg->channelConf[0].frameRate);
ipcFramesOutHostPrm.baseCreateParams.noNotifyMode = TRUE;
ipcFramesOutHostPrm.baseCreateParams.notifyNextLink = TRUE;
ipcFramesOutHostPrm.baseCreateParams.notifyPrevLink = FALSE;
//ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkId = SYSTEM_LINK_ID_INVALID;//ipcFramesOutVpssToHost;
ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesOutHostPrm.baseCreateParams.outQueParams[0].nextLink = ipcFramesInVpssFromHost;
ipcFramesOutHostPrm.baseCreateParams.inputFrameRate = chainsCfg->channelConf[0].frameRate;
ipcFramesOutHostPrm.baseCreateParams.outputFrameRate = chainsCfg->channelConf[0].frameRate;
ipcFramesOutHostPrm.baseCreateParams.notifyProcessLink = FALSE;
ipcFramesOutHostPrm.inQueInfo.chInfo[0].bufferFmt = 0;
ipcFramesOutHostPrm.inQueInfo.chInfo[0].bufType = SYSTEM_BUF_TYPE_VIDFRAME;
ipcFramesOutHostPrm.inQueInfo.chInfo[0].codingformat = IVIDEO_H264MP;
ipcFramesOutHostPrm.inQueInfo.chInfo[0].height = 1080;
ipcFramesOutHostPrm.inQueInfo.chInfo[0].width = 1920;
ipcFramesOutHostPrm.inQueInfo.chInfo[0].pitch[0] = 3840; //好关键的参数
ipcFramesOutHostPrm.inQueInfo.chInfo[0].startX = 0;
ipcFramesOutHostPrm.inQueInfo.chInfo[0].startY= 0;
ipcFramesOutHostPrm.inQueInfo.chInfo[0].dataFormat = SYSTEM_DF_YUV422I_YUYV; //好关键的参数
ipcFramesOutHostPrm.inQueInfo.chInfo[0].scanFormat = SYSTEM_SF_PROGRESSIVE;
ipcFramesOutHostPrm.inQueInfo.chInfo[0].memType = SYSTEM_MT_NONTILEDMEM;
ipcFramesOutHostPrm.inQueInfo.numCh = 1; //好关键的参数
ipcFramesOutHostPrm.baseCreateParams.numOutQue = 1; //好关键的参数
ipcFramesInVpssFromHostPrm.baseCreateParams.noNotifyMode = FALSE;
ipcFramesInVpssFromHostPrm.baseCreateParams.notifyNextLink = TRUE;
ipcFramesInVpssFromHostPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcFramesInVpssFromHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcFramesOutHost;
ipcFramesInVpssFromHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesInVpssFromHostPrm.baseCreateParams.outQueParams[0].nextLink = displayId;
ipcFramesInVpssFromHostPrm.baseCreateParams.inputFrameRate = chainsCfg->channelConf[0].frameRate;
ipcFramesInVpssFromHostPrm.baseCreateParams.outputFrameRate = chainsCfg->channelConf[0].frameRate;
ipcFramesInVpssFromHostPrm.baseCreateParams.notifyProcessLink = FALSE;
displayPrm.inQueParams[0].prevLinkId = ipcFramesInVpssFromHost;
displayPrm.displayRes = chainsCfg->displayRes[0];
displayPrm.numInputQueues = 1;
displayPrm.activeQueue = 0;
displayPrm.inQueParams[0].prevLinkQueId = 0;
displayPrm.forceFieldSeparatedInputMode = FALSE;
Chains_displayCtrlInit(chainsCfg->displayRes);
System_linkCreate(ipcFramesOutHost , &ipcFramesOutHostPrm , sizeof(ipcFramesOutHostPrm));
System_linkCreate(ipcFramesInVpssFromHost , &ipcFramesInVpssFromHostPrm , sizeof(ipcFramesInVpssFromHostPrm));
System_linkCreate(displayId, &displayPrm, sizeof(displayPrm));
Chains_memPrintHeapStatus();
{
System_linkStart(displayId);
if(enableVidFrameExport)
{
System_linkStart(ipcFramesInVpssFromHost);
System_linkStart(ipcFramesOutHost);
}
while(1)
{
OSA_waitMsecs(16);
IpcFramesOutLink_putFullVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0, //这句是重点。。。
&bufList);
Chains_memPrintHeapStatus();
ch = Chains_menuRunTime();
if(ch=='0')
break;
}
if(enableVidFrameExport)
{
System_linkStop(ipcFramesOutHost);
System_linkStop(ipcFramesInVpssFromHost);
}
System_linkStop(displayId);
}
Vsys_freeBuf(0,bufInfo.virtAddr,1920*1200*2);
if(enableVidFrameExport)
{
System_linkDelete(ipcFramesOutHost);
System_linkDelete(ipcFramesInVpssFromHost);
}
System_linkDelete(displayId);
Chains_displayCtrlDeInit();