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