[vlc-commits] demux: mp4: fix smooth restart
Francois Cartegnie
git at videolan.org
Thu Jun 11 20:10:30 CEST 2015
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Jun 11 20:06:34 2015 +0200| [fe65f510689fa159be67fd2a779a67980ecd9eb3] | committer: Francois Cartegnie
demux: mp4: fix smooth restart
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=fe65f510689fa159be67fd2a779a67980ecd9eb3
---
modules/demux/mp4/mp4.c | 69 +++++++++++++++++++++++++++--------------------
1 file changed, 40 insertions(+), 29 deletions(-)
diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
index 85c1bcc..9294901 100644
--- a/modules/demux/mp4/mp4.c
+++ b/modules/demux/mp4/mp4.c
@@ -421,7 +421,6 @@ static int CreateTracksFromSmooBox( demux_t *p_demux )
{
mp4_track_t *p_track = &p_sys->track[j++];
MP4_SmoothTrackCreate( p_demux, p_track, p_stra );
- p_track->p_es = es_out_Add( p_demux->out, &p_track->fmt );
}
p_stra = p_stra->p_next;
}
@@ -3509,6 +3508,7 @@ static int MP4_SmoothFormatFill( const MP4_Box_data_stra_t *p_data, const mp4_tr
static int MP4_SmoothTrackCreate( demux_t *p_demux, mp4_track_t *p_track, const MP4_Box_t *p_stra )
{
demux_sys_t *p_sys = p_demux->p_sys;
+ es_format_t *fmt = &p_track->fmt;
p_track->b_ok = false;
p_track->b_selected = false;
@@ -3521,16 +3521,36 @@ static int MP4_SmoothTrackCreate( demux_t *p_demux, mp4_track_t *p_track, const
p_track->i_timescale = p_sys->i_timescale;
p_track->i_track_ID = p_data->i_track_ID;
+ p_track->i_width = 0;
+ p_track->i_height = 0;
- es_format_t *fmt = &p_track->fmt;
- es_format_Init( &p_track->fmt, p_data->i_es_cat, 0 );
+ es_format_t newfmt;
+ es_format_Init( &newfmt, p_data->i_es_cat, 0 );
+ if( MP4_SmoothFormatFill( BOXDATA(p_stra), p_track, &newfmt ) != VLC_SUCCESS )
+ {
+ es_format_Clean(&newfmt);
+ if( p_track->p_es )
+ {
+ es_out_Del( p_demux->out, p_track->p_es );
+ p_track->p_es = NULL;
+ }
+ return VLC_EGENERIC;
+ }
- if( MP4_SmoothFormatFill( p_data, p_track, fmt ) != VLC_SUCCESS )
+ /* If format now differs from current (new or updated) */
+ if( !es_format_IsSimilar( &newfmt, fmt ) ||
+ newfmt.i_extra != fmt->i_extra ||
+ memcmp( &newfmt.p_extra, fmt->p_extra, newfmt.i_extra ) )
{
es_format_Clean( fmt );
- return VLC_EGENERIC;
+ es_format_Copy( fmt, &newfmt );
+ if( p_track->p_es )
+ es_out_Del( p_demux->out, p_track->p_es );
+ p_track->p_es = es_out_Add( p_demux->out, fmt );
}
- else if( fmt->i_cat == VIDEO_ES )
+ es_format_Clean( &newfmt );
+
+ if( fmt->i_cat == VIDEO_ES )
{
p_track->i_width = fmt->video.i_visible_width;
p_track->i_height = fmt->video.i_visible_height;
@@ -3544,7 +3564,7 @@ static int MP4_SmoothTrackCreate( demux_t *p_demux, mp4_track_t *p_track, const
p_demux->p_sys->f_fps = 24;
}
- p_track->b_ok = true;
+ p_track->b_ok = !!p_track->p_es;
return VLC_SUCCESS;
}
@@ -3615,44 +3635,35 @@ static int ReInitDecoder( demux_t *p_demux, mp4_track_t *p_track )
{
demux_sys_t *p_sys = p_demux->p_sys;
- uint32_t i_sample = 0;
- bool b_smooth = false;
- MP4_Box_t *p_stra = NULL, *p_trak = NULL;
-
- if( !CmpUUID( &p_sys->p_root->p_first->i_uuid, &SmooBoxUUID ) )
- b_smooth = true;
+ uint32_t i_sample = p_track->i_sample;
- if( b_smooth )
+ if( p_sys->b_smooth )
{
- p_stra = MP4_BoxGet( p_sys->p_root, "uuid/uuid[0]" );
- if( !p_stra || CmpUUID( &p_stra->i_uuid, &StraBoxUUID ) )
+ MP4_Box_t *p_stra = MP4_BoxGet( p_sys->p_root, "uuid/uuid[0]" );
+ if( !p_stra || CmpUUID( &p_stra->i_uuid, &StraBoxUUID ) ||
+ MP4_SmoothTrackCreate( p_demux, p_track, p_stra ) != VLC_SUCCESS )
return VLC_EGENERIC;
}
else /* DASH */
{
- p_trak = MP4_BoxGet( p_sys->p_root, "/moov/trak[0]" );
+ MP4_Box_t *p_trak = MP4_BoxGet( p_sys->p_root, "/moov/trak[0]" );
if( !p_trak )
return VLC_EGENERIC;
- }
-
- i_sample = p_track->i_sample;
- es_out_Del( p_demux->out, p_track->p_es );
- p_track->p_es = NULL;
- es_format_Clean( &p_track->fmt );
- if( b_smooth )
- MP4_SmoothTrackCreate( p_demux, p_track, p_stra );
- else /* DASH */
+ es_out_Del( p_demux->out, p_track->p_es );
+ p_track->p_es = NULL;
+ es_format_Clean( &p_track->fmt );
MP4_TrackCreate( p_demux, p_track, p_trak, true );
+ if(!p_track->p_es)
+ p_track->p_es = es_out_Add( p_demux->out, &p_track->fmt );
+ p_track->b_ok = !!p_track->p_es;
+ }
p_track->i_sample = i_sample;
/* Temporary hack until we support track selection */
p_track->b_selected = true;
- p_track->b_ok = true;
p_track->b_enable = true;
- if(!p_track->p_es)
- p_track->p_es = es_out_Add( p_demux->out, &p_track->fmt );
p_track->b_codec_need_restart = false;
return VLC_SUCCESS;
More information about the vlc-commits
mailing list