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  char *psz_mux;
124  sout_access_out_t *p_access;
126  int (*pf_addstream)( sout_mux_t *, sout_input_t * );
127  void (*pf_delstream)( sout_mux_t *, sout_input_t * );
128  int (*pf_mux) ( sout_mux_t * );
129  int (*pf_control) ( sout_mux_t *, int, va_list );
131  /* here are all inputs accepted by muxer */
132  int i_nb_inputs;
133  sout_input_t **pp_inputs;
135  /* mux private */
136  void *p_sys;
138  /* XXX private to stream_output.c */
139  /* if muxer doesn't support adding stream at any time then we first wait
140  * for stream then we refuse all stream and start muxing */
141  bool b_add_stream_any_time;
142  bool b_waiting_stream;
143  /* we wait 1.5 second after first stream added */
144  vlc_tick_t i_add_stream_start;
145 };
146 
147 enum sout_mux_query_e
148 {
149  /* capabilities */
150  MUX_CAN_ADD_STREAM_WHILE_MUXING, /* arg1= bool *, res=cannot fail */
151  /* properties */
152  MUX_GET_MIME, /* arg1= char ** res=can fail */
153 };
154 
155 struct sout_input_t
156 {
157  const es_format_t *p_fmt;
158  block_fifo_t *p_fifo;
159  void *p_sys;
161 };
162 
163 
169 VLC_API int sout_MuxGetStream(sout_mux_t *, unsigned, vlc_tick_t *);
171 
172 static inline int sout_MuxControl( sout_mux_t *p_mux, int i_query, ... )
173 {
174  va_list args;
175  int i_result;
176 
177  va_start( args, i_query );
178  i_result = p_mux->pf_control( p_mux, i_query, args );
179  va_end( args );
180  return i_result;
181 }
182 
183 /** @} */
184 
185 enum sout_stream_query_e {
186  SOUT_STREAM_EMPTY, /* arg1=bool *, res=can fail (assume true) */
187  SOUT_STREAM_WANTS_SUBSTREAMS, /* arg1=bool *, res=can fail (assume false) */
188  SOUT_STREAM_ID_SPU_HIGHLIGHT, /* arg1=void *, arg2=const vlc_spu_highlight_t *, res=can fail */
189 };
190 
191 struct sout_stream_t
192 {
193  struct vlc_object_t obj;
195  module_t *p_module;
198  char *psz_name;
200  sout_stream_t *p_next;
202  /* add, remove a stream */
203  void *(*pf_add)( sout_stream_t *, const es_format_t * );
204  void (*pf_del)( sout_stream_t *, void * );
205  /* manage a packet */
206  int (*pf_send)( sout_stream_t *, void *, block_t* );
207  int (*pf_control)( sout_stream_t *, int, va_list );
208  void (*pf_flush)( sout_stream_t *, void * );
210  void *p_sys;
211  bool pace_nocontrol;
212 };
213 
216  const char *psz_chain, sout_stream_t *p_next, sout_stream_t **p_last) VLC_USED;
217 
218 static inline void *sout_StreamIdAdd( sout_stream_t *s,
219  const es_format_t *fmt )
220 {
221  return s->pf_add( s, fmt );
222 }
223 
224 static inline void sout_StreamIdDel( sout_stream_t *s,
225  void *id )
226 {
227  s->pf_del( s, id );
228 }
229 
230 static inline int sout_StreamIdSend( sout_stream_t *s,
231  void *id, block_t *b )
232 {
233  return s->pf_send( s, id, b );
234 }
235 
236 static inline void sout_StreamFlush( sout_stream_t *s,
237  void *id )
238 {
239  if (s->pf_flush)
240  s->pf_flush( s, id );
241 }
242 
243 static inline int sout_StreamControlVa( sout_stream_t *s, int i_query, va_list args )
244 {
245  return s->pf_control ? s->pf_control( s, i_query, args ) : VLC_EGENERIC;
246 }
247 
248 static inline int sout_StreamControl( sout_stream_t *s, int i_query, ... )
249 {
250  va_list args;
251  int i_result;
252 
253  va_start( args, i_query );
254  i_result = sout_StreamControlVa( s, i_query, args );
255  va_end( args );
256  return i_result;
257 }
258 
259 /****************************************************************************
260  * Encoder
261  ****************************************************************************/
262 
264 #define sout_EncoderCreate(o,s) sout_EncoderCreate(VLC_OBJECT(o),s)
266 /****************************************************************************
267  * Announce handler
268  ****************************************************************************/
271 #define sout_AnnounceRegisterSDP(o, sdp, addr) \
272  sout_AnnounceRegisterSDP(VLC_OBJECT (o), sdp, addr)
273 #define sout_AnnounceUnRegister(o, a) \
274  sout_AnnounceUnRegister(VLC_OBJECT (o), a)
275 
276 /** SDP */
277 
278 struct sockaddr;
279 struct vlc_memstream;
280 
282  const char *cfgpref,
283  const struct sockaddr *src, size_t slen,
284  const struct sockaddr *addr, size_t alen) VLC_USED;
285 
286 /** @} */
287 
288 #ifdef __cplusplus
289 }
290 #endif
291 
292 #endif
void sout_MuxFlush(sout_mux_t *, sout_input_t *)
Definition: missing.c:147
Definition: vlc_sout.h:153
ssize_t sout_AccessOutRead(sout_access_out_t *, block_t *)
Definition: missing.c:66
static int sout_StreamControl(sout_stream_t *s, int i_query,...)
Definition: vlc_sout.h:249
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:160
int sout_MuxGetStream(sout_mux_t *, unsigned, vlc_tick_t *)
Definition: missing.c:128
Internal state for block queues.
Definition: fifo.c:38
#define sout_AnnounceUnRegister(o, a)
Definition: vlc_sout.h:274
int(* pf_control)(sout_mux_t *, int, va_list)
Definition: vlc_sout.h:130
static int sout_StreamControlVa(sout_stream_t *s, int i_query, va_list args)
Definition: vlc_sout.h:244
Definition: vlc_sout.h:89
void sout_StreamChainDelete(sout_stream_t *p_first, sout_stream_t *p_last)
Definition: missing.c:153
int(* pf_send)(sout_stream_t *, void *, block_t *)
Definition: vlc_sout.h:207
Definition: vlc_sout.h:156
Definition: vlc_sout.h:88
Internal module descriptor.
Definition: modules.h:75
sout_mux_query_e
Definition: vlc_sout.h:148
In-memory stream object.
Definition: vlc_memstream.h:41
static int sout_MuxControl(sout_mux_t *p_mux, int i_query,...)
Definition: vlc_sout.h:173
sout_stream_query_e
Definition: vlc_sout.h:186
Definition: vlc_sout.h:187
const char * psz_name
Definition: text_style.c:33
int sout_MuxSendBuffer(sout_mux_t *, sout_input_t *, block_t *)
Definition: missing.c:140
int64_t vlc_tick_t
High precision date or time interval.
Definition: vlc_tick.h:45
Definition: vlc_sout.h:188
Definition: vlc_configuration.h:331
char * psz_sout
Definition: vlc_sout.h:52
Definition: vlc_sout.h:151
Stream output access_output.
Definition: vlc_sout.h:69
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:169
Definition: vlc_es.h:617
void(* pf_flush)(sout_stream_t *, void *)
Definition: vlc_sout.h:209
Mutex.
Definition: vlc_threads.h:266
void sout_MuxDeleteStream(sout_mux_t *, sout_input_t *)
Definition: missing.c:122
Definition: vlc_sout.h:189
access_out_query_e
Definition: vlc_sout.h:86
Definition: vlc_sout.h:192
static void sout_StreamIdDel(sout_stream_t *s, void *id)
Definition: vlc_sout.h:225
#define VLC_API
Definition: fourcc_gen.c:31
int sout_AccessOutControl(sout_access_out_t *, int,...)
sout_AccessOutControl
Definition: missing.c:45
Muxer structure.
Definition: vlc_sout.h:117
static void * sout_StreamIdAdd(sout_stream_t *s, const es_format_t *fmt)
Definition: vlc_sout.h:219
#define VLC_EGENERIC
Unspecified error.
Definition: vlc_common.h:472
int sout_AccessOutSeek(sout_access_out_t *, off_t)
Definition: missing.c:72
#define sout_EncoderCreate(o, s)
Definition: vlc_sout.h:265
void sout_AccessOutDelete(sout_access_out_t *)
Definition: missing.c:51
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:204
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
sout_mux_t * sout_MuxNew(sout_access_out_t *, const char *)
Definition: missing.c:134
vlc_mutex_t lock
Definition: vlc_sout.h:58
void(* pf_del)(sout_stream_t *, void *)
Definition: vlc_sout.h:205
This file defines the elementary streams format types.
VLC object common members.
Definition: vlc_objects.h:43
void sout_MuxDelete(sout_mux_t *)
Definition: missing.c:116
int(* pf_control)(sout_stream_t *, int, va_list)
Definition: vlc_sout.h:208
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:237
#define VLC_USED
Definition: fourcc_gen.c:32
sout_input_t * sout_MuxAddStream(sout_mux_t *, const es_format_t *)
Definition: missing.c:109
Definition: vlc_codec.h:244
#define sout_AnnounceRegisterSDP(o, sdp, addr)
Definition: vlc_sout.h:272
static int sout_StreamIdSend(sout_stream_t *s, void *id, block_t *b)
Definition: vlc_sout.h:231
ssize_t sout_AccessOutWrite(sout_access_out_t *, block_t *)
Definition: missing.c:78
Definition: sap.c:48