Update meta data
[vlc.git] / include / vlc_sout.h
1 /*****************************************************************************
2  * vlc_sout.h : stream output module
3  *****************************************************************************
4  * Copyright (C) 2002-2008 VLC authors and VideoLAN
5  * $Id$
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 /**
32  * \file
33  * This file defines structures and functions for stream output in vlc
34  */
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40 #include <sys/types.h>
41 #include <vlc_es.h>
42
43 /** Stream output instance (FIXME: should be private to src/ to avoid
44  * invalid unsynchronized access) */
45 struct sout_instance_t
46 {
47     VLC_COMMON_MEMBERS
48
49     char *psz_sout;
50
51     /** count of output that can't control the space */
52     int                 i_out_pace_nocontrol;
53
54     vlc_mutex_t         lock;
55     sout_stream_t       *p_stream;
56 };
57
58 /****************************************************************************
59  * sout_stream_id_t: opaque (private for all sout_stream_t)
60  ****************************************************************************/
61 typedef struct sout_stream_id_t  sout_stream_id_t;
62
63 /** Stream output access_output */
64 struct sout_access_out_t
65 {
66     VLC_COMMON_MEMBERS
67
68     module_t                *p_module;
69     char                    *psz_access;
70
71     char                    *psz_path;
72     sout_access_out_sys_t   *p_sys;
73     int                     (*pf_seek)( sout_access_out_t *, off_t );
74     ssize_t                 (*pf_read)( sout_access_out_t *, block_t * );
75     ssize_t                 (*pf_write)( sout_access_out_t *, block_t * );
76     int                     (*pf_control)( sout_access_out_t *, int, va_list );
77
78     config_chain_t          *p_cfg;
79 };
80
81 enum access_out_query_e
82 {
83     ACCESS_OUT_CONTROLS_PACE, /* arg1=bool *, can fail (assume true) */
84 };
85
86 VLC_API sout_access_out_t * sout_AccessOutNew( vlc_object_t *, const char *psz_access, const char *psz_name ) VLC_USED;
87 #define sout_AccessOutNew( obj, access, name ) \
88         sout_AccessOutNew( VLC_OBJECT(obj), access, name )
89 VLC_API void sout_AccessOutDelete( sout_access_out_t * );
90 VLC_API int sout_AccessOutSeek( sout_access_out_t *, off_t );
91 VLC_API ssize_t sout_AccessOutRead( sout_access_out_t *, block_t * );
92 VLC_API ssize_t sout_AccessOutWrite( sout_access_out_t *, block_t * );
93 VLC_API int sout_AccessOutControl( sout_access_out_t *, int, ... );
94
95 static inline bool sout_AccessOutCanControlPace( sout_access_out_t *p_ao )
96 {
97     bool b;
98     if( sout_AccessOutControl( p_ao, ACCESS_OUT_CONTROLS_PACE, &b ) )
99         return true;
100     return b;
101 }
102
103 /** Muxer structure */
104 struct  sout_mux_t
105 {
106     VLC_COMMON_MEMBERS
107     module_t            *p_module;
108
109     sout_instance_t     *p_sout;
110
111     char                *psz_mux;
112     config_chain_t          *p_cfg;
113
114     sout_access_out_t   *p_access;
115
116     int                 (*pf_addstream)( sout_mux_t *, sout_input_t * );
117     int                 (*pf_delstream)( sout_mux_t *, sout_input_t * );
118     int                 (*pf_mux)      ( sout_mux_t * );
119     int                 (*pf_control)  ( sout_mux_t *, int, va_list );
120
121     /* here are all inputs accepted by muxer */
122     int                 i_nb_inputs;
123     sout_input_t        **pp_inputs;
124
125     /* mux private */
126     sout_mux_sys_t      *p_sys;
127
128     /* XXX private to stream_output.c */
129     /* if muxer doesn't support adding stream at any time then we first wait
130      *  for stream then we refuse all stream and start muxing */
131     bool  b_add_stream_any_time;
132     bool  b_waiting_stream;
133     /* we wait one second after first stream added */
134     mtime_t     i_add_stream_start;
135 };
136
137 enum sout_mux_query_e
138 {
139     /* capabilities */
140     MUX_CAN_ADD_STREAM_WHILE_MUXING,    /* arg1= bool *,      res=cannot fail */
141     /* properties */
142     MUX_GET_ADD_STREAM_WAIT,            /* arg1= bool *,      res=cannot fail */
143     MUX_GET_MIME,                       /* arg1= char **            res=can fail    */
144 };
145
146 struct sout_input_t
147 {
148     es_format_t     *p_fmt;
149     block_fifo_t    *p_fifo;
150
151     void            *p_sys;
152 };
153
154
155 VLC_API sout_mux_t * sout_MuxNew( sout_instance_t*, const char *, sout_access_out_t * ) VLC_USED;
156 VLC_API sout_input_t * sout_MuxAddStream( sout_mux_t *, es_format_t * ) VLC_USED;
157 VLC_API void sout_MuxDeleteStream( sout_mux_t *, sout_input_t * );
158 VLC_API void sout_MuxDelete( sout_mux_t * );
159 VLC_API void sout_MuxSendBuffer( sout_mux_t *, sout_input_t  *, block_t * );
160 VLC_API int sout_MuxGetStream(sout_mux_t *, int , mtime_t *);
161
162 static inline int sout_MuxControl( sout_mux_t *p_mux, int i_query, ... )
163 {
164     va_list args;
165     int     i_result;
166
167     va_start( args, i_query );
168     i_result = p_mux->pf_control( p_mux, i_query, args );
169     va_end( args );
170     return i_result;
171 }
172
173 /****************************************************************************
174  * sout_stream:
175  ****************************************************************************/
176 struct sout_stream_t
177 {
178     VLC_COMMON_MEMBERS
179
180     module_t          *p_module;
181     sout_instance_t   *p_sout;
182
183     char              *psz_name;
184     config_chain_t        *p_cfg;
185     sout_stream_t     *p_next;
186
187     /* add, remove a stream */
188     sout_stream_id_t *(*pf_add)( sout_stream_t *, es_format_t * );
189     int               (*pf_del)( sout_stream_t *, sout_stream_id_t * );
190     /* manage a packet */
191     int               (*pf_send)( sout_stream_t *, sout_stream_id_t *, block_t* );
192
193     sout_stream_sys_t *p_sys;
194     bool pace_nocontrol;
195 };
196
197 VLC_API void sout_StreamChainDelete(sout_stream_t *p_first, sout_stream_t *p_last );
198 VLC_API sout_stream_t *sout_StreamChainNew(sout_instance_t *p_sout,
199         char *psz_chain, sout_stream_t *p_next, sout_stream_t **p_last) VLC_USED;
200
201 static inline sout_stream_id_t *sout_StreamIdAdd( sout_stream_t *s, es_format_t *fmt )
202 {
203     return s->pf_add( s, fmt );
204 }
205 static inline int sout_StreamIdDel( sout_stream_t *s, sout_stream_id_t *id )
206 {
207     return s->pf_del( s, id );
208 }
209 static inline int sout_StreamIdSend( sout_stream_t *s, sout_stream_id_t *id, block_t *b )
210 {
211     return s->pf_send( s, id, b );
212 }
213
214 /****************************************************************************
215  * Encoder
216  ****************************************************************************/
217
218 VLC_API encoder_t * sout_EncoderCreate( vlc_object_t *obj );
219 #define sout_EncoderCreate(o) sout_EncoderCreate(VLC_OBJECT(o))
220
221 /****************************************************************************
222  * Announce handler
223  ****************************************************************************/
224 VLC_API session_descriptor_t* sout_AnnounceRegisterSDP( vlc_object_t *, const char *, const char * ) VLC_USED;
225 VLC_API int sout_AnnounceUnRegister(vlc_object_t *,session_descriptor_t* );
226 #define sout_AnnounceRegisterSDP(o, sdp, addr) \
227         sout_AnnounceRegisterSDP(VLC_OBJECT (o), sdp, addr)
228 #define sout_AnnounceUnRegister(o, a) \
229         sout_AnnounceUnRegister(VLC_OBJECT (o), a)
230
231 /** SDP */
232
233 struct sockaddr;
234
235 VLC_API char * vlc_sdp_Start( vlc_object_t *obj, const char *cfgpref, const struct sockaddr *src, size_t srclen, const struct sockaddr *addr, size_t addrlen ) VLC_USED;
236 VLC_API char * sdp_AddMedia(char **sdp, 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);
237 VLC_API char * sdp_AddAttribute(char **sdp, const char *name, const char *fmt, ...) VLC_FORMAT( 3, 4 );
238
239 /** Description module */
240 typedef struct sout_description_data_t
241 {
242     int i_es;
243     es_format_t **es;
244     vlc_sem_t *sem;
245 } sout_description_data_t;
246
247 #ifdef __cplusplus
248 }
249 #endif
250
251 #endif