The modules of 'access' capability are designed to be the first and last elements of a modules chain.
Access input and output handles most of the basic I/O for VLC. They are usually protocols implementations (http, ftp,...) or devices access (Webcams, Capture cards).
We will discuss about 'input access' in this page.
Write an access module
To write an access module, read first the introduction to module writing.
Then, you should specify your module of being of access type:
set_capability( "access", 60 ) set_category( CAT_INPUT ) set_subcategory( SUBCAT_INPUT_ACCESS )
Your module can be of either a 'Block' or a 'Read' type, depending on your medium:
- if the underlying protocol returns data blocks of unknown or unpredictable size, Block is a better type,
- if you can control the size of the data requested to the underlying protocol, Read is a better type.
Functions to implement
Close() functions, you will need to implement a few major features that will be implemented by your functions.
As you can see in include/vlc_access.h, you should define:
- Seek, as in
- Control, as in
- Read or Block, depending on your module type.
After implementing those functions, you should assign them to the corresponding
int (*pf_seek) ( access_t *, uint64_t );
The seeking function will be called whenever a seek is requested.
The arguments are a pointer to the module structure, and the requested position.
|Seeking function can be |
You shall set
false if seek worked.
If the seek has succeeded, it should return
VLC_SUCCESS, else it should return
int (*pf_control)( access_t *, int i_query, va_list args);
Control function is quite easy, the input core will query the module using this function with:
- A pointer to the module structure.
- An i_query parameter that can be of several type. We will cover afterward the most important on.
- A list of arguments, that depends on the i_query type.
If the query has succeeded, it should return
VLC_SUCCESS. Else it should return
Control Query types
The first ones are request to know what the module supports. They are all of boolean type and should always succeed.
ACCESS_CAN_SEEK, ACCESS_CAN_FASTSEEK, ACCESS_CAN_PAUSE, ACCESS_CAN_CONTROL_PACE,
The following one is a request for the PTS delay. It must always succeed.
The following ones are for requesting various info about the input, like Metadata, Titles and Chapters or device signal strength. All of them can fail.
ACCESS_GET_TITLE_INFO, ACCESS_GET_META, ACCESS_GET_CONTENT_TYPE, ACCESS_GET_SIGNAL,
Depending to the answer of the
CAN_ requests, the core can set a few things, like pausing or changing title or chapter
ACCESS_SET_PAUSE_STATE, ACCESS_SET_TITLE, ACCESS_SET_SEEKPOINT,
You can find the list of arguments corresponding to query types in the comments of
access_query_e definition in vlc_access.h
ssize_t (*pf_read) ( access_t *, uint8_t *, size_t );
-1 if no data yet,
0 if no more data, else actual data read on the medium.
block_t *(*pf_block)( access_t * );
Returns a block of data in its 'natural' size. It will return
NULL if there is not yet data or end-of-file (eof) has been reached.
To differentiate between no data and eof, you shall set
true in case of eof.
Please read the Documentation Editing Guidelines before you edit the documentation