]> git.sesse.net Git - vlc/blobdiff - modules/stream_out/bridge.c
Handle removal
[vlc] / modules / stream_out / bridge.c
index 1b24f663d9ed15a7472f46a09b6b8806aa22d71f..fef9ef1f6c5fca9d87d4a2dafc5926856967bb54 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * bridge.c: bridge stream output module
  *****************************************************************************
- * Copyright (C) 2005 VideoLAN
+ * Copyright (C) 2005 the VideoLAN team
  * $Id$
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
@@ -136,7 +136,7 @@ static bridge_t *__GetBridge( vlc_object_t *p_object )
     else
     {
         p_bridge = val.p_address;
-    }    
+    }
 
     return p_bridge;
 }
@@ -286,6 +286,8 @@ static int DelOut( sout_stream_t *p_stream, sout_stream_id_t *id )
     p_es->b_changed = VLC_TRUE;
     vlc_mutex_unlock( p_sys->p_lock );
 
+    p_sys->b_inited = VLC_FALSE;
+
     return VLC_SUCCESS;
 }
 
@@ -427,11 +429,14 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id,
             b_no_es = VLC_FALSE;
 
         while ( p_bridge->pp_es[i]->p_block != NULL
-                 && (p_bridge->pp_es[i]->p_block->i_dts < mdate()
+                 && (p_bridge->pp_es[i]->p_block->i_dts + p_sys->i_delay
+                       < mdate()
                       || p_bridge->pp_es[i]->p_block->i_dts + p_sys->i_delay
                           < p_bridge->pp_es[i]->i_last) )
         {
             block_t *p_block = p_bridge->pp_es[i]->p_block;
+            msg_Dbg( p_stream, "dropping a packet (" I64Fd ")",
+                     mdate() - p_block->i_dts - p_sys->i_delay );
             p_bridge->pp_es[i]->p_block
                 = p_bridge->pp_es[i]->p_block->p_next;
             block_Release( p_block );
@@ -450,7 +455,9 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id,
             }
             else
             {
-                if ( p_bridge->pp_es[i]->p_block == NULL )
+                /* We need at least two packets to enter the mux. */
+                if ( p_bridge->pp_es[i]->p_block == NULL
+                      || p_bridge->pp_es[i]->p_block->p_next == NULL )
                 {
                     continue;
                 }
@@ -489,10 +496,9 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id,
         if ( p_bridge->pp_es[i]->id != NULL )
         {
             block_t *p_block = p_bridge->pp_es[i]->p_block;
-            p_bridge->pp_es[i]->i_last = p_bridge->pp_es[i]->p_block->i_dts
-                                   + p_bridge->pp_es[i]->p_block->i_length;
             while ( p_block != NULL )
             {
+                p_bridge->pp_es[i]->i_last = p_block->i_dts;
                 p_block->i_pts += p_sys->i_delay;
                 p_block->i_dts += p_sys->i_delay;
                 p_block = p_block->p_next;