vlc/vlc-3.0 | branch: master | Francois Cartegnie <[email protected]> | Fri Apr 26 11:15:32 2019 +0200| [040d2fb36da6db2c1a01c97448dd4867c922c9da] | committer: Francois Cartegnie
demux: mp4: probe fragments on missing duration (cherry picked from commit 90236624baa289c744bae5bba3a913a1a1d0bd8f) > http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=040d2fb36da6db2c1a01c97448dd4867c922c9da --- modules/demux/mp4/mp4.c | 93 +++++++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c index ba862c8664..c70f6f6fd0 100644 --- a/modules/demux/mp4/mp4.c +++ b/modules/demux/mp4/mp4.c @@ -166,6 +166,7 @@ static void MP4_GetDefaultSizeAndDuration( MP4_Box_t *p_moov, static stime_t GetMoovTrackDuration( demux_sys_t *p_sys, unsigned i_track_ID ); static int ProbeFragments( demux_t *p_demux, bool b_force, bool *pb_fragmented ); +static int ProbeFragmentsChecked( demux_t *p_demux ); static int ProbeIndex( demux_t *p_demux ); static int FragCreateTrunIndex( demux_t *, MP4_Box_t *, MP4_Box_t *, stime_t, bool ); @@ -1666,46 +1667,17 @@ static int FragSeekToTime( demux_t *p_demux, mtime_t i_nztime, bool b_accurate ) } else { - bool b_buildindex = false; - if( FragGetMoofByTfraIndex( p_demux, i_nztime, i_seek_track_ID, &i64, &i_sync_time ) == VLC_SUCCESS ) { /* Does only provide segment position and a sync sample time */ msg_Dbg( p_demux, "seeking to sync point %" PRId64, i_sync_time ); b_iframesync = true; } - else if( !p_sys->b_fragments_probed && !p_sys->b_fastseekable ) - { - const char *psz_msg = _( - "Because this file index is broken or missing, " - "seeking will not work correctly.\n" - "VLC won't repair your file but can temporary fix this " - "problem by building an index in memory.\n" - "This step might take a long time on a large file.\n" - "What do you want to do?"); - b_buildindex = vlc_dialog_wait_question( p_demux, - VLC_DIALOG_QUESTION_NORMAL, - _("Do not seek"), - _("Build index"), - NULL, - _("Broken or missing Index"), - "%s", psz_msg ); - } - - if( !p_sys->b_fragments_probed && ( p_sys->b_fastseekable || b_buildindex ) ) - { - bool foo; - int i_ret = vlc_stream_Seek( p_demux->s, p_sys->p_moov->i_pos + p_sys->p_moov->i_size ); - if( i_ret == VLC_SUCCESS ) - { - i_ret = ProbeFragments( p_demux, true, &foo ); - p_sys->b_fragments_probed = true; - } + else if( !p_sys->b_fragments_probed ) + { + int i_ret = ProbeFragmentsChecked( p_demux ); if( i_ret != VLC_SUCCESS ) - { - p_sys->b_error = (vlc_stream_Seek( p_demux->s, i_backup_pos ) != VLC_SUCCESS); return i_ret; - } } if( p_sys->b_fragments_probed && p_sys->p_fragsindex ) @@ -1771,9 +1743,20 @@ static int FragSeekToTime( demux_t *p_demux, mtime_t i_nztime, bool b_accurate ) static int FragSeekToPos( demux_t *p_demux, double f, bool b_accurate ) { demux_sys_t *p_sys = p_demux->p_sys; - const uint64_t i_duration = __MAX(p_sys->i_duration, p_sys->i_cumulated_duration); - if ( !p_sys->b_seekable || !p_sys->i_timescale || !i_duration ) + if ( !p_sys->b_seekable || !p_sys->i_timescale ) + return VLC_EGENERIC; + + uint64_t i_duration = __MAX(p_sys->i_duration, p_sys->i_cumulated_duration); + if( !i_duration && !p_sys->b_fragments_probed ) + { + int i_ret = ProbeFragmentsChecked( p_demux ); + if( i_ret != VLC_SUCCESS ) + return i_ret; + i_duration = __MAX(p_sys->i_duration, p_sys->i_cumulated_duration); + } + + if( !i_duration ) return VLC_EGENERIC; return FragSeekToTime( p_demux, (mtime_t)( f * @@ -4231,6 +4214,48 @@ static int ProbeFragments( demux_t *p_demux, bool b_force, bool *pb_fragmented ) return VLC_SUCCESS; } +static int ProbeFragmentsChecked( demux_t *p_demux ) +{ + demux_sys_t *p_sys = p_demux->p_sys; + + if( p_sys->b_fragments_probed ) + return VLC_SUCCESS; + + if( !p_sys->b_fastseekable ) + { + const char *psz_msg = _( + "Because this file index is broken or missing, " + "seeking will not work correctly.\n" + "VLC won't repair your file but can temporary fix this " + "problem by building an index in memory.\n" + "This step might take a long time on a large file.\n" + "What do you want to do?"); + bool b_continue = vlc_dialog_wait_question( p_demux, + VLC_DIALOG_QUESTION_NORMAL, + _("Do not seek"), + _("Build index"), + NULL, + _("Broken or missing Index"), + "%s", psz_msg ); + if( !b_continue ) + return VLC_EGENERIC; + } + + const uint64_t i_backup_pos = vlc_stream_Tell( p_demux->s ); + int i_ret = vlc_stream_Seek( p_demux->s, p_sys->p_moov->i_pos + p_sys->p_moov->i_size ); + if( i_ret == VLC_SUCCESS ) + { + bool foo; + i_ret = ProbeFragments( p_demux, true, &foo ); + p_sys->b_fragments_probed = true; + } + + if( i_ret != VLC_SUCCESS ) + p_sys->b_error = (vlc_stream_Seek( p_demux->s, i_backup_pos ) != VLC_SUCCESS); + + return i_ret; +} + static void FragResetContext( demux_sys_t *p_sys ) { if( p_sys->context.p_fragment_atom ) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
