]> git.sesse.net Git - vlc/blobdiff - src/stream_output/stream_output.c
decoder: remove BLOCK_FLAG_CORE_EOS
[vlc] / src / stream_output / stream_output.c
index fc3589a2f0ec29bf4911e570f392bdfe3948c4ed..bfdda159df37fc99ea454fb12531aef45d27e3e6 100644 (file)
@@ -83,9 +83,11 @@ static void mrl_Clean( mrl_t *p_mrl );
 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] );
     }
@@ -128,6 +130,7 @@ sout_instance_t *sout_NewInstance( vlc_object_t *p_parent, const char *psz_dest
 
     FREENULL( p_sout->psz_sout );
 
+    vlc_mutex_destroy( &p_sout->lock );
     vlc_object_release( p_sout );
     return NULL;
 }
@@ -221,13 +224,6 @@ int sout_InputSendBuffer( sout_packetizer_input_t *p_input,
         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 );
@@ -437,7 +433,7 @@ void sout_MuxDelete( sout_mux_t *p_mux )
 /*****************************************************************************
  * 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;
 
@@ -454,7 +450,11 @@ sout_input_t *sout_MuxAddStream( sout_mux_t *p_mux, es_format_t *p_fmt )
     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;
 
@@ -490,10 +490,7 @@ void sout_MuxDeleteStream( sout_mux_t *p_mux, sout_input_t *p_input )
     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 );
@@ -504,6 +501,7 @@ void sout_MuxDeleteStream( sout_mux_t *p_mux, sout_input_t *p_input )
         }
 
         block_FifoRelease( p_input->p_fifo );
+        es_format_Clean( &p_input->fmt );
         free( p_input );
     }
 }
@@ -511,17 +509,18 @@ void sout_MuxDeleteStream( sout_mux_t *p_mux, sout_input_t *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 )
@@ -529,22 +528,22 @@ void sout_MuxSendBuffer( sout_mux_t *p_mux, sout_input_t *p_input,
         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;
@@ -554,7 +553,7 @@ int sout_MuxGetStream( sout_mux_t *p_mux, int i_blocks, mtime_t *pi_dts )
         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 )
             {
@@ -608,7 +607,7 @@ static int mrl_Parse( mrl_t *p_mrl, const char *psz_mrl )
             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",
@@ -717,9 +716,14 @@ static void mrl_Clean( mrl_t *p_mrl )
 /* 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 );
 
@@ -765,10 +769,11 @@ static sout_stream_t *sout_StreamNew( sout_instance_t *p_sout, char *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 );
 
@@ -785,6 +790,7 @@ static sout_stream_t *sout_StreamNew( sout_instance_t *p_sout, char *psz_name,
         return NULL;
     }
 
+    p_sout->i_out_pace_nocontrol += p_stream->pace_nocontrol;
     return p_stream;
 }