Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97700
  • 博文数量: 30
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 91
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-24 19:49
文章分类

全部博文(30)

文章存档

2017年(11)

2016年(1)

2015年(18)

我的朋友

分类: C/C++

2015-07-29 20:40:37

Section Retrieve

Section Retrieve是通过APP调用DMX APIrequest来获取的。

有两种数据模式:singlecontinuous模式,Single模式是指发送一次request仅抓取一个section数据。Continuous模式是指发送一次requestDMX持续的抓取每一个命中的section数据,直到APP调用另外的API来终止这次request

每种数据模式各有两种时序方式:同步方式和异步方式,同步方式是指调用request命令后,直到request成功抓取到数据或者超时才会返回。异步方式则是发送request后函数会立即返回。APP再通过其他API查询section是否收到,或者由DMX在收到section数据后通过callback通知APP

对于各种section获取方式,首先要配置section filterAli平台上,DMX通过硬件filter过滤某一路PIDfilter,再由driversection retrieving,同一路PID只能由一个硬件filter过滤,若有多种section数据由同一路PIDTS流传输,需要在同一个硬件DMX PID filter上建立section multi-filter来获取。

Continuous模式下,超时域是没有意义的,因为只要APP不主动停止,DMX会一直尝试取数据,continuous模式下,不建议使用同步接口。因为此模式下同步接口永远不会返回,需要由另外一个task停止section request才能结束这次section requestContinuous模式下,APP必须注册一个callback函数,DMX拿到数据就会调用这个callback

Section Filter

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_lensection_data & mask == value;

mask: single模式下,或者多种section 共用同一组mask的情况下使用。

value: Section filtervalue。可以设定多组。

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需清零。

如应用需要超出上文红字部分的限制,需要使用特殊扩展。


get_section_parameter

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; /*取到的sectionlength*/

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的值不会被其他线程给篡改。

阅读(1602) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~