- break;
- }
- }
-
- if( !p_sout )
- {
- msg_Err( p_this, "cannot find any stream ouput" );
- return( NULL );
- }
- msg_Dbg( p_sout, "adding a new input" );
-
- /* *** create a packetizer input *** */
- p_input = malloc( sizeof( sout_packetizer_input_t ) );
- p_input->p_sout = p_sout;
- p_input->i_nb_inputs = 0;
- p_input->pp_inputs = NULL;
- p_input->i_nb_mux = 0;
- p_input->pp_mux = NULL;
- memcpy( &p_input->input_format,
- p_format,
- sizeof( sout_packet_format_t ) );
-
- if( p_format->i_fourcc == VLC_FOURCC( 'n', 'u', 'l', 'l' ) )
- {
- vlc_object_release( p_sout );
- return p_input;
- }
-
- vlc_mutex_lock( &p_sout->lock );
- /* *** add this input to all muxers *** */
- for( i_mux = 0; i_mux < p_sout->i_nb_mux; i_mux++ )
- {
- sout_input_t *p_mux_input;
-#define p_mux p_sout->pp_mux[i_mux]
-
- p_mux_input = MuxAddStream( p_mux, p_format );
- if( p_mux_input )
- {
- TAB_APPEND( p_input->i_nb_inputs, p_input->pp_inputs, p_mux_input );
- TAB_APPEND( p_input->i_nb_mux, p_input->pp_mux, p_mux );
-
- b_accepted = VLC_TRUE;
- }
-#undef p_mux
- }
-
- if( !b_accepted )
- {
- /* all muxer refuse this stream, so delete it */
- free( p_input );
-
- vlc_mutex_unlock( &p_sout->lock );
- vlc_object_release( p_sout );
- return( NULL );
- }
-
- TAB_APPEND( p_sout->i_nb_inputs, p_sout->pp_inputs, p_input );
- vlc_mutex_unlock( &p_sout->lock );
-
- vlc_object_release( p_sout );
-
- return( p_input );
-}
-
-
-int sout_InputDelete( sout_packetizer_input_t *p_input )
-{
- sout_instance_t *p_sout = p_input->p_sout;
- int i_input;
-
- msg_Dbg( p_sout, "removing an input" );
-
- vlc_mutex_lock( &p_sout->lock );
-
- /* *** remove this input to all muxers *** */
- for( i_input = 0; i_input < p_input->i_nb_inputs; i_input++ )
- {
- MuxDeleteStream( p_input->pp_mux[i_input], p_input->pp_inputs[i_input] );
- }
-
- TAB_REMOVE( p_sout->i_nb_inputs, p_sout->pp_inputs, p_input );
-
- free( p_input->pp_inputs );
- free( p_input->pp_mux );
-
- free( p_input );
-
- vlc_mutex_unlock( &p_sout->lock );
- return( 0 );
-}
-
-
-int sout_InputSendBuffer( sout_packetizer_input_t *p_input, sout_buffer_t *p_buffer )
-{
-// sout_instance_sys_t *p_sys = p_input->p_sout->p_sys;
-/* msg_Dbg( p_input->p_sout,
- "send buffer, size:%d", p_buffer->i_size ); */
-
- if( p_input->input_format.i_fourcc != VLC_FOURCC( 'n', 'u', 'l', 'l' ) &&
- p_input->i_nb_inputs > 0 )
- {
- int i;
-
- vlc_mutex_lock( &p_input->p_sout->lock );
- for( i = 0; i < p_input->i_nb_inputs - 1; i++ )
- {
- sout_buffer_t *p_dup;
-
- p_dup = sout_BufferDuplicate( p_input->p_sout, p_buffer );
-
- MuxSendBuffer( p_input->pp_mux[i],
- p_input->pp_inputs[i],
- p_dup );
- }
- MuxSendBuffer( p_input->pp_mux[p_input->i_nb_inputs-1],
- p_input->pp_inputs[p_input->i_nb_inputs-1],
- p_buffer );
-
- vlc_mutex_unlock( &p_input->p_sout->lock );
- }
- else
- {
- sout_BufferDelete( p_input->p_sout, p_buffer );
- }
- return( 0 );
-}
-
-sout_fifo_t *sout_FifoCreate( sout_instance_t *p_sout )
-{
- sout_fifo_t *p_fifo;
-
- if( !( p_fifo = malloc( sizeof( sout_fifo_t ) ) ) )
- {
- return( NULL );
- }
-
- vlc_mutex_init( p_sout, &p_fifo->lock );
- vlc_cond_init ( p_sout, &p_fifo->wait );
- p_fifo->i_depth = 0;
- p_fifo->p_first = NULL;
- p_fifo->pp_last = &p_fifo->p_first;
-
- return( p_fifo );
-}
-
-void sout_FifoFree( sout_instance_t *p_sout, sout_fifo_t *p_fifo )
-{
- sout_buffer_t *p_buffer;
-
- vlc_mutex_lock( &p_fifo->lock );
- p_buffer = p_fifo->p_first;
- while( p_buffer )
- {
- sout_buffer_t *p_next;
- p_next = p_buffer->p_next;
- sout_BufferDelete( p_sout, p_buffer );
- p_buffer = p_next;
- }
- vlc_mutex_unlock( &p_fifo->lock );
-
- return;
-}
-void sout_FifoDestroy( sout_instance_t *p_sout, sout_fifo_t *p_fifo )
-{
- sout_FifoFree( p_sout, p_fifo );
- vlc_mutex_destroy( &p_fifo->lock );
- vlc_cond_destroy ( &p_fifo->wait );
-
- free( p_fifo );
-}
-
-void sout_FifoPut( sout_fifo_t *p_fifo, sout_buffer_t *p_buffer )
-{
- vlc_mutex_lock( &p_fifo->lock );
-
- do
- {
- *p_fifo->pp_last = p_buffer;
- p_fifo->pp_last = &p_buffer->p_next;
- p_fifo->i_depth++;
-
- p_buffer = p_buffer->p_next;
-
- } while( p_buffer );
-
- /* warm there is data in this fifo */
- vlc_cond_signal( &p_fifo->wait );
- vlc_mutex_unlock( &p_fifo->lock );
-}
-
-sout_buffer_t *sout_FifoGet( sout_fifo_t *p_fifo )
-{
- sout_buffer_t *p_buffer;
-
- vlc_mutex_lock( &p_fifo->lock );
-
- if( p_fifo->p_first == NULL )
- {
- vlc_cond_wait( &p_fifo->wait, &p_fifo->lock );
- }
-
- p_buffer = p_fifo->p_first;
-
- p_fifo->p_first = p_buffer->p_next;
- p_fifo->i_depth--;
-
- if( p_fifo->p_first == NULL )
- {
- p_fifo->pp_last = &p_fifo->p_first;
- }
-
- vlc_mutex_unlock( &p_fifo->lock );
-
- p_buffer->p_next = NULL;
- return( p_buffer );
-}
-
-sout_buffer_t *sout_FifoShow( sout_fifo_t *p_fifo )
-{
- sout_buffer_t *p_buffer;
-
- vlc_mutex_lock( &p_fifo->lock );
-
- if( p_fifo->p_first == NULL )
- {
- vlc_cond_wait( &p_fifo->wait, &p_fifo->lock );
- }
-
- p_buffer = p_fifo->p_first;
-
- vlc_mutex_unlock( &p_fifo->lock );
-
- return( p_buffer );
-}
-
-sout_buffer_t *sout_BufferNew( sout_instance_t *p_sout, size_t i_size )
-{
- sout_buffer_t *p_buffer;
- size_t i_preheader;
-
-#ifdef DEBUG_BUFFER
- msg_Dbg( p_sout, "allocating an new buffer, size:%d", (uint32_t)i_size );
-#endif
-
- p_buffer = malloc( sizeof( sout_buffer_t ) );
- i_preheader = p_sout->i_preheader;
-
- if( i_size > 0 )
- {
- p_buffer->p_allocated_buffer = malloc( i_size + i_preheader );
- p_buffer->p_buffer = p_buffer->p_allocated_buffer + i_preheader;
- }
- else
- {
- p_buffer->p_allocated_buffer = NULL;
- p_buffer->p_buffer = NULL;
- }
- p_buffer->i_allocated_size = i_size + i_preheader;
- p_buffer->i_buffer_size = i_size;
-
- p_buffer->i_size = i_size;
- p_buffer->i_length = 0;
- p_buffer->i_dts = 0;
- p_buffer->i_pts = 0;
- p_buffer->i_bitrate = 0;
- p_buffer->i_flags = 0x0000;
- p_buffer->p_next = NULL;
-
- return( p_buffer );
-}
-int sout_BufferRealloc( sout_instance_t *p_sout, sout_buffer_t *p_buffer, size_t i_size )
-{
- size_t i_preheader;
-
-#ifdef DEBUG_BUFFER
- msg_Dbg( p_sout,
- "realloc buffer old size:%d new size:%d",
- (uint32_t)p_buffer->i_allocated_size,
- (uint32_t)i_size );
-#endif
-
- i_preheader = p_buffer->p_buffer - p_buffer->p_allocated_buffer;
-
- if( !( p_buffer->p_allocated_buffer = realloc( p_buffer->p_allocated_buffer, i_size + i_preheader ) ) )
- {
- msg_Err( p_sout, "realloc failed" );
- p_buffer->i_allocated_size = 0;
- p_buffer->i_buffer_size = 0;
- p_buffer->i_size = 0;
- p_buffer->p_buffer = NULL;
- return( -1 );
- }
- p_buffer->p_buffer = p_buffer->p_allocated_buffer + i_preheader;
-
- p_buffer->i_allocated_size = i_size + i_preheader;
- p_buffer->i_buffer_size = i_size;
-
- return( 0 );
-}
-
-int sout_BufferReallocFromPreHeader( sout_instance_t *p_sout, sout_buffer_t *p_buffer, size_t i_size )
-{
- size_t i_preheader;
-
- i_preheader = p_buffer->p_buffer - p_buffer->p_allocated_buffer;
-
- if( i_preheader < i_size )
- {
- return( -1 );
- }
-
- p_buffer->p_buffer -= i_size;
- p_buffer->i_size += i_size;
- p_buffer->i_buffer_size += i_size;
-
- return( 0 );
-}
-
-int sout_BufferDelete( sout_instance_t *p_sout, sout_buffer_t *p_buffer )
-{
-#ifdef DEBUG_BUFFER
- msg_Dbg( p_sout, "freeing buffer, size:%d", p_buffer->i_size );
-#endif
- if( p_buffer->p_allocated_buffer )
- {
- free( p_buffer->p_allocated_buffer );
- }
- free( p_buffer );
- return( 0 );
-}
-
-sout_buffer_t *sout_BufferDuplicate( sout_instance_t *p_sout,
- sout_buffer_t *p_buffer )
-{
- sout_buffer_t *p_dup;
-
- p_dup = sout_BufferNew( p_sout, p_buffer->i_size );
-
- p_dup->i_bitrate= p_buffer->i_bitrate;
- p_dup->i_dts = p_buffer->i_dts;
- p_dup->i_pts = p_buffer->i_pts;
- p_dup->i_length = p_buffer->i_length;
- p_dup->i_flags = p_buffer->i_flags;
- p_sout->p_vlc->pf_memcpy( p_dup->p_buffer, p_buffer->p_buffer, p_buffer->i_size );
-
- return( p_dup );
-}
-
-void sout_BufferChain( sout_buffer_t **pp_chain,
- sout_buffer_t *p_buffer )
-{
- if( *pp_chain == NULL )
- {
- *pp_chain = p_buffer;
- }
- else if( p_buffer != NULL )
- {
- sout_buffer_t *p = *pp_chain;
-
- while( p->p_next )
- {
- p = p->p_next;
- }
-
- p->p_next = p_buffer;
- }
-}
-
-#if 0
-static int mrl_ParseOptions( mrl_option_t **pp_opt, char *psz_options )
-{
- mrl_option_t **pp_last = pp_opt;
-
- char *psz_parser = strdup( psz_options );
-
- *pp_last = NULL;
-
- if( *psz_parser == '=' )
- {
- free( psz_parser );
- return( VLC_EGENERIC );
- }
- if( *psz_parser == '{' )
- {
- free( psz_parser );
- }
-
- for( ;; )
- {
- char *psz_end;
- mrl_option_t opt;
-
- /* skip space */
- while( *psz_parser && ( *psz_parser == ' ' || *psz_parser == '\t' || *psz_parser == ';' ) )
- {
- psz_parser++;
- }
-
- if( ( psz_end = strchr( psz_parser, '=' ) ) != NULL )
- {
- opt.p_next = NULL;
-
- while( psz_end > psz_parser && ( *psz_end == ' ' || *psz_end == '\t' ) )
- {
- psz_end--;
- }
-
- if( psz_end - psz_parser <= 0 )
- {
- return( VLC_EGENERIC );
- }
-
- *psz_end = '\0';
- opt.psz_name = strdup( psz_parser );
-
- psz_parser = psz_end + 1;
- if( ( psz_end = strchr( psz_parser, ';' ) ) == NULL &&
- ( psz_end = strchr( psz_parser, '}' ) ) == NULL )
- {
- psz_end = psz_parser + strlen( psz_parser ) + 1;
- }
-
- opt.psz_value = strdup( psz_parser );
-
- fprintf( stderr, "option: name=`%s' value=`%s'\n",
- opt.psz_name,
- opt.psz_value );
- psz_parser = psz_end + 1;
-
- *pp_last = malloc( sizeof( mrl_option_t ) );
- **pp_last = opt;
- }
- else
- {
- break;
- }
- }
-}
-#endif
-
-static int mrl_Parse( mrl_t *p_mrl, char *psz_mrl )
-{
- char * psz_dup = strdup( psz_mrl );
- char * psz_parser = psz_dup;
- char * psz_access = "";
- char * psz_way = "";
- char * psz_name = "";
-
- /* *** first parse psz_dest */
- while( *psz_parser && *psz_parser != ':' )
- {
- if( *psz_parser == '{' )
- {
- while( *psz_parser && *psz_parser != '}' )
- {
- psz_parser++;
- }
- if( *psz_parser )
- {
- psz_parser++;
- }
- }
- else
- {
- psz_parser++;