[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