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框架介绍

Other Parts Discussed in Thread: MATHLIB, TMS320DM8148
整体上mcfw框架如下图
从中可见其层次是清楚的,link实在基本的驱动之上的,而mcfw是在link之上的api,是通过link来实现相应的功能.可见link是框架中承上启下的层次,通过link来实现具体的功能,所以对link进行深入的学习和了解,对于理解mcfw以及扩展其功能是至关重要的.
link的主要功能包括视频的输入输出,视频的编解码,以及dsp算法等.
  • 顶下,应该置顶,

  • 链接已经放入置顶帖rdk软件讲解index中.方便查找.

  • 请问一下怎样通过link调用DSP的算法,在demo中有这样的实例吗?

    是不是通过执行run_mcfw_demo.sh然后再Captureing setting 中设置OSD的参数进行DSP算法的执行(OSD的算法就是在DSP端)……谢谢!!!

  • 要调用DSP算法并不是通过demo的setting控制的,首先需要在搭建数据通路的时候把DSP处理link串进来。

    setting中控制DSP算法开关的前提是数据通路中存在DSP link。

  • 请问在mcfw_api_demos中哪里可以修改视频压缩编码的类型,比如说h.264,mpeg2等等,找不到啊

  • 这是在usecase文件中修改的,比如multich_vcap_venc_vdis.c里面pLinkChPrm->format                  = IVIDEO_H264HP; pLinkChPrm->format                  = IVIDEO_MJPEG;

  • Thank you very much for your reply!

    这些东西好像是link api的东西,另外问一句,想添加额外的dsp视频处理算法,是不是要深入到link api里面?

  • 您好,我最近在项目中遇到了8168,DVRRDK资料中提到了mcfw框架以及linkAPI,通过他们可以方便的完成多通道视频的捕获、编解码和显示等。我项目中需要将用opencv写的算法移植到8168上。我的问题如下,希望您能不吝赐教。

    1.查资料得知,C6Accel支持DM8168,我可以通过它将opencv算法移植到DSP上,然后通过提供的API调用即可。可是,我无法得知VPSS M3和Video M3这两个协处理器器如何被利用,如果不用岂不浪费了DM8168的功能?

    2如果从linkAPI考虑,我能否将opencv的算法集成到DM8168呢?是不是和使用C6Accel类似呢?可是C6Accel中集成有imgLIB,mathLIB等,而linkapi有相应的库吗?

    我的邮箱t_deng@sina.cn。希望您能抽空帮小弟解答一下这些疑问,我当不胜感激。

  • 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的员工或者社区的兄弟姐妹们,帮我指指路~~~感激不尽!

  • Feng Dong老师您好, 我在您帖子下面发表的内容是否需要重新开一个帖子来让大家讨论,我这边也想尽快的得到一些答复这样,我这边也就能放心的编译Makefile以及相关的link的代码了。