1 /*****************************************************************************
2 * stream_output.h : stream output module
3 *****************************************************************************
4 * Copyright (C) 2002-2005 the VideoLAN team
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>
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 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 General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
25 *****************************************************************************/
27 /*****************************************************************************
28 * sout_instance_t: stream output thread descriptor
29 *****************************************************************************/
33 /****************************************************************************
34 * sout_instance_t: p_sout
35 ****************************************************************************/
36 struct sout_instance_t
43 /* meta data (Read only) XXX it won't be set before the first packet received */
46 int i_out_pace_nocontrol
; /* count of output that can't control the space */
49 sout_stream_t
*p_stream
;
52 sout_instance_sys_t
*p_sys
;
55 /****************************************************************************
56 * sout_stream_id_t: opaque (private for all sout_stream_t)
57 ****************************************************************************/
58 typedef struct sout_stream_id_t sout_stream_id_t
;
60 /****************************************************************************
61 * sout_packetizer_input_t: p_sout <-> p_packetizer
62 ****************************************************************************/
63 struct sout_packetizer_input_t
65 sout_instance_t
*p_sout
;
72 #define sout_NewInstance(a,b) __sout_NewInstance(VLC_OBJECT(a),b)
73 VLC_EXPORT( sout_instance_t
*, __sout_NewInstance
, ( vlc_object_t
*, char * ) );
74 VLC_EXPORT( void, sout_DeleteInstance
, ( sout_instance_t
* ) );
76 VLC_EXPORT( sout_packetizer_input_t
*, sout_InputNew
,( sout_instance_t
*, es_format_t
* ) );
77 VLC_EXPORT( int, sout_InputDelete
, ( sout_packetizer_input_t
* ) );
78 VLC_EXPORT( int, sout_InputSendBuffer
, ( sout_packetizer_input_t
*, block_t
* ) );
80 /****************************************************************************
82 ****************************************************************************/
83 struct sout_access_out_t
89 sout_instance_t
*p_sout
;
92 config_chain_t
*p_cfg
;
95 int64_t i_sent_bytes
; ///< This is a "local" counter that is reset each
96 // time it is transferred to stats
99 sout_access_out_sys_t
*p_sys
;
100 int (*pf_seek
)( sout_access_out_t
*, off_t
);
101 int (*pf_read
)( sout_access_out_t
*, block_t
* );
102 int (*pf_write
)( sout_access_out_t
*, block_t
* );
105 VLC_EXPORT( sout_access_out_t
*,sout_AccessOutNew
, ( sout_instance_t
*, char *psz_access
, char *psz_name
) );
106 VLC_EXPORT( void, sout_AccessOutDelete
, ( sout_access_out_t
* ) );
107 VLC_EXPORT( int, sout_AccessOutSeek
, ( sout_access_out_t
*, off_t
) );
108 VLC_EXPORT( int, sout_AccessOutRead
, ( sout_access_out_t
*, block_t
* ) );
109 VLC_EXPORT( int, sout_AccessOutWrite
, ( sout_access_out_t
*, block_t
* ) );
111 /****************************************************************************
113 ****************************************************************************/
119 sout_instance_t
*p_sout
;
122 config_chain_t
*p_cfg
;
124 sout_access_out_t
*p_access
;
126 int (*pf_addstream
)( sout_mux_t
*, sout_input_t
* );
127 int (*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 */
133 sout_input_t
**pp_inputs
;
137 sout_mux_sys_t
*p_sys
;
139 /* XXX private to stream_output.c */
140 /* if muxer doesn't support adding stream at any time then we first wait
141 * for stream then we refuse all stream and start muxing */
142 vlc_bool_t b_add_stream_any_time
;
143 vlc_bool_t b_waiting_stream
;
144 /* we wait one second after first stream added */
145 mtime_t i_add_stream_start
;
148 enum sout_mux_query_e
151 MUX_CAN_ADD_STREAM_WHILE_MUXING
, /* arg1= vlc_bool_t *, res=cannot fail */
153 MUX_GET_ADD_STREAM_WAIT
, /* arg1= vlc_bool_t *, res=cannot fail */
154 MUX_GET_MIME
, /* arg1= char ** res=can fail */
159 sout_instance_t
*p_sout
;
162 block_fifo_t
*p_fifo
;
168 VLC_EXPORT( sout_mux_t
*, sout_MuxNew
, ( sout_instance_t
*, char *, sout_access_out_t
* ) );
169 VLC_EXPORT( sout_input_t
*, sout_MuxAddStream
, ( sout_mux_t
*, es_format_t
* ) );
170 VLC_EXPORT( void, sout_MuxDeleteStream
, ( sout_mux_t
*, sout_input_t
* ) );
171 VLC_EXPORT( void, sout_MuxDelete
, ( sout_mux_t
* ) );
172 VLC_EXPORT( void, sout_MuxSendBuffer
, ( sout_mux_t
*, sout_input_t
*, block_t
* ) );
174 static inline int sout_MuxControl( sout_mux_t
*p_mux
, int i_query
, ... )
179 va_start( args
, i_query
);
180 i_result
= p_mux
->pf_control( p_mux
, i_query
, args
);
185 /****************************************************************************
187 ****************************************************************************/
193 sout_instance_t
*p_sout
;
196 config_chain_t
*p_cfg
;
199 /* Subpicture unit */
202 /* add, remove a stream */
203 sout_stream_id_t
*(*pf_add
)( sout_stream_t
*, es_format_t
* );
204 int (*pf_del
)( sout_stream_t
*, sout_stream_id_t
* );
205 /* manage a packet */
206 int (*pf_send
)( sout_stream_t
*, sout_stream_id_t
*, block_t
* );
209 sout_stream_sys_t
*p_sys
;
212 VLC_EXPORT( sout_stream_t
*, sout_StreamNew
, ( sout_instance_t
*, char *psz_chain
) );
213 VLC_EXPORT( void, sout_StreamDelete
, ( sout_stream_t
* ) );
215 static inline sout_stream_id_t
*sout_StreamIdAdd( sout_stream_t
*s
, es_format_t
*fmt
)
217 return s
->pf_add( s
, fmt
);
219 static inline int sout_StreamIdDel( sout_stream_t
*s
, sout_stream_id_t
*id
)
221 return s
->pf_del( s
, id
);
223 static inline int sout_StreamIdSend( sout_stream_t
*s
, sout_stream_id_t
*id
, block_t
*b
)
225 return s
->pf_send( s
, id
, b
);
228 /****************************************************************************
229 * Announce handler mess
230 ****************************************************************************/
231 struct sap_session_t
;
233 struct session_descriptor_t
239 int i_payload
; /* SAP Payload type */
243 sap_session_t
*p_sap
; /* If we have a sap session, remember it */
248 #define METHOD_TYPE_SAP 1
250 struct announce_method_t
256 /* A SAP session descriptor, enqueued in the SAP handler queue */
262 sap_address_t
*p_address
;
264 /* Last and next send */
269 /* The SAP handler, running in a separate thread */
272 VLC_COMMON_MEMBERS
/* needed to create a thread */
274 sap_session_t
**pp_sessions
;
275 sap_address_t
**pp_addresses
;
277 vlc_bool_t b_control
;
282 int i_current_session
;
284 int (*pf_add
) ( sap_handler_t
*, session_descriptor_t
*);
285 int (*pf_del
) ( sap_handler_t
*, session_descriptor_t
*);
287 /* private data, not in p_sys as there is one kind of sap_handler_t */
290 /* The main announce handler object */
291 struct announce_handler_t
295 sap_handler_t
*p_sap
;
300 /* Announce system */
301 VLC_EXPORT( int, sout_AnnounceRegister
, (sout_instance_t
*,session_descriptor_t
*, announce_method_t
* ) );
302 VLC_EXPORT(session_descriptor_t
*,sout_AnnounceRegisterSDP
, (sout_instance_t
*,const char *, const char *, announce_method_t
* ) );
303 VLC_EXPORT( int, sout_AnnounceUnRegister
, (sout_instance_t
*,session_descriptor_t
* ) );
305 VLC_EXPORT(session_descriptor_t
*,sout_AnnounceSessionCreate
, (void) );
306 VLC_EXPORT(void, sout_AnnounceSessionDestroy
, (session_descriptor_t
*) );
307 VLC_EXPORT(announce_method_t
*, sout_AnnounceMethodCreate
, (int) );
309 #define announce_HandlerCreate(a) __announce_HandlerCreate(VLC_OBJECT(a))
310 announce_handler_t
* __announce_HandlerCreate( vlc_object_t
*);
312 /* Private functions for the announce handler */
313 int announce_HandlerDestroy( announce_handler_t
* );
314 int announce_Register( announce_handler_t
*p_announce
,
315 session_descriptor_t
*p_session
,
316 announce_method_t
*p_method
);
317 int announce_UnRegister( announce_handler_t
*p_announce
,
318 session_descriptor_t
*p_session
);
320 sap_handler_t
*announce_SAPHandlerCreate( announce_handler_t
*p_announce
);
321 void announce_SAPHandlerDestroy( sap_handler_t
*p_sap
);