X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmux%2Fdummy.c;h=a62b3587e8a44620813696c61d81b81a1c0b8fec;hb=a231c3bbae0374fea3c454e2b96afe44ee844a9b;hp=1900c46f4cc13ac6ff665dc6526e323a5f428698;hpb=453d866aa156b7faf0d87f8ffbf31f5f77748872;p=vlc diff --git a/modules/mux/dummy.c b/modules/mux/dummy.c index 1900c46f4c..a62b3587e8 100644 --- a/modules/mux/dummy.c +++ b/modules/mux/dummy.c @@ -1,8 +1,8 @@ /***************************************************************************** - * dummy.c + * dummy.c: dummy muxer module for vlc ***************************************************************************** - * Copyright (C) 2001, 2002 VideoLAN - * $Id: dummy.c,v 1.4 2003/02/24 12:34:29 fenrir Exp $ + * Copyright (C) 2001, 2002 the VideoLAN team + * $Id$ * * Authors: Laurent Aimar * Eric Petit @@ -19,65 +19,72 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#ifdef HAVE_UNISTD_H -# include -#elif defined( _MSC_VER ) && defined( _WIN32 ) && !defined( UNDER_CE ) -# include -#endif - -#include "codecs.h" -/***************************************************************************** - * Exported prototypes - *****************************************************************************/ -static int Open ( vlc_object_t * ); -static void Close ( vlc_object_t * ); +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif -static int Capability( int, void *, void * ); -static int AddStream( sout_instance_t *, sout_input_t * ); -static int DelStream( sout_instance_t *, sout_input_t * ); -static int Mux ( sout_instance_t * ); +#include +#include +#include +#include /***************************************************************************** * Module descriptor *****************************************************************************/ +static int Open ( vlc_object_t * ); +static void Close ( vlc_object_t * ); + vlc_module_begin(); - set_description( _("Dummy muxer") ); + set_description( N_("Dummy/Raw muxer") ); set_capability( "sout mux", 5 ); + set_category( CAT_SOUT ); + set_subcategory( SUBCAT_SOUT_MUX ); add_shortcut( "dummy" ); + add_shortcut( "raw" ); + add_shortcut( "es" ); set_callbacks( Open, Close ); vlc_module_end(); +/***************************************************************************** + * Exported prototypes + *****************************************************************************/ +static int Control( sout_mux_t *, int, va_list ); +static int AddStream( sout_mux_t *, sout_input_t * ); +static int DelStream( sout_mux_t *, sout_input_t * ); +static int Mux ( sout_mux_t * ); + +struct sout_mux_sys_t +{ + /* Some streams have special initialization data, we'll output this + * data as an header in the stream. */ + bool b_header; +}; + /***************************************************************************** * Open: *****************************************************************************/ static int Open( vlc_object_t *p_this ) { - sout_instance_t *p_sout = (sout_instance_t*)p_this; + sout_mux_t *p_mux = (sout_mux_t*)p_this; + sout_mux_sys_t *p_sys; - msg_Info( p_sout, "Open" ); + msg_Dbg( p_mux, "Dummy/Raw muxer opened" ); + msg_Info( p_mux, "Open" ); - p_sout->pf_mux_capacity = Capability; - p_sout->pf_mux_addstream = AddStream; - p_sout->pf_mux_delstream = DelStream; - p_sout->pf_mux = Mux; + p_mux->pf_control = Control; + p_mux->pf_addstream = AddStream; + p_mux->pf_delstream = DelStream; + p_mux->pf_mux = Mux; + + p_mux->p_sys = p_sys = malloc( sizeof( sout_mux_sys_t ) ); + p_sys->b_header = true; return VLC_SUCCESS; } @@ -88,57 +95,85 @@ static int Open( vlc_object_t *p_this ) static void Close( vlc_object_t * p_this ) { - sout_instance_t *p_sout = (sout_instance_t*)p_this; - msg_Info( p_sout, "Close" ); + sout_mux_t *p_mux = (sout_mux_t*)p_this; + sout_mux_sys_t *p_sys = p_mux->p_sys; + + msg_Dbg( p_mux, "Dummy/Raw muxer closed" ); + free( p_sys ); } -static int Capability( int i_query, void *p_args, void *p_answer ) +static int Control( sout_mux_t *p_mux, int i_query, va_list args ) { - switch( i_query ) - { - case SOUT_MUX_CAP_GET_ADD_STREAM_ANY_TIME: - *(vlc_bool_t*)p_answer = VLC_TRUE; - return( SOUT_MUX_CAP_ERR_OK ); + VLC_UNUSED(p_mux); + bool *pb_bool; + + switch( i_query ) + { + case MUX_CAN_ADD_STREAM_WHILE_MUXING: + pb_bool = (bool*)va_arg( args, bool * ); + *pb_bool = true; + return VLC_SUCCESS; + + case MUX_GET_ADD_STREAM_WAIT: + pb_bool = (bool*)va_arg( args, bool * ); + *pb_bool = false; + return VLC_SUCCESS; + + case MUX_GET_MIME: /* Unknown */ default: - return( SOUT_MUX_CAP_ERR_UNIMPLEMENTED ); + return VLC_EGENERIC; } } -static int AddStream( sout_instance_t *p_sout, sout_input_t *p_input ) +static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input ) { - msg_Dbg( p_sout, "adding input" ); - return( 0 ); + VLC_UNUSED(p_input); + msg_Dbg( p_mux, "adding input" ); + return VLC_SUCCESS; } -static int DelStream( sout_instance_t *p_sout, sout_input_t *p_input ) +static int DelStream( sout_mux_t *p_mux, sout_input_t *p_input ) { - - msg_Dbg( p_sout, "removing input" ); - return( 0 ); + VLC_UNUSED(p_input); + msg_Dbg( p_mux, "removing input" ); + return VLC_SUCCESS; } -static int Mux ( sout_instance_t *p_sout ) +static int Mux( sout_mux_t *p_mux ) { + sout_mux_sys_t *p_sys = p_mux->p_sys; int i; - for( i = 0; i < p_sout->i_nb_inputs; i++ ) + + for( i = 0; i < p_mux->i_nb_inputs; i++ ) { + block_fifo_t *p_fifo; int i_count; - sout_fifo_t *p_fifo; - p_fifo = p_sout->pp_inputs[i]->p_fifo; - i_count = p_fifo->i_depth; - while( i_count > 0 ) + if( p_sys->b_header && p_mux->pp_inputs[i]->p_fmt->i_extra ) { - sout_buffer_t *p_data; + /* Write header data */ + block_t *p_data; + p_data = block_New( p_mux, p_mux->pp_inputs[i]->p_fmt->i_extra ); + + memcpy( p_data->p_buffer, p_mux->pp_inputs[i]->p_fmt->p_extra, + p_mux->pp_inputs[i]->p_fmt->i_extra ); - p_data = sout_FifoGet( p_fifo ); + msg_Dbg( p_mux, "writing header data" ); + sout_AccessOutWrite( p_mux->p_access, p_data ); + } + + p_fifo = p_mux->pp_inputs[i]->p_fifo; + i_count = block_FifoCount( p_fifo ); + while( i_count > 0 ) + { + block_t *p_data = block_FifoGet( p_fifo ); - sout_AccessOutWrite( p_sout->p_access, p_data ); + sout_AccessOutWrite( p_mux->p_access, p_data ); i_count--; } - } - return( 0 ); -} + p_sys->b_header = false; + return VLC_SUCCESS; +}