DM816x演算法詳解--之OSD
阿新 • • 發佈:2019-02-11
本文介紹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
共享知識,共同進步,促進發展。