Clean up mpga demuxer and properly fix #1081 (ie without segfault).
authorLaurent Aimar <fenrir@videolan.org>
Mon, 25 Aug 2008 00:15:52 +0000 (02:15 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Mon, 25 Aug 2008 10:41:07 +0000 (12:41 +0200)
modules/demux/mpeg/mpga.c

index 3e45ce5..f920f91 100644 (file)
@@ -77,7 +77,6 @@ struct demux_sys_t
     int i_xing_bytes;
     int i_xing_bitrate_avg;
     int i_xing_frame_samples;
-    block_t *p_block_in, *p_block_out;
 };
 
 static int HeaderCheck( uint32_t h )
@@ -113,7 +112,6 @@ static int mpga_frame_samples( uint32_t h )
     }
 }
 
-
 /*****************************************************************************
  * Open: initializes demux structures
  *****************************************************************************/
@@ -125,7 +123,6 @@ static int Open( vlc_object_t * p_this )
 
     uint32_t     header;
     const uint8_t     *p_peek;
-    block_t     *p_block_in, *p_block_out;
 
     if( demux_IsPathExtension( p_demux, ".mp3" ) )
         b_forced = true;
@@ -224,24 +221,6 @@ static int Open( vlc_object_t * p_this )
         }
     }
 
-    if( ( p_block_in = stream_Block( p_demux->s, MPGA_PACKET_SIZE ) ) == NULL )
-    {
-        return VLC_EGENERIC;
-    }
-    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 = true;
-    }
-    else
-        p_sys->b_initial_sync_failed = false;
-
-    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 )
     {
@@ -250,13 +229,6 @@ static int Open( vlc_object_t * p_this )
             p_sys->i_xing_frames / p_sys->i_xing_frame_samples;
     }
 
-    p_sys->p_block_in = p_block_in;
-    p_sys->p_block_out = p_block_out;
-
-    /* */
-    p_sys->p_packetizer->fmt_out.b_packetized = true;
-    p_sys->p_es = es_out_Add( p_demux->out,
-                              &p_sys->p_packetizer->fmt_out);
     return VLC_SUCCESS;
 }
 
@@ -269,40 +241,32 @@ static int Demux( demux_t *p_demux )
 {
     demux_sys_t *p_sys = p_demux->p_sys;
     block_t *p_block_in, *p_block_out;
-    if( p_sys->b_start )
-    {
-        p_sys->b_start = false;
-        p_block_in = p_sys->p_block_in;
-        p_sys->p_block_in = NULL;
-        p_block_out = p_sys->p_block_out;
-        p_sys->p_block_out = NULL;
-    }
-    else
+
+    if( ( p_block_in = stream_Block( p_demux->s, MPGA_PACKET_SIZE ) ) == NULL )
     {
-        if( ( p_block_in = stream_Block( p_demux->s, MPGA_PACKET_SIZE ) )
-            == NULL )
-        {
-            return 0;
-        }
-        if( p_demux->p_sys->b_initial_sync_failed == 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 );
+        return 0;
     }
 
+    p_block_in->i_pts = p_block_in->i_dts = p_sys->b_start || p_sys->b_initial_sync_failed ? 1 : 0;
+    p_sys->b_initial_sync_failed = p_sys->b_start; /* Only try to resync once */
 
-    while( p_block_out )
+    while( ( p_block_out = p_sys->p_packetizer->pf_packetize( p_sys->p_packetizer, &p_block_in ) ) )
     {
+        p_sys->b_initial_sync_failed = false;
         while( p_block_out )
         {
             block_t *p_next = p_block_out->p_next;
 
+            if( !p_sys->p_es )
+            {
+                p_sys->p_packetizer->fmt_out.b_packetized = true;
+                p_sys->p_es = es_out_Add( p_demux->out,
+                                          &p_sys->p_packetizer->fmt_out);
+
+                if( p_sys->i_bitrate_avg <= 0 )
+                    p_sys->i_bitrate_avg = p_sys->p_packetizer->fmt_out.i_bitrate;
+            }
+
             p_sys->i_pts = p_block_out->i_pts;
 
             /* Correct timestamp */
@@ -315,9 +279,11 @@ static int Demux( demux_t *p_demux )
 
             p_block_out = p_next;
         }
-        p_block_out = p_sys->p_packetizer->pf_packetize(
-            p_sys->p_packetizer, &p_block_in );
     }
+
+    if( p_sys->b_initial_sync_failed )
+        msg_Dbg( p_demux, "did not sync on first block" );
+    p_sys->b_start = false;
     return 1;
 }
 
@@ -330,7 +296,6 @@ static void Close( vlc_object_t * p_this )
     demux_sys_t *p_sys = p_demux->p_sys;
 
     DESTROY_PACKETIZER( p_sys->p_packetizer );
-    if( p_sys->p_block_out ) block_Release( p_sys->p_block_out );
 
     free( p_sys );
 }