1. 程式人生 > >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的演算法呼叫順序: 

 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

共享知識,共同進步,促進發展。