VLC  3.0.15
vlc_sout.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * vlc_sout.h : stream output module
3  *****************************************************************************
4  * Copyright (C) 2002-2008 VLC authors and VideoLAN
5  * $Id: c710780e2e15ccd3de5ef3e12a47dcfacfbc744a $
6  *
7  * Authors: Christophe Massiot <massiot@via.ecp.fr>
8  * Laurent Aimar <fenrir@via.ecp.fr>
9  * Eric Petit <titer@videolan.org>
10  * Jean-Paul Saman <jpsaman #_at_# m2x.nl>
11  * RĂ©mi Denis-Courmont
12  *
13  * This program is free software; you can redistribute it and/or modify it
14  * under the terms of the GNU Lesser General Public License as published by
15  * the Free Software Foundation; either version 2.1 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU Lesser General Public License for more details.
22  *
23  * You should have received a copy of the GNU Lesser General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
26  *****************************************************************************/
27 
28 #ifndef VLC_SOUT_H_
29 #define VLC_SOUT_H_
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 #include <sys/types.h>
36 #include <vlc_es.h>
37 
38 /**
39  * \defgroup sout Stream output
40  * \ingroup output
41  * @{
42  * \file
43  * Stream output modules interface
44  */
45 
46 /** Stream output instance (FIXME: should be private to src/ to avoid
47  * invalid unsynchronized access) */
49 {
51 
52  char *psz_sout;
53 
54  /** count of output that can't control the space */
56 
59 };
60 
61 /****************************************************************************
62  * sout_stream_id_sys_t: opaque (private for all sout_stream_t)
63  ****************************************************************************/
65 
66 /**
67  * \defgroup sout_access Access output
68  * Raw output byte streams
69  * @{
70  */
71 
72 /** Stream output access_output */
73 struct sout_access_out_t
74 {
76 
78  char *psz_access;
79 
80  char *psz_path;
82  int (*pf_seek)( sout_access_out_t *, off_t );
83  ssize_t (*pf_read)( sout_access_out_t *, block_t * );
84  ssize_t (*pf_write)( sout_access_out_t *, block_t * );
85  int (*pf_control)( sout_access_out_t *, int, va_list );
86 
88 };
89 
91 {
92  ACCESS_OUT_CONTROLS_PACE, /* arg1=bool *, can fail (assume true) */
93  ACCESS_OUT_CAN_SEEK, /* arg1=bool *, can fail (assume false) */
94 };
95 
96 VLC_API sout_access_out_t * sout_AccessOutNew( vlc_object_t *, const char *psz_access, const char *psz_name ) VLC_USED;
97 #define sout_AccessOutNew( obj, access, name ) \
98  sout_AccessOutNew( VLC_OBJECT(obj), access, name )
104 
105 static inline bool sout_AccessOutCanControlPace( sout_access_out_t *p_ao )
106 {
107  bool b;
109  return true;
110  return b;
111 }
112 
113 /**
114  * @}
115  * \defgroup sout_mux Multiplexer
116  * Multiplexers (file formatters)
117  * @{
118  */
119 
120 /** Muxer structure */
121 struct sout_mux_t
122 {
125 
127 
128  char *psz_mux;
130 
132 
135  int (*pf_mux) ( sout_mux_t * );
136  int (*pf_control) ( sout_mux_t *, int, va_list );
137 
138  /* here are all inputs accepted by muxer */
141 
142  /* mux private */
144 
145  /* XXX private to stream_output.c */
146  /* if muxer doesn't support adding stream at any time then we first wait
147  * for stream then we refuse all stream and start muxing */
149  bool b_waiting_stream;
150  /* we wait 1.5 second after first stream added */
152 };
153 
154 enum sout_mux_query_e
155 {
156  /* capabilities */
157  MUX_CAN_ADD_STREAM_WHILE_MUXING, /* arg1= bool *, res=cannot fail */
158  /* properties */
159  MUX_GET_ADD_STREAM_WAIT, /* arg1= bool *, res=cannot fail */
160  MUX_GET_MIME, /* arg1= char ** res=can fail */
161 };
162 
163 struct sout_input_t
164 {
167  void *p_sys;
169 };
170 
171 
177 VLC_API int sout_MuxGetStream(sout_mux_t *, unsigned, mtime_t *);
179 
180 static inline int sout_MuxControl( sout_mux_t *p_mux, int i_query, ... )
181 {
182  va_list args;
183  int i_result;
184 
185  va_start( args, i_query );
186  i_result = p_mux->pf_control( p_mux, i_query, args );
187  va_end( args );
188  return i_result;
189 }
190 
191 /** @} */
192 
194  SOUT_STREAM_EMPTY, /* arg1=bool *, res=can fail (assume true) */
195 };
196 
197 struct sout_stream_t
198 {
200 
203 
204  char *psz_name;
207 
208  /* add, remove a stream */
210  void (*pf_del)( sout_stream_t *, sout_stream_id_sys_t * );
211  /* manage a packet */
213  int (*pf_control)( sout_stream_t *, int, va_list );
215 
217  bool pace_nocontrol;
218 };
219 
222  const char *psz_chain, sout_stream_t *p_next, sout_stream_t **p_last) VLC_USED;
223 
225  const es_format_t *fmt )
226 {
227  return s->pf_add( s, fmt );
228 }
229 
230 static inline void sout_StreamIdDel( sout_stream_t *s,
232 {
233  s->pf_del( s, id );
234 }
235 
236 static inline int sout_StreamIdSend( sout_stream_t *s,
237  sout_stream_id_sys_t *id, block_t *b )
238 {
239  return s->pf_send( s, id, b );
240 }
241 
242 static inline void sout_StreamFlush( sout_stream_t *s,
244 {
245  if (s->pf_flush)
246  s->pf_flush( s, id );
247 }
248 
249 static inline int sout_StreamControl( sout_stream_t *s, int i_query, ... )
250 {
251  va_list args;
252  int i_result;
253 
254  va_start( args, i_query );
255  if ( !s->pf_control )
256  i_result = VLC_EGENERIC;
257  else
258  i_result = s->pf_control( s, i_query, args );
259  va_end( args );
260  return i_result;
261 }
262 
263 /****************************************************************************
264  * Encoder
265  ****************************************************************************/
266 
268 #define sout_EncoderCreate(o) sout_EncoderCreate(VLC_OBJECT(o))
269 
270 /****************************************************************************
271  * Announce handler
272  ****************************************************************************/
275 #define sout_AnnounceRegisterSDP(o, sdp, addr) \
276  sout_AnnounceRegisterSDP(VLC_OBJECT (o), sdp, addr)
277 #define sout_AnnounceUnRegister(o, a) \
278  sout_AnnounceUnRegister(VLC_OBJECT (o), a)
279 
280 /** SDP */
281 
282 struct sockaddr;
283 struct vlc_memstream;
284 
286  const char *cfgpref,
287  const struct sockaddr *src, size_t slen,
288  const struct sockaddr *addr, size_t alen) VLC_USED;
289 VLC_API void sdp_AddMedia(struct vlc_memstream *, const char *type,
290  const char *protocol, int dport, unsigned pt,
291  bool bw_indep, unsigned bw, const char *ptname,
292  unsigned clockrate, unsigned channels,
293  const char *fmtp);
294 VLC_API void sdp_AddAttribute(struct vlc_memstream *, const char *name,
295  const char *fmt, ...) VLC_FORMAT(3, 4);
296 
297 /** Description module */
299 {
300  int i_es;
301  es_format_t **es;
302  vlc_sem_t *sem;
304 
305 /** @} */
306 
307 #ifdef __cplusplus
308 }
309 #endif
310 
311 #endif
sout_MuxDeleteStream
void sout_MuxDeleteStream(sout_mux_t *, sout_input_t *)
Definition: missing.c:136
VLC_FORMAT
#define VLC_FORMAT(x, y)
Definition: vlc_common.h:100
vlc_es.h
VLC_API
#define VLC_API
Definition: fourcc_gen.c:30
sout_input_t::p_fmt
const es_format_t * p_fmt
Definition: vlc_sout.h:164
VLC_COMMON_MEMBERS
#define VLC_COMMON_MEMBERS
Backward compatibility macro.
Definition: vlc_common.h:453
vlc_memstream
Definition: vlc_memstream.h:27
sout_mux_t::pp_inputs
sout_input_t ** pp_inputs
Definition: vlc_sout.h:139
sout_mux_t::psz_mux
char * psz_mux
Definition: vlc_sout.h:127
sout_StreamIdDel
static void sout_StreamIdDel(sout_stream_t *s, sout_stream_id_sys_t *id)
Definition: vlc_sout.h:229
sout_MuxFlush
void sout_MuxFlush(sout_mux_t *, sout_input_t *)
Definition: missing.c:161
sout_stream_query_e
sout_stream_query_e
Definition: vlc_sout.h:192
sout_instance_t::i_out_pace_nocontrol
int i_out_pace_nocontrol
count of output that can't control the space
Definition: vlc_sout.h:55
vlc_common.h
sdp_AddMedia
void sdp_AddMedia(struct vlc_memstream *, const char *type, const char *protocol, int dport, unsigned pt, bool bw_indep, unsigned bw, const char *ptname, unsigned clockrate, unsigned channels, const char *fmtp)
Definition: missing.c:43
sout_access_out_t::p_sys
sout_access_out_sys_t * p_sys
Definition: vlc_sout.h:80
sout_EncoderCreate
#define sout_EncoderCreate(o)
Definition: vlc_sout.h:266
sout_stream_t
Definition: vlc_sout.h:196
MUX_GET_MIME
Definition: vlc_sout.h:159
sout_description_data_t
Description module.
Definition: vlc_sout.h:295
sout_stream_t::pf_control
int(* pf_control)(sout_stream_t *, int, va_list)
Definition: vlc_sout.h:212
sout_StreamChainNew
sout_stream_t * sout_StreamChainNew(sout_instance_t *p_sout, const char *psz_chain, sout_stream_t *p_next, sout_stream_t **p_last)
Definition: missing.c:173
sout_input_t
Definition: vlc_sout.h:162
sout_mux_t::p_module
module_t * p_module
Definition: vlc_sout.h:123
SOUT_STREAM_EMPTY
Definition: vlc_sout.h:193
sout_instance_t::p_stream
sout_stream_t * p_stream
Definition: vlc_sout.h:58
sout_stream_t::p_cfg
config_chain_t * p_cfg
Definition: vlc_sout.h:204
sout_MuxAddStream
sout_input_t * sout_MuxAddStream(sout_mux_t *, const es_format_t *)
Definition: missing.c:124
sout_stream_t::p_module
module_t * p_module
Definition: vlc_sout.h:200
sout_stream_id_sys_t
struct sout_stream_id_sys_t sout_stream_id_sys_t
Definition: vlc_sout.h:63
sout_description_data_t
struct sout_description_data_t sout_description_data_t
Description module.
sout_stream_t::pf_flush
void(* pf_flush)(sout_stream_t *, sout_stream_id_sys_t *)
Definition: vlc_sout.h:213
block_fifo_t
Internal state for block queues.
Definition: fifo.c:37
VLC_EGENERIC
#define VLC_EGENERIC
Unspecified error.
Definition: vlc_common.h:350
sout_AccessOutSeek
int sout_AccessOutSeek(sout_access_out_t *, off_t)
Definition: missing.c:88
sout_access_out_t
Stream output access_output.
Definition: vlc_sout.h:72
sout_mux_t::b_add_stream_any_time
bool b_add_stream_any_time
Definition: vlc_sout.h:147
sout_StreamIdAdd
static sout_stream_id_sys_t * sout_StreamIdAdd(sout_stream_t *s, const es_format_t *fmt)
Definition: vlc_sout.h:223
sout_AccessOutNew
#define sout_AccessOutNew(obj, access, name)
Definition: vlc_sout.h:96
sout_access_out_sys_t
struct sout_access_out_sys_t sout_access_out_sys_t
Definition: vlc_common.h:262
MUX_GET_ADD_STREAM_WAIT
Definition: vlc_sout.h:158
sout_mux_query_e
sout_mux_query_e
Definition: vlc_sout.h:153
vlc_sdp_Start
int vlc_sdp_Start(struct vlc_memstream *, vlc_object_t *obj, const char *cfgpref, const struct sockaddr *src, size_t slen, const struct sockaddr *addr, size_t alen)
Definition: missing.c:182
sout_access_out_t::pf_control
int(* pf_control)(sout_access_out_t *, int, va_list)
Definition: vlc_sout.h:84
sout_AccessOutControl
int sout_AccessOutControl(sout_access_out_t *, int,...)
sout_AccessOutControl
Definition: missing.c:61
MUX_CAN_ADD_STREAM_WHILE_MUXING
Definition: vlc_sout.h:156
sout_input_t::p_fifo
block_fifo_t * p_fifo
Definition: vlc_sout.h:165
sout_input_t::p_sys
void * p_sys
Definition: vlc_sout.h:166
sout_instance_t::lock
vlc_mutex_t lock
Definition: vlc_sout.h:57
sout_AccessOutCanControlPace
static bool sout_AccessOutCanControlPace(sout_access_out_t *p_ao)
Definition: vlc_sout.h:104
sout_access_out_t::pf_write
ssize_t(* pf_write)(sout_access_out_t *, block_t *)
Definition: vlc_sout.h:83
sout_stream_t::p_sys
sout_stream_sys_t * p_sys
Definition: vlc_sout.h:215
config_chain_t
Definition: vlc_configuration.h:155
sout_input_t::fmt
es_format_t fmt
Definition: vlc_sout.h:167
module_t
Internal module descriptor.
Definition: modules.h:79
sout_stream_sys_t
struct sout_stream_sys_t sout_stream_sys_t
Definition: vlc_common.h:268
es_format_t
Definition: vlc_es.h:580
sout_StreamIdSend
static int sout_StreamIdSend(sout_stream_t *s, sout_stream_id_sys_t *id, block_t *b)
Definition: vlc_sout.h:235
sout_AccessOutWrite
ssize_t sout_AccessOutWrite(sout_access_out_t *, block_t *)
Definition: missing.c:94
sout_mux_t::p_access
sout_access_out_t * p_access
Definition: vlc_sout.h:130
sout_mux_t::pf_mux
int(* pf_mux)(sout_mux_t *)
Definition: vlc_sout.h:134
ACCESS_OUT_CONTROLS_PACE
Definition: vlc_sout.h:91
sout_AnnounceRegisterSDP
#define sout_AnnounceRegisterSDP(o, sdp, addr)
Definition: vlc_sout.h:272
sout_stream_t::psz_name
char * psz_name
Definition: vlc_sout.h:203
sout_stream_t::pf_add
sout_stream_id_sys_t *(* pf_add)(sout_stream_t *, const es_format_t *)
Definition: vlc_sout.h:208
encoder_t
Definition: vlc_codec.h:211
psz_name
const char * psz_name
Definition: vlc_codecs.h:315
sout_StreamChainDelete
void sout_StreamChainDelete(sout_stream_t *p_first, sout_stream_t *p_last)
Definition: missing.c:167
sout_access_out_t::p_cfg
config_chain_t * p_cfg
Definition: vlc_sout.h:86
access_out_query_e
access_out_query_e
Definition: vlc_sout.h:89
sout_mux_t::p_sout
sout_instance_t * p_sout
Definition: vlc_sout.h:125
sout_access_out_t::pf_seek
int(* pf_seek)(sout_access_out_t *, off_t)
Definition: vlc_sout.h:81
sout_mux_t
Muxer structure.
Definition: vlc_sout.h:120
sout_access_out_t::p_module
module_t * p_module
Definition: vlc_sout.h:76
sout_mux_t::p_cfg
config_chain_t * p_cfg
Definition: vlc_sout.h:128
sout_mux_t::pf_delstream
void(* pf_delstream)(sout_mux_t *, sout_input_t *)
Definition: vlc_sout.h:133
sout_mux_t::i_add_stream_start
mtime_t i_add_stream_start
Definition: vlc_sout.h:150
sout_mux_t::p_sys
sout_mux_sys_t * p_sys
Definition: vlc_sout.h:142
vlc_object_t
The main vlc_object_t structure.
Definition: vlc_objects.h:39
sout_stream_t::pf_del
void(* pf_del)(sout_stream_t *, sout_stream_id_sys_t *)
Definition: vlc_sout.h:209
vlc_mutex_t
pthread_mutex_t vlc_mutex_t
Mutex.
Definition: vlc_threads.h:267
sout_access_out_t::pf_read
ssize_t(* pf_read)(sout_access_out_t *, block_t *)
Definition: vlc_sout.h:82
sout_access_out_t::psz_access
char * psz_access
Definition: vlc_sout.h:77
sout_mux_t::pf_addstream
int(* pf_addstream)(sout_mux_t *, sout_input_t *)
Definition: vlc_sout.h:132
VLC_USED
#define VLC_USED
Definition: fourcc_gen.c:31
sout_StreamFlush
static void sout_StreamFlush(sout_stream_t *s, sout_stream_id_sys_t *id)
Definition: vlc_sout.h:241
sout_MuxGetStream
int sout_MuxGetStream(sout_mux_t *, unsigned, mtime_t *)
Definition: stream_output.c:543
sout_access_out_t::psz_path
char * psz_path
Definition: vlc_sout.h:79
name
const char name[16]
Definition: httpd.c:1249
ACCESS_OUT_CAN_SEEK
Definition: vlc_sout.h:92
sout_AccessOutRead
ssize_t sout_AccessOutRead(sout_access_out_t *, block_t *)
Definition: missing.c:82
sout_instance_t::psz_sout
char * psz_sout
Definition: vlc_sout.h:52
sdp_AddAttribute
void sdp_AddAttribute(struct vlc_memstream *, const char *name, const char *fmt,...)
Definition: missing.c:55
sout_MuxDelete
void sout_MuxDelete(sout_mux_t *)
Definition: missing.c:130
sout_MuxSendBuffer
int sout_MuxSendBuffer(sout_mux_t *, sout_input_t *, block_t *)
Definition: missing.c:155
sout_mux_t::b_waiting_stream
bool b_waiting_stream
Definition: vlc_sout.h:148
sout_stream_t::pf_send
int(* pf_send)(sout_stream_t *, sout_stream_id_sys_t *, block_t *)
Definition: vlc_sout.h:211
vlc_sem_t
sem_t vlc_sem_t
Semaphore.
Definition: vlc_threads.h:297
mtime_t
int64_t mtime_t
High precision date or time interval.
Definition: vlc_common.h:150
sout_MuxNew
sout_mux_t * sout_MuxNew(sout_instance_t *, const char *, sout_access_out_t *)
Definition: missing.c:148
sout_mux_t::pf_control
int(* pf_control)(sout_mux_t *, int, va_list)
Definition: vlc_sout.h:135
session_descriptor_t
Definition: sap.c:47
sout_mux_sys_t
struct sout_mux_sys_t sout_mux_sys_t
Definition: vlc_common.h:265
sout_MuxControl
static int sout_MuxControl(sout_mux_t *p_mux, int i_query,...)
Definition: vlc_sout.h:179
sout_AccessOutDelete
void sout_AccessOutDelete(sout_access_out_t *)
Definition: missing.c:67
sout_stream_t::p_sout
sout_instance_t * p_sout
Definition: vlc_sout.h:201
sout_mux_t::i_nb_inputs
int i_nb_inputs
Definition: vlc_sout.h:138
sout_stream_t::pace_nocontrol
bool pace_nocontrol
Definition: vlc_sout.h:216
sout_instance_t
Stream output instance (FIXME: should be private to src/ to avoid invalid unsynchronized access)
Definition: vlc_sout.h:48
block_t
Definition: vlc_block.h:111
sout_stream_t::p_next
sout_stream_t * p_next
Definition: vlc_sout.h:205
sout_AnnounceUnRegister
#define sout_AnnounceUnRegister(o, a)
Definition: vlc_sout.h:274
sout_StreamControl
static int sout_StreamControl(sout_stream_t *s, int i_query,...)
Definition: vlc_sout.h:248