lib: media: fix libvlc_media_duplicate() behavior
[vlc.git] / include / vlc_sout.h
blob8d7c07aebb66c06da6884c647a712cfa3bede55c
1 /*****************************************************************************
2 * vlc_sout.h : stream output module
3 *****************************************************************************
4 * Copyright (C) 2002-2008 VLC authors and VideoLAN
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
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.
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.
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 *****************************************************************************/
27 #ifndef VLC_SOUT_H_
28 #define VLC_SOUT_H_
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
34 #include <sys/types.h>
35 #include <vlc_es.h>
37 /**
38 * \defgroup sout Stream output
39 * \ingroup output
40 * @{
41 * \file
42 * Stream output modules interface
45 /** Stream output instance (FIXME: should be private to src/ to avoid
46 * invalid unsynchronized access) */
47 struct sout_instance_t
49 struct vlc_object_t obj;
51 char *psz_sout;
53 /** count of output that can't control the space */
54 int i_out_pace_nocontrol;
55 bool b_wants_substreams;
57 vlc_mutex_t lock;
58 sout_stream_t *p_stream;
61 /**
62 * \defgroup sout_access Access output
63 * Raw output byte streams
64 * @{
67 /** Stream output access_output */
68 struct sout_access_out_t
70 struct vlc_object_t obj;
72 module_t *p_module;
73 char *psz_access;
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 );
82 config_chain_t *p_cfg;
85 enum access_out_query_e
87 ACCESS_OUT_CONTROLS_PACE, /* arg1=bool *, can fail (assume true) */
88 ACCESS_OUT_CAN_SEEK, /* arg1=bool *, can fail (assume false) */
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 )
94 VLC_API void sout_AccessOutDelete( sout_access_out_t * );
95 VLC_API int sout_AccessOutSeek( sout_access_out_t *, off_t );
96 VLC_API ssize_t sout_AccessOutRead( sout_access_out_t *, block_t * );
97 VLC_API ssize_t sout_AccessOutWrite( sout_access_out_t *, block_t * );
98 VLC_API int sout_AccessOutControl( sout_access_out_t *, int, ... );
100 static inline bool sout_AccessOutCanControlPace( sout_access_out_t *p_ao )
102 bool b;
103 if( sout_AccessOutControl( p_ao, ACCESS_OUT_CONTROLS_PACE, &b ) )
104 return true;
105 return b;
109 * @}
110 * \defgroup sout_mux Multiplexer
111 * Multiplexers (file formatters)
112 * @{
115 /** Muxer structure */
116 struct sout_mux_t
118 struct vlc_object_t obj;
119 module_t *p_module;
121 char *psz_mux;
122 config_chain_t *p_cfg;
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;
147 enum sout_mux_query_e
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 */
155 struct sout_input_t
157 const es_format_t *p_fmt;
158 block_fifo_t *p_fifo;
159 void *p_sys;
160 es_format_t fmt;
164 VLC_API sout_mux_t * sout_MuxNew( sout_access_out_t *, const char * ) VLC_USED;
165 VLC_API sout_input_t *sout_MuxAddStream( sout_mux_t *, const es_format_t * ) VLC_USED;
166 VLC_API void sout_MuxDeleteStream( sout_mux_t *, sout_input_t * );
167 VLC_API void sout_MuxDelete( sout_mux_t * );
168 VLC_API int sout_MuxSendBuffer( sout_mux_t *, sout_input_t *, block_t * );
169 VLC_API int sout_MuxGetStream(sout_mux_t *, unsigned, vlc_tick_t *);
170 VLC_API void sout_MuxFlush( sout_mux_t *, sout_input_t * );
172 static inline int sout_MuxControl( sout_mux_t *p_mux, int i_query, ... )
174 va_list args;
175 int i_result;
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;
183 /** @} */
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 */
191 struct sout_stream_operations {
192 void *(*add)(sout_stream_t *, const es_format_t *);
193 void (*del)(sout_stream_t *, void *);
194 int (*send)(sout_stream_t *, void *, block_t *);
195 int (*control)( sout_stream_t *, int, va_list );
196 void (*flush)( sout_stream_t *, void *);
199 struct sout_stream_t
201 struct vlc_object_t obj;
203 module_t *p_module;
204 sout_instance_t *p_sout;
206 char *psz_name;
207 config_chain_t *p_cfg;
208 sout_stream_t *p_next;
210 const struct sout_stream_operations *ops;
212 /* add, remove a stream */
213 void *(*pf_add)( sout_stream_t *, const es_format_t * );
214 void (*pf_del)( sout_stream_t *, void * );
215 /* manage a packet */
216 int (*pf_send)( sout_stream_t *, void *, block_t* );
217 int (*pf_control)( sout_stream_t *, int, va_list );
218 void (*pf_flush)( sout_stream_t *, void * );
220 void *p_sys;
221 bool pace_nocontrol;
224 VLC_API void sout_StreamChainDelete(sout_stream_t *p_first, sout_stream_t *p_last );
225 VLC_API sout_stream_t *sout_StreamChainNew(sout_instance_t *p_sout,
226 const char *psz_chain, sout_stream_t *p_next, sout_stream_t **p_last) VLC_USED;
228 static inline void *sout_StreamIdAdd( sout_stream_t *s,
229 const es_format_t *fmt )
231 if (s->ops == NULL)
232 return s->pf_add(s, fmt);
233 return s->ops->add(s, fmt);
236 static inline void sout_StreamIdDel( sout_stream_t *s,
237 void *id )
239 if (s->ops == NULL) {
240 s->pf_del(s, id);
241 return;
243 s->ops->del(s, id);
246 static inline int sout_StreamIdSend( sout_stream_t *s,
247 void *id, block_t *b )
249 if (s->ops == NULL)
250 return s->pf_send(s, id, b);
251 return s->ops->send(s, id, b);
254 static inline void sout_StreamFlush( sout_stream_t *s,
255 void *id )
257 if (s->ops == NULL) {
258 if (s->pf_flush != NULL)
259 s->pf_flush(s, id);
260 return;
262 if (s->ops->flush != NULL)
263 s->ops->flush(s, id);
266 static inline int sout_StreamControlVa( sout_stream_t *s, int i_query, va_list args )
268 if (s->ops == NULL) {
269 if (s->pf_control == NULL)
270 return VLC_EGENERIC;
271 return s->pf_control(s, i_query, args);
273 if (s->ops->control == NULL)
274 return VLC_EGENERIC;
275 return s->ops->control(s, i_query, args);
278 static inline int sout_StreamControl( sout_stream_t *s, int i_query, ... )
280 va_list args;
281 int i_result;
283 va_start( args, i_query );
284 i_result = sout_StreamControlVa( s, i_query, args );
285 va_end( args );
286 return i_result;
289 /****************************************************************************
290 * Encoder
291 ****************************************************************************/
293 VLC_API encoder_t * sout_EncoderCreate( vlc_object_t *, size_t );
294 #define sout_EncoderCreate(o,s) sout_EncoderCreate(VLC_OBJECT(o),s)
296 /****************************************************************************
297 * Announce handler
298 ****************************************************************************/
299 VLC_API session_descriptor_t* sout_AnnounceRegisterSDP( vlc_object_t *, const char *, const char * ) VLC_USED;
300 VLC_API void sout_AnnounceUnRegister(vlc_object_t *,session_descriptor_t* );
301 #define sout_AnnounceRegisterSDP(o, sdp, addr) \
302 sout_AnnounceRegisterSDP(VLC_OBJECT (o), sdp, addr)
303 #define sout_AnnounceUnRegister(o, a) \
304 sout_AnnounceUnRegister(VLC_OBJECT (o), a)
306 /** @} */
308 #ifdef __cplusplus
310 #endif
312 #endif