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.

arm直接写数据显示

小弟刚学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();