00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef VLC_ACCESS_H
00025 #define VLC_ACCESS_H 1
00026
00027 #include <vlc_block.h>
00028
00029
00030
00031
00032
00033
00034 enum access_query_e
00035 {
00036
00037 ACCESS_CAN_SEEK,
00038 ACCESS_CAN_FASTSEEK,
00039 ACCESS_CAN_PAUSE,
00040 ACCESS_CAN_CONTROL_PACE,
00041
00042
00043 ACCESS_GET_MTU,
00044 ACCESS_GET_PTS_DELAY,
00045
00046 ACCESS_GET_TITLE_INFO,
00047
00048 ACCESS_GET_META,
00049
00050
00051 ACCESS_SET_PAUSE_STATE,
00052
00053
00054 ACCESS_SET_TITLE,
00055 ACCESS_SET_SEEKPOINT,
00056
00057
00058
00059 ACCESS_SET_PRIVATE_ID_STATE,
00060 ACCESS_SET_PRIVATE_ID_CA,
00061 ACCESS_GET_PRIVATE_ID_STATE,
00062
00063 ACCESS_GET_CONTENT_TYPE,
00064 };
00065
00066 struct access_t
00067 {
00068 VLC_COMMON_MEMBERS
00069
00070
00071 module_t *p_module;
00072
00073
00074 char *psz_access;
00075
00076 char *psz_path;
00077
00078 access_t *p_source;
00079
00080
00081
00082
00083 char *psz_demux;
00084
00085
00086
00087 ssize_t (*pf_read) ( access_t *, uint8_t *, size_t );
00088 block_t *(*pf_block)( access_t * );
00089
00090
00091
00092 int (*pf_seek) ( access_t *, int64_t );
00093
00094
00095
00096 int (*pf_control)( access_t *, int i_query, va_list args);
00097
00098
00099 struct
00100 {
00101 unsigned int i_update;
00102
00103
00104 int64_t i_size;
00105 int64_t i_pos;
00106 bool b_eof;
00107
00108 int i_title;
00109 int i_seekpoint;
00110
00111 bool b_prebuffered;
00112 } info;
00113 access_sys_t *p_sys;
00114 };
00115
00116 static inline int access_vaControl( access_t *p_access, int i_query, va_list args )
00117 {
00118 if( !p_access ) return VLC_EGENERIC;
00119 return p_access->pf_control( p_access, i_query, args );
00120 }
00121
00122 static inline int access_Control( access_t *p_access, int i_query, ... )
00123 {
00124 va_list args;
00125 int i_result;
00126
00127 va_start( args, i_query );
00128 i_result = access_vaControl( p_access, i_query, args );
00129 va_end( args );
00130 return i_result;
00131 }
00132
00133 static inline char *access_GetContentType( access_t *p_access )
00134 {
00135 char *res;
00136 if( access_Control( p_access, ACCESS_GET_CONTENT_TYPE, &res ) )
00137 return NULL;
00138 return res;
00139 }
00140
00141 static inline void access_InitFields( access_t *p_a )
00142 {
00143 p_a->info.i_update = 0;
00144 p_a->info.i_size = 0;
00145 p_a->info.i_pos = 0;
00146 p_a->info.b_eof = false;
00147 p_a->info.i_title = 0;
00148 p_a->info.i_seekpoint = 0;
00149 }
00150
00151 #define ACCESS_SET_CALLBACKS( read, block, control, seek ) \
00152 p_access->pf_read = read; \
00153 p_access->pf_block = block; \
00154 p_access->pf_control = control; \
00155 p_access->pf_seek = seek; \
00156
00157 #define STANDARD_READ_ACCESS_INIT \
00158 access_InitFields( p_access ); \
00159 ACCESS_SET_CALLBACKS( Read, NULL, Control, Seek ); \
00160 MALLOC_ERR( p_access->p_sys, access_sys_t ); \
00161 p_sys = p_access->p_sys; memset( p_sys, 0, sizeof( access_sys_t ) );
00162
00163 #define STANDARD_BLOCK_ACCESS_INIT \
00164 access_InitFields( p_access ); \
00165 ACCESS_SET_CALLBACKS( NULL, Block, Control, Seek ); \
00166 MALLOC_ERR( p_access->p_sys, access_sys_t ); \
00167 p_sys = p_access->p_sys; memset( p_sys, 0, sizeof( access_sys_t ) );
00168
00169 #endif