[vlc-commits] demux: mp4: split track init/setup/clean

Francois Cartegnie git at videolan.org
Sat Apr 29 15:08:28 CEST 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Sat Apr 29 12:19:19 2017 +0200| [558d1a74faf0e12eddf3268b862363cdd12a952c] | committer: Francois Cartegnie

demux: mp4: split track init/setup/clean

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

 modules/demux/mp4/mp4.c | 59 +++++++++++++++++++++++++++++--------------------
 1 file changed, 35 insertions(+), 24 deletions(-)

diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
index d94df9983d..8b8b812a1e 100644
--- a/modules/demux/mp4/mp4.c
+++ b/modules/demux/mp4/mp4.c
@@ -136,8 +136,9 @@ struct demux_sys_t
 /*****************************************************************************
  * Declaration of local function
  *****************************************************************************/
-static void MP4_TrackCreate ( demux_t *, mp4_track_t *, MP4_Box_t  *, bool, bool );
-static void MP4_TrackDestroy( demux_t *, mp4_track_t * );
+static void MP4_TrackSetup( demux_t *, mp4_track_t *, MP4_Box_t  *, bool, bool );
+static void MP4_TrackInit( mp4_track_t * );
+static void MP4_TrackClean( es_out_t *, mp4_track_t * );
 
 static void MP4_Block_Send( demux_t *, mp4_track_t *, block_t * );
 
@@ -385,15 +386,21 @@ LoadInitFragError:
     return VLC_EGENERIC;
 }
 
-static int AllocateTracks( demux_t *p_demux, unsigned i_tracks )
+static int CreateTracks( demux_t *p_demux, unsigned i_tracks )
 {
     demux_sys_t *p_sys = p_demux->p_sys;
 
-    p_sys->track = calloc( i_tracks, sizeof( mp4_track_t ) );
+    if( SIZE_MAX / i_tracks < sizeof(mp4_track_t) )
+        return VLC_EGENERIC;
+
+    p_sys->track = malloc( i_tracks * sizeof(mp4_track_t)  );
     if( p_sys->track == NULL )
         return VLC_ENOMEM;
     p_sys->i_tracks = i_tracks;
 
+    for( unsigned i=0; i<i_tracks; i++ )
+        MP4_TrackInit( &p_sys->track[i] );
+
     return VLC_SUCCESS;
 }
 
@@ -892,7 +899,7 @@ static int Open( vlc_object_t * p_this )
     }
     msg_Dbg( p_demux, "found %u track%c", i_tracks, i_tracks ? 's':' ' );
 
-    if( AllocateTracks( p_demux, i_tracks ) != VLC_SUCCESS )
+    if( CreateTracks( p_demux, i_tracks ) != VLC_SUCCESS )
         goto error;
 
     /* Search the first chap reference (like quicktime) and
@@ -918,7 +925,7 @@ static int Open( vlc_object_t * p_this )
     for( i = 0; i < p_sys->i_tracks; i++ )
     {
         p_trak = MP4_BoxGet( p_sys->p_root, "/moov/trak[%d]", i );
-        MP4_TrackCreate( p_demux, &p_sys->track[i], p_trak, true, !b_enabled_es );
+        MP4_TrackSetup( p_demux, &p_sys->track[i], p_trak, true, !b_enabled_es );
 
         if( p_sys->track[i].b_ok && !p_sys->track[i].b_chapters_source )
         {
@@ -1032,12 +1039,13 @@ static int Open( vlc_object_t * p_this )
 
 error:
     if( vlc_stream_Tell( p_demux->s ) > 0 )
-        vlc_stream_Seek( p_demux->s, 0 );
+    {
+        if( vlc_stream_Seek( p_demux->s, 0 ) != VLC_SUCCESS )
+            msg_Warn( p_demux, "Can't reset stream position from probing" );
+    }
 
-    if( p_sys->p_root )
-        MP4_BoxFree( p_sys->p_root );
+    Close( p_this );
 
-    free( p_sys );
     return VLC_EGENERIC;
 }
 
@@ -1943,20 +1951,19 @@ static void Close ( vlc_object_t * p_this )
 
     msg_Dbg( p_demux, "freeing all memory" );
 
+    LeafResetContext( p_sys );
+
     MP4_BoxFree( p_sys->p_root );
-    for( i_track = 0; i_track < p_sys->i_tracks; i_track++ )
-    {
-        MP4_TrackDestroy( p_demux, &p_sys->track[i_track] );
-    }
 
     if( p_sys->p_title )
         vlc_input_title_Delete( p_sys->p_title );
 
     MP4_Fragments_Index_Delete( p_sys->p_fragsindex );
 
-    LeafResetContext( p_sys );
-
+    for( i_track = 0; i_track < p_sys->i_tracks; i_track++ )
+        MP4_TrackClean( p_demux->out, &p_sys->track[i_track] );
     free( p_sys->track );
+
     free( p_sys );
 }
 
@@ -3002,12 +3009,12 @@ static void MP4_TrackRestart( demux_t *p_demux, mp4_track_t *p_track,
 }
 #endif
 /****************************************************************************
- * MP4_TrackCreate:
+ * MP4_TrackSetup:
  ****************************************************************************
  * Parse track information and create all needed data to run a track
  * If it succeed b_ok is set to 1 else to 0
  ****************************************************************************/
-static void MP4_TrackCreate( demux_t *p_demux, mp4_track_t *p_track,
+static void MP4_TrackSetup( demux_t *p_demux, mp4_track_t *p_track,
                              MP4_Box_t *p_box_trak,
                              bool b_create_es, bool b_force_enable )
 {
@@ -3018,8 +3025,6 @@ static void MP4_TrackCreate( demux_t *p_demux, mp4_track_t *p_track,
     char language[4] = { '\0' };
     char sdp_media_type[8] = { '\0' };
 
-    es_format_Init( &p_track->fmt, UNKNOWN_ES, 0 );
-
     const MP4_Box_t *p_tkhd = MP4_BoxGet( p_box_trak, "tkhd" );
     if( !p_tkhd )
     {
@@ -3292,16 +3297,16 @@ static void DestroyChunk( mp4_chunk_t *ck )
 }
 
 /****************************************************************************
- * MP4_TrackDestroy:
+ * MP4_TrackClean:
  ****************************************************************************
- * Destroy a track created by MP4_TrackCreate.
+ * Cleans a track created by MP4_TrackCreate.
  ****************************************************************************/
-static void MP4_TrackDestroy( demux_t *p_demux, mp4_track_t *p_track )
+static void MP4_TrackClean( es_out_t *out, mp4_track_t *p_track )
 {
     es_format_Clean( &p_track->fmt );
 
     if( p_track->p_es )
-        es_out_Del( p_demux->out, p_track->p_es );
+        es_out_Del( out, p_track->p_es );
 
     if( p_track->chunk )
     {
@@ -3317,6 +3322,12 @@ static void MP4_TrackDestroy( demux_t *p_demux, mp4_track_t *p_track )
         block_ChainRelease( p_track->asfinfo.p_frame );
 }
 
+static void MP4_TrackInit( mp4_track_t *p_track )
+{
+    memset( p_track, 0, sizeof(mp4_track_t) );
+    es_format_Init( &p_track->fmt, 0, 0 );
+}
+
 static void MP4_TrackSelect( demux_t *p_demux, mp4_track_t *p_track, bool b_select )
 {
     if( !p_track->b_ok || p_track->b_chapters_source )



More information about the vlc-commits mailing list