]> git.sesse.net Git - vlc/commitdiff
Retry syncing mpeg audio stream if it failed on first block (Closes:#609)
authorClément Stenac <zorglub@videolan.org>
Sat, 25 Mar 2006 15:39:09 +0000 (15:39 +0000)
committerClément Stenac <zorglub@videolan.org>
Sat, 25 Mar 2006 15:39:09 +0000 (15:39 +0000)
modules/demux/mpeg/mpga.c

index 92f78b54dbb185af283d5531ddb3fdc334957af0..4d14fc74cee875a622f3a8a22e24de3ee1caf296 100644 (file)
@@ -68,6 +68,8 @@ struct demux_sys_t
     mtime_t     i_time_offset;
     int         i_bitrate_avg;  /* extracted from Xing header */
 
+    vlc_bool_t b_initial_sync_failed;
+
     int i_xing_frames;
     int i_xing_bytes;
     int i_xing_bitrate_avg;
@@ -108,6 +110,7 @@ static int mpga_frame_samples( uint32_t h )
     }
 }
 
+
 /*****************************************************************************
  * Open: initializes demux structures
  *****************************************************************************/
@@ -252,12 +255,20 @@ static int Open( vlc_object_t * p_this )
     p_block_in->i_pts = p_block_in->i_dts = 1;
     p_block_out = p_sys->p_packetizer->pf_packetize(
         p_sys->p_packetizer, &p_block_in );
-    
+
+    if( p_block_out == NULL )
+    {
+        msg_Dbg( p_demux, "did not sync on first block" );
+        p_sys->b_initial_sync_failed = VLC_TRUE;
+    }
+    else
+        p_sys->b_initial_sync_failed = VLC_FALSE;
+
     p_sys->p_packetizer->fmt_out.b_packetized = VLC_TRUE;
     p_sys->p_es = es_out_Add( p_demux->out,
                               &p_sys->p_packetizer->fmt_out);
     p_sys->i_bitrate_avg = p_sys->p_packetizer->fmt_out.i_bitrate;
-    
+
     if( p_sys->i_xing_bytes && p_sys->i_xing_frames &&
         p_sys->i_xing_frame_samples )
     {
@@ -302,7 +313,14 @@ static int Demux( demux_t *p_demux )
         {
             return 0;
         }
-        p_block_in->i_pts = p_block_in->i_dts = 0;
+        if( p_demux->p_sys->b_initial_sync_failed == VLC_TRUE )
+        {
+            p_block_in->i_pts = p_block_in->i_dts = 1;
+            /* Only try to resync once */
+            p_demux->p_sys->b_initial_sync_failed = 0;
+        }
+        else
+            p_block_in->i_pts = p_block_in->i_dts = 0;
         p_block_out = p_sys->p_packetizer->pf_packetize(
             p_sys->p_packetizer, &p_block_in );
     }