首页 > 代码库 > DM816x算法详解--之OSD

DM816x算法详解--之OSD

简介:

本文介绍DM8168 DVRRDK中传入DSP内部的视频格式以及大概的处理流程。

背景:

可能有很多人为了加快研发的速度、降低难度,选择在DVRRDk已有的OSD内添加自己的DSP算法。今天我打算将自己的算法加入进去,发现不管是隔行采集的视频和逐行采集的视频都是可以支持的。那么内部怎么实现的呢?

详述:

DVR_RDK_McFW_Link_API_Training.pdf中写道:

可见算法支持隔行(Interlaced)或逐行(progressive)的扫描格式,支持YUV420、YUV422的数据输入格式。

其实在算法的内部输入的需要叠加的窗口数据graphicsWindowPrm与视频数据videoWindowPrm的格式是要保持一致的,当然需要叠加的窗口数据由于在ARM端读入,数据格式可以任意,但是需要保证进入OSD DSP算法的格式遵循上述要求。

1.OSD ALG的算法调用顺序:

AlgLink_tskMain

  switch (cmd)

 case SYSTEM_CMD_NEW_DATA:

接收到新数据,开始执行

AlgLink_algProcessData,然后执行顺序大致如下:


2.OSD中数据的准备处理

采用隔行模式时

FVID2_Frame结构中有fid变量标记是奇偶帧,fid=0,1;

通过fid来识别奇偶帧,从而选择性的处奇偶行

    if(isInterlaced)
    {
        /* OSD plane is always progressive
           Input can be interlaced in this case we need to skip alternate lines in OSD plane
           and feed for blending
        */
        if(pFrame->fid==1)
            fid = 1;

        /* this will half the processing height */
        divY = 2;
    }

然后获取视频数据:

        /* YUV422i or YUV420SP - Y-plane processing */

        pSwOsdObj->videoWindowAddr = pFrame->addr[0][0];

设置windowsprm的起始地址,这里进行奇偶的选择:

  pSwOsdObj->graphicsWindowAddr           =
                        pChObj->osdWinObj[winId].addr[0][0] + fid*pSwOsdObj->graphicsWindowPrm.lineOffset*scaleX;

可见上式中如果fid=1,则从第二行开始叠加。

  SWOSD_blendWindow(pSwOsdObj);

如果是420sp,因为其UV分量在pFrame->addr[0][1]中,需要另行叠加

  /* YUV420SP - C -plane processing */
        if(pSwOsdObj->graphicsWindowPrm.format == SWOSD_FORMAT_YUV420sp)
        {
            pSwOsdObj->videoWindowAddr = pFrame->addr[0][1];



详细代码见mcfw/src_bios6/links_c6xdsp/AlgLink/Swosd/osdLink_alg.c

共享知识,共同进步,促进发展。

转载请注明;guo8113