分类: C/C++
2015-07-29 20:40:37
Section Retrieve是通过APP调用DMX API发request来获取的。
有两种数据模式:single和continuous模式,Single模式是指发送一次request仅抓取一个section数据。Continuous模式是指发送一次request,DMX持续的抓取每一个命中的section数据,直到APP调用另外的API来终止这次request。
每种数据模式各有两种时序方式:同步方式和异步方式,同步方式是指调用request命令后,直到request成功抓取到数据或者超时才会返回。异步方式则是发送request后函数会立即返回。APP再通过其他API查询section是否收到,或者由DMX在收到section数据后通过callback通知APP。
对于各种section获取方式,首先要配置section filter。Ali平台上,DMX通过硬件filter过滤某一路PID的filter,再由driver作section retrieving,同一路PID只能由一个硬件filter过滤,若有多种section数据由同一路PID的TS流传输,需要在同一个硬件DMX PID filter上建立section multi-filter来获取。
Continuous模式下,超时域是没有意义的,因为只要APP不主动停止,DMX会一直尝试取数据,continuous模式下,不建议使用同步接口。因为此模式下同步接口永远不会返回,需要由另外一个task停止section request才能结束这次section request。Continuous模式下,APP必须注册一个callback函数,DMX拿到数据就会调用这个callback。
struct restrict{
UINT8 mask[MAX_SEC_MASK_LEN];
UINT8 value[MAX_MV_NUM][MAX_SEC_MASK_LEN];
UINT8 mask_len; /* Mask length in unit of byte */
UINT8 value_num; /* Target value number. */
UINT8 multi_mask[MAX_MV_NUM][MAX_SEC_MASK_LEN];
UINT16 tb_flt_msk;
};
Section filter命中的规则:按照mask_len,section_data & mask == value;
mask: 在single模式下,或者多种section 共用同一组mask的情况下使用。
value: Section filter的value。可以设定多组。
mask_len: mask/value的长度,在multi-mask模式下,标明各组mask/value的最长mask_len,最长为16 Bytes.
value_num: value的组数,最多为8组。如果多种section需要使用不同的mask,需要使用multi-mask,须把这个域置为0。
multi-mask: 多组section mask,和多组value一一对应。
tb_flt_mask: 在multi-mask模式下,标计哪些组mask/value开启的标志,低8 bit有效。一个bit对应一组mask/value。高8 bit需清零。
如应用需要超出上文红字部分的限制,需要使用特殊扩展。
struct get_section_param{
UINT8 * buff; /*Start address of section buffer*/
UINT32 cur_pos; /*DMX driver 内部使用,发request前需清零。*/
UINT16 buff_len; /*The size of allocated section buffer.*/
UINT16 sec_tbl_len; /*取到的section的length*/
UINT8 get_sec_len; /*DMX driver 内部使用,发request前需清零。*/
UINT8 crc_flag; /*:1 need CRC verification. :0 needn't :2or3 crc err.*/
UINT8 conti_conter; /*DMX driver 内部使用,发request前需清零。*/
UINT8 overlap_flag; /*DMX driver 内部使用,发request前需清零。*/
UINT32 wai_flg_dly; /*get section超时, if wai_flg_dly==0, use default */
UINT32 crc_result; /*CRC 结果*/
enum DEMUX_STATE dmx_state; /*DMX driver 内部使用,发request前需清零。*/
struct restrict * mask_value; /*Section filter*/
void (*get_sec_cb)(struct get_section_param *); /*Continuous模式下必须注册的callback函数 */
/*if continue_get_sec==1, dmx will call this call back function.*/
UINT16 pid; /*要抓取的section 的PID值*/
UINT16 sec_hit_num; /*report当前取到的section是由哪一组mask/value命中*/
UINT8 continue_get_sec; /*1:continuous模式,0: single模式。 */
UINT8 retrieve_sec_fmt; /*RETRIEVE_SEC: retrieve section, RETRIEVE_TS: retrieve TS*/
};
/*请注意: 除非应用层调用dmx_io_control(dmx_dev, IO_ASYNC_CLOSE, (UINT32)flt_idx)关闭DMX设备,不然参数 param->buff and mask_value 将一直被DMX底层驱动使用。
所以,必须确保当DMX还在继续工作时参数param->buff and mask_value,这些参数永远不会被FREE()。
还有,得确保param->buff的值不会被其他线程给篡改。