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.

8168 中能否从 link中获取帧数据并发送到ARM中。



开发环境 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。