现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

VLC数据访问模块

2013-07-11 06:46 工业·编程 ⁄ 共 1797字 ⁄ 字号 暂无评论

access模块的能力处在VLC功能模块链表的最后和最前的位置。数据访问的输入和输出函数实现VLC大部分的基本IO功能。这些通常是一些协议如 (http,ftp,...)或一些设备访问如网络摄像头,图像采集卡。本文只讨论输入型数据访问模块。

编写数据访问模块

为了能编写数据访问模块,请首先阅读”功能模块编写指南”一文。数据访问模块应该指定为access类型:

set_capability( "access", 60 ) 
set_category( CAT_INPUT )                                                                                                                                                                                 
set_subcategory( SUBCAT_INPUT_ACCESS )
根据媒体介质类型,模块要么是 'Block'类型,要么是'Read'类型:

如果采用的协议返回未知大小的数据块,Block类型比较合适。
如果能够控制给采用的协议的数据大小,Read类型比较合适。

需要实现的函数

 

除了实现Open() 和Close()函数以外,还需要实现几个主要的数据访问类模块的函数。在 include/vlc_access.h定义了下面几个函数:

Seek, pf_seek 指针指向的函数。
Control, pf_control 指针指向的函数
Read 或Block,依据模块类型而定

在实现这些函数以后,应该将这些函数地址赋值给对应的函数指针。

 

Seek
原型:

int         (*pf_seek) ( access_t *, uint64_t );
数据位置定位函数可以根据请求随时调用。该函数的参数为模块指针和请求的位置。

注意:如果制定的协议或设备不支持数据位置定位功能,该可以为空。如果函数正常工作,需要将 p_access->info.b_eof设置为false.

 

返回值:

如果函数运行成功,返回VLC_SUCCESS,否则,返回VLC_EGENERIC.

 

Control
原型:

int         (*pf_control)( access_t *, int i_query, va_list args);
控制函数非常简单,运行核将使用下面的参数对模块进行查询:

指向模块结构的指针。
i_query参数可以有几种类型,稍后详细说明。
args,根据i_query的类型,通过列表输入一些子参数。

返回值:

如果运行成功,返回VLC_SUCCESS.否则,返回VLC_EGENERIC.

 

控制查询类型
下面的标记必须设置为true.

ACCESS_CAN_SEEK,       
ACCESS_CAN_FASTSEEK,   
ACCESS_CAN_PAUSE,      
ACCESS_CAN_CONTROL_PACE,

下面的参数用于PTS延迟,必须为true.

ACCESS_GET_PTS_DELAY,

下面的参数可以为false,这些主要请求输入模块各种额外的信息如metadat,标题,章节或设备信号长度。

ACCESS_GET_TITLE_INFO, 
ACCESS_GET_META,       
ACCESS_GET_CONTENT_TYPE,
ACCESS_GET_SIGNAL,     

根据模块返回的值,运行核还可以查询下面的参数或属性,如暂停,更改标题或章节。

ACCESS_SET_PAUSE_STATE,
ACCESS_SET_TITLE,
ACCESS_SET_SEEKPOINT,
可以在vlc_access.h找到不同查询类型对应的一些参数。

 

Read
原型:

ssize_t     (*pf_read) ( access_t *, uint8_t *, size_t );
返回值:

如果还没有数据,返回 -1;如果数据已经读取完毕,返回0;否则,返回实际读取到的数据大小。

 

Block
原型:

block_t    *(*pf_block)( access_t * );
返回值:

返回原始大小的数据块,如果没有数据或到数据末尾,将返回NULL。没有数据和已经到达数据末尾的区别是,在到达数据末尾的时候,p_access->info.b_eof应该为true.

给我留言

留言无头像?