sout_instance_t *sout_NewInstance( vlc_object_t *p_parent, const char *psz_dest )
{
sout_instance_t *p_sout;
-
char *psz_chain;
- if( psz_dest && psz_dest[0] == '#' )
+
+ assert( psz_dest != NULL );
+
+ if( psz_dest[0] == '#' )
{
psz_chain = strdup( &psz_dest[1] );
}
FREENULL( p_sout->psz_sout );
+ vlc_mutex_destroy( &p_sout->lock );
vlc_object_release( p_sout );
return NULL;
}
return VLC_SUCCESS;
}
- if( p_buffer->i_dts <= VLC_TS_INVALID )
- {
- msg_Warn( p_sout, "trying to send non-dated packet to stream output!");
- block_Release( p_buffer );
- return VLC_SUCCESS;
- }
-
vlc_mutex_lock( &p_sout->lock );
i_ret = p_sout->p_stream->pf_send( p_sout->p_stream,
p_input->id, p_buffer );
/*****************************************************************************
* sout_MuxAddStream:
*****************************************************************************/
-sout_input_t *sout_MuxAddStream( sout_mux_t *p_mux, es_format_t *p_fmt )
+sout_input_t *sout_MuxAddStream( sout_mux_t *p_mux, const es_format_t *p_fmt )
{
sout_input_t *p_input;
p_input = malloc( sizeof( sout_input_t ) );
if( !p_input )
return NULL;
- p_input->p_fmt = p_fmt;
+
+ // FIXME: remove either fmt or p_fmt...
+ es_format_Copy( &p_input->fmt, p_fmt );
+ p_input->p_fmt = &p_input->fmt;
+
p_input->p_fifo = block_FifoNew();
p_input->p_sys = NULL;
TAB_FIND( p_mux->i_nb_inputs, p_mux->pp_inputs, p_input, i_index );
if( i_index >= 0 )
{
- if( p_mux->pf_delstream( p_mux, p_input ) < 0 )
- {
- msg_Err( p_mux, "cannot delete this stream from mux" );
- }
+ p_mux->pf_delstream( p_mux, p_input );
/* remove the entry */
TAB_REMOVE( p_mux->i_nb_inputs, p_mux->pp_inputs, p_input );
}
block_FifoRelease( p_input->p_fifo );
+ es_format_Clean( &p_input->fmt );
free( p_input );
}
}
/*****************************************************************************
* sout_MuxSendBuffer:
*****************************************************************************/
-void sout_MuxSendBuffer( sout_mux_t *p_mux, sout_input_t *p_input,
+int sout_MuxSendBuffer( sout_mux_t *p_mux, sout_input_t *p_input,
block_t *p_buffer )
{
+ mtime_t i_dts = p_buffer->i_dts;
block_FifoPut( p_input->p_fifo, p_buffer );
if( p_mux->p_sout->i_out_pace_nocontrol )
{
mtime_t current_date = mdate();
- if ( current_date > p_buffer->i_dts )
+ if ( current_date > i_dts )
msg_Warn( p_mux, "late buffer for mux input (%"PRId64")",
- current_date - p_buffer->i_dts );
+ current_date - i_dts );
}
if( p_mux->b_waiting_stream )
const int64_t i_caching = var_GetInteger( p_mux->p_sout, "sout-mux-caching" ) * INT64_C(1000);
if( p_mux->i_add_stream_start < 0 )
- p_mux->i_add_stream_start = p_buffer->i_dts;
+ p_mux->i_add_stream_start = i_dts;
/* Wait until we have enought data before muxing */
if( p_mux->i_add_stream_start < 0 ||
- p_buffer->i_dts < p_mux->i_add_stream_start + i_caching )
- return;
+ i_dts < p_mux->i_add_stream_start + i_caching )
+ return VLC_SUCCESS;
p_mux->b_waiting_stream = false;
}
- p_mux->pf_mux( p_mux );
+ return p_mux->pf_mux( p_mux );
}
/*****************************************************************************
* sout_MuxGetStream: find stream to be muxed
*****************************************************************************/
-int sout_MuxGetStream( sout_mux_t *p_mux, int i_blocks, mtime_t *pi_dts )
+int sout_MuxGetStream( sout_mux_t *p_mux, unsigned i_blocks, mtime_t *pi_dts )
{
mtime_t i_dts = 0;
int i_stream = -1;
sout_input_t *p_input = p_mux->pp_inputs[i];
block_t *p_data;
- if( block_FifoCount( p_input->p_fifo ) < i_blocks )
+ if( (!p_mux->b_add_stream_any_time) && block_FifoCount( p_input->p_fifo ) < i_blocks )
{
if( p_input->p_fmt->i_cat != SPU_ES )
{
psz_parser++;
}
}
-#if defined( WIN32 ) || defined( __OS2__ )
+#if defined( _WIN32 ) || defined( __OS2__ )
if( psz_parser - psz_dup == 1 )
{
/* msg_Warn( p_sout, "drive letter %c: found in source string",
/* Destroy a "stream_out" module */
static void sout_StreamDelete( sout_stream_t *p_stream )
{
+ sout_instance_t *p_sout = (sout_instance_t *)(p_stream->p_parent);
+
msg_Dbg( p_stream, "destroying chain... (name=%s)", p_stream->psz_name );
- if( p_stream->p_module ) module_unneed( p_stream, p_stream->p_module );
+ p_sout->i_out_pace_nocontrol -= p_stream->pace_nocontrol;
+
+ if( p_stream->p_module != NULL )
+ module_unneed( p_stream, p_stream->p_module );
FREENULL( p_stream->psz_name );
return NULL;
p_stream->p_sout = p_sout;
- p_stream->p_sys = NULL;
p_stream->psz_name = psz_name;
p_stream->p_cfg = p_cfg;
p_stream->p_next = p_next;
+ p_stream->pace_nocontrol = false;
+ p_stream->p_sys = NULL;
msg_Dbg( p_sout, "stream=`%s'", p_stream->psz_name );
return NULL;
}
+ p_sout->i_out_pace_nocontrol += p_stream->pace_nocontrol;
return p_stream;
}