簡介:
SCD算法是在DVRRDK的DSP中運行的,隨DVRRDK一起提供的。並且在3.0以上的版本中在Mcfw_demo裏實現了類似目標的跟蹤等高級功能。SCD採用DMVAL庫,所以核心的算法源碼沒有給出。SCD的intergration文檔中對於其相關參數有說明。但是DVRRDK沒有在Link_api_demos中實現SCD。所以將其在doubles_doubleChCapScEncSend.c中實現1080p的處理:
步驟:
1.向chains中加入相關的link:
目前ScdLink位於dup0之後,因爲dup可以有3個輸出隊列,1個給encLink,1個給display,1個給Scd。
UInt32 sclrId;
UInt32 nsfId2;
UInt32 ipcFramesOutVpssId2;
UInt32 ipcFramesInDspId2;
UInt32 scdId;
UInt32 ipcBitsOutDspId2;
UInt32 ipcBitsInHostId2;
一定要注意scd的輸入僅支持420格式,這個在文檔中說支持422/420是錯誤的。422會有格式不支持的報錯:
另外一定要注意link create時的順序,必須按照數據流的相反順序進行創建,否則會出現以下類似的錯誤。
還有,根據link的結構,如果該link消耗buffer,那麼它一定需要從nextlink來獲取空buffer,所以在調試時next link是必須有的(可以使用null link調試),比如沒有OutDspLink之後的link,在運行時就會提示:0x9是空指針的錯誤(在DMVAL的文檔中有說明)。
2.讀取SCD的狀態:
可以通過發送消息主動獲取其狀態:
System_linkControl(
scdId, ALG_LINK_SCD_CMD_GET_ALL_CHANNEL_FRAME_STATUS,
&(scdAllChFrameStatus),
sizeof(scdAllChFrameStatus),
TRUE
);
好的方法是借鑑Demo_scd_bits_wr.c進行bits的獲取,到hostA8中進行分析,因此移植了Demo_scd_bits_wr.c、Demo_scd_bits_wr.h,在chains中只需要調用:
Scd_bitsWriteCreate(0,ipcBitsInHostId2); //Init scd's ipcBitsInHost by:guo8113
創建相關的線程
Chains_ipcBitsInitCreateParams_BitsInHLOSVcap(&ipcBitsInHostPrm2);
//爲ipcBitsInHostLink註冊回調函數
就可以在chains_scd_bits_wr.c的void*Scd_bitsWriteMain(void *pPrm)函數中進行相應的操作了。具體內容,參考chains_scd_bits_wr.c。(根據Demo_scd_bits_wr.c進行定製)
可能會遇到的問題:關於Link的回調線程只運行n(6或有限次數)的問題:
IpcBitsLink需要從Host A8獲得空的Buffer,並交給IpcBItsInHost纔可以不斷的取數據生成滿的Buffer,參考Demo_scd_bits_wr.c實現
Scd_getAlgResultBuffer、Scd_releaseAlgResultBuffer等函數。
===========================================================================================
不宜詳細描述,僅提供參考思路,有問題可以留言、交流。
轉載請註明:http://blog.csdn.net/guo8113/article/details/41693289
===========================================================================================