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