[vlc-commits] mpeg/es demuxer : get last block out of the packetizer

Rafaël Carré git at videolan.org
Tue Sep 13 23:43:37 CEST 2011


vlc | branch: master | Rafaël Carré <funman at videolan.org> | Tue Sep 13 17:34:17 2011 -0400| [13d4cc70a7e97d5f9facc3d8df035fd037572634] | committer: Rafaël Carré

mpeg/es demuxer : get last block out of the packetizer

refs #3178

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=13d4cc70a7e97d5f9facc3d8df035fd037572634
---

 modules/demux/mpeg/es.c |   36 +++++++++++++++++++++---------------
 1 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/modules/demux/mpeg/es.c b/modules/demux/mpeg/es.c
index a66f9f6..e3db290 100644
--- a/modules/demux/mpeg/es.c
+++ b/modules/demux/mpeg/es.c
@@ -142,7 +142,7 @@ static int DtsInit( demux_t *p_demux );
 static int MlpProbe( demux_t *p_demux, int64_t *pi_offset );
 static int MlpInit( demux_t *p_demux );
 
-static int Parse( demux_t *p_demux, block_t **pp_output );
+static bool Parse( demux_t *p_demux, block_t **pp_output );
 
 static const codec_t p_codecs[] = {
     { VLC_CODEC_MP4A, false, "mp4 audio",  AacProbe,  AacInit },
@@ -256,13 +256,14 @@ static int OpenVideo( vlc_object_t *p_this )
  *****************************************************************************/
 static int Demux( demux_t *p_demux )
 {
+    int ret = 1;
     demux_sys_t *p_sys = p_demux->p_sys;
 
     block_t *p_block_out = p_sys->p_packetized_data;
     if( p_block_out )
         p_sys->p_packetized_data = NULL;
-    else if( Parse( p_demux, &p_block_out ) )
-        return 0;
+    else
+        ret = Parse( p_demux, &p_block_out ) ? 0 : 1;
 
     while( p_block_out )
     {
@@ -302,7 +303,7 @@ static int Demux( demux_t *p_demux )
 
         p_block_out = p_next;
     }
-    return 1;
+    return ret;
 }
 
 /*****************************************************************************
@@ -393,9 +394,10 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
 }
 
 /*****************************************************************************
- * Returned a link list of buffer of parsed data
+ * Makes a link list of buffer of parsed data
+ * Returns true if EOF
  *****************************************************************************/
-static int Parse( demux_t *p_demux, block_t **pp_output )
+static bool Parse( demux_t *p_demux, block_t **pp_output )
 {
     demux_sys_t *p_sys = p_demux->p_sys;
     block_t *p_block_in, *p_block_out;
@@ -410,19 +412,22 @@ static int Parse( demux_t *p_demux, block_t **pp_output )
             stream_Read( p_demux->s, NULL, 1 );
     }
 
-    if( ( p_block_in = stream_Block( p_demux->s, p_sys->i_packet_size ) ) == NULL )
-        return VLC_EGENERIC;
+    p_block_in = stream_Block( p_demux->s, p_sys->i_packet_size );
+    bool b_eof = p_block_in == NULL;
 
-    if( p_sys->codec.b_use_word && !p_sys->b_big_endian && p_block_in->i_buffer > 0 )
+    if( p_block_in )
     {
-        /* Convert to big endian */
-        swab( p_block_in->p_buffer, p_block_in->p_buffer, p_block_in->i_buffer );
-    }
+        if( p_sys->codec.b_use_word && !p_sys->b_big_endian && p_block_in->i_buffer > 0 )
+        {
+            /* Convert to big endian */
+            swab( p_block_in->p_buffer, p_block_in->p_buffer, p_block_in->i_buffer );
+        }
 
-    p_block_in->i_pts = p_block_in->i_dts = p_sys->b_start || p_sys->b_initial_sync_failed ? VLC_TS_0 : VLC_TS_INVALID;
+        p_block_in->i_pts = p_block_in->i_dts = p_sys->b_start || p_sys->b_initial_sync_failed ? VLC_TS_0 : VLC_TS_INVALID;
+    }
     p_sys->b_initial_sync_failed = p_sys->b_start; /* Only try to resync once */
 
-    while( ( p_block_out = p_sys->p_packetizer->pf_packetize( p_sys->p_packetizer, &p_block_in ) ) )
+    while( ( p_block_out = p_sys->p_packetizer->pf_packetize( p_sys->p_packetizer, p_block_in ? &p_block_in : NULL ) ) )
     {
         p_sys->b_initial_sync_failed = false;
         while( p_block_out )
@@ -462,7 +467,8 @@ static int Parse( demux_t *p_demux, block_t **pp_output )
     if( p_sys->b_initial_sync_failed )
         msg_Dbg( p_demux, "did not sync on first block" );
     p_sys->b_start = false;
-    return VLC_SUCCESS;
+
+    return b_eof;
 }
 
 /*****************************************************************************



More information about the vlc-commits mailing list