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.

MCFW库使用过程问题,希望TI的员工能帮助我解决一些基本的问题!长期更新欢迎讨论!

Other Parts Discussed in Thread: TMS320DM8148

TI员工您好,我想请教一下您关于TMS320DM8148板卡应用开发的相关问题,下面是我对MCFW的理解过程,期望您能帮我确认我的理解是否正确一下!谢谢~

我这边主要需要实现的内容是:捕获SDI接口上的1080p的高清视频源,通过DSP核心的处理后,将视频输出到DVI的视频输出接口上,具体的流程如下所示:

CapLink(HDVPSS-M3) --- NFSLink --- SwosdLink(DSP Algorithm) --- SwmsLink --- DispLink

实现的方法是首先初始化每一个link的参数param,然后修改DSP bios的相关代码程序,加入我们需要的图像处理的相关算法,并编译

生成对应的DSP核心的实时操作系统的核心代码等待ARM加载到对应的DSP指令运行地址,让后在程序中使用link_create函数创建link,link_start函数启动link,这样就完成了整个Chain的搭建,运行起来就会按照对应的流程就行处理。

举例说明CapLink的相关参数(一共有5个结构体变量):

CaptureLink_ColorParams col;

CaptureLink_OutParams out;

CaptureLink_VipInstParams vip;

CapturLink_CreateParams param;

System_LinkOutQueParams outQueParams;

接下来的工作就是初始化我们的结构体变量,设置好当前Cap设备的next Id以及当前设备的Que队列的Id等等,从而方便后续的其他模块来连接CapLink。

完成以上所有的link节点的参数设置之后我们需要开始按照顺序初始化并启动我们的link,初始化并启动的方式如下:

CaptureLink_init() --- NfsLink_init()  --- AlgLink_init() --- SwMsLink_init() --- DisplayLink_init()

初始化完成之后就建立好了我们的整个视频流链路Chain了,在编译运行上面的程序之前我们需要在dsp核心的编译之前添加相应的图像处理的代码,过程如下(文件结构如下):

在algLink_tsk.c文件中的AlgLink_tskMain函数当中,当产生新的数据时调用了AlgLink_algProcessingData(pObj)的函数,这里继续追溯下去,就能在algLink_priv.c文件中找到对应的函数,这里我们还看到下面有一个AlgLink_putLinksalgProvessFrame的函数API调用,在论坛的讨论中发现真正的算法是在这里实现的

Int32 AlgLink_algProcessData(AlgLink_Obj * pObj)
{
    UInt32 frameId, status;
    System_LinkInQueParams *pInQueParams;
    FVID2_Frame *pFrame;

    FVID2_FrameList frameList;

    pInQueParams = &pObj->createArgs.inQueParams;
    System_getLinksFullFrames(pInQueParams->prevLinkId,
                              pInQueParams->prevLinkQueId, &frameList);

    if (frameList.numFrames)
    {
        /* SCD should be done first as it requires to operate on raw YUV */
        if (pObj->createArgs.enableSCDAlg)
        {
            status = AlgLink_ScdalgProcessData(&pObj->scdAlg, &frameList, &pObj->outObj[0].bufOutQue);

            if (status == FVID2_SOK)
            {
                /* Send-out the output bitbuffer */
                System_sendLinkCmd(pObj->createArgs.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink,
                                   SYSTEM_CMD_NEW_DATA);
            }

        }

        for(frameId=0; frameId<frameList.numFrames; frameId++)
        {
            pFrame = frameList.frames[frameId];

            if(pFrame->channelNum >= pObj->inQueInfo.numCh)
                continue;

            // do SW OSD
            if (pObj->createArgs.enableOSDAlg)
            {
                AlgLink_OsdalgProcessFrame(&pObj->osdAlg, pFrame);
            }
        }
        System_putLinksEmptyFrames(pInQueParams->prevLinkId,
                                   pInQueParams->prevLinkQueId, &frameList);
    }

    return FVID2_SOK;
}

这里我们就看到了对应的//do SW OSD的函数接口的位置,我们可以通过阅读FVID2_Frame *pFrame;结构体的成员变量找到对应的图像的起始指针,在该文件中引入我们算法的头文件并添加相应的图像处理的算法在//do SW OSD这个位置即可执行相应的图像处理的算法,完成程序修改之后,需要重新编译src_bios中的links_c6xdsp的内容,从而将算法加入进去,这里我想了解如何修改Makefile文件将编写完成的算法文件链接到我们的OSD工程当中呢?

在完成上述所有的程序代码之后就可以编译生成对应的可执行文件了(这里请教如何修改MCFW中的Makefile文件来完成对应的Demo的编译呢?),运行编写好的init.sh以及load.sh文件,加载对应核心的RTOS程序,加载和控制对应的硬件驱动和使能等操作,准备运行编译生成的.out文件即可。

这里也只是大致的理解,不知道理解的有没有问题,请教一下TI的员工或者社区的兄弟姐妹们,帮我指指路~~~感激不尽!

  • 在使用dvr_rdk的例程的过程中make dvr_rdk_linux的时候还出现了下面的问题(缺少了syslink.a_release的文件):

    这个问题的解决是广州创龙科技帮我解决的,编译 mcfw 这个框架依赖 ti_tools 下的东西,你这里应该是还没构建对应的 syslink 组件,所以需要先构建syslink的相关组件在进行对应的demo的编译即可,按照make syslink之后再make dvr_rdk_linux就可以编译通过了,这里还需要注意的是make的版本的要求是3.81的,可以通过下载安装对应版本的make工具。