[vlc-commits] demux: mp4: re-enable non fastseekable mp4

Francois Cartegnie git at videolan.org
Mon May 26 11:48:27 CEST 2014


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon May 26 11:33:51 2014 +0200| [fafd0af120d43cf37364e12d3ca88f9f2b4bb5ad] | committer: Francois Cartegnie

demux: mp4: re-enable non fastseekable mp4

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

 modules/demux/mp4/mp4.c |  139 ++++++++++++++++++++++++-----------------------
 1 file changed, 71 insertions(+), 68 deletions(-)

diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
index 8fdd0de..0bed306 100644
--- a/modules/demux/mp4/mp4.c
+++ b/modules/demux/mp4/mp4.c
@@ -446,12 +446,6 @@ static int Open( vlc_object_t * p_this )
         stream_Seek( p_demux->s, 0 ); /* rewind, for other demux */
         goto error;
     }
-    else if( !p_sys->b_fastseekable )
-    {
-        msg_Warn( p_demux, "MP4 plugin discarded (not fast-seekable)" );
-        stream_Seek( p_demux->s, 0 ); /* rewind, for other demux */
-        goto error;
-    }
 
     MP4_BoxDumpStructure( p_demux->s, p_sys->p_root );
 
@@ -775,85 +769,94 @@ static int Demux( demux_t *p_demux )
     /* first wait for the good time to read a packet */
     p_sys->i_pcr = MP4_GetMoviePTS( p_sys );
 
-    /* we will read 100ms for each stream so ...*/
-    mtime_t i_targettime = p_sys->i_pcr + CLOCK_FREQ/10;
     bool b_data_sent = false;
 
+    /* Find next track matching contiguous data */
+    mp4_track_t *tk = NULL;
+    uint64_t i_candidate_pos = UINT64_MAX;
     for( i_track = 0; i_track < p_sys->i_tracks; i_track++ )
     {
-        mp4_track_t *tk = &p_sys->track[i_track];
-
-        if( !tk->b_ok || tk->b_chapter || !tk->b_selected || tk->i_sample >= tk->i_sample_count )
+        mp4_track_t *tk_tmp = &p_sys->track[i_track];
+        if( !tk_tmp->b_ok || tk_tmp->b_chapter || !tk_tmp->b_selected || tk_tmp->i_sample >= tk_tmp->i_sample_count )
             continue;
 
-        while( MP4_TrackGetDTS( p_demux, tk ) < i_targettime
-               || ( p_sys->i_pcr == VLC_TS_INVALID && !b_data_sent ) )
+        uint64_t i_pos = MP4_TrackGetPos( tk_tmp );
+        if ( i_pos <= i_candidate_pos )
         {
+            i_candidate_pos = i_pos;
+            tk = tk_tmp;
+        }
+    }
+
+    if ( !tk )
+    {
+        msg_Dbg( p_demux, "Could not select track by data position" );
+        goto end;
+    }
+
 #if 0
-            msg_Dbg( p_demux, "tk(%i)=%lld mv=%lld", i_track,
-                     MP4_TrackGetDTS( p_demux, tk ),
-                     MP4_GetMoviePTS( p_sys ) );
+    msg_Dbg( p_demux, "tk(%i)=%"PRId64" mv=%"PRId64" pos=%"PRIu64, i_track,
+             MP4_TrackGetDTS( p_demux, tk ),
+             MP4_GetMoviePTS( p_sys ), i_candidate_pos );
 #endif
-            uint32_t i_nb_samples = 0;
-            uint32_t i_samplessize = MP4_TrackSampleSize( tk, &i_nb_samples );
-            if( i_samplessize > 0 )
-            {
-                block_t *p_block;
-                int64_t i_delta, i_newpos;
 
-                /* go,go go ! */
-                i_newpos = MP4_TrackGetPos( tk );
-                if( stream_Tell( p_demux->s ) != i_newpos )
-                {
-                    if( stream_Seek( p_demux->s, i_newpos ) )
-                    {
-                        msg_Warn( p_demux, "track[0x%x] will be disabled (eof?)",
-                                  tk->i_track_ID );
-                        MP4_TrackUnselect( p_demux, tk );
-                        break;
-                    }
-                }
+    uint32_t i_nb_samples = 0;
+    uint32_t i_samplessize = MP4_TrackSampleSize( tk, &i_nb_samples );
+    if( i_samplessize > 0 )
+    {
+        block_t *p_block;
+        int64_t i_delta;
 
-                /* now read pes */
-                if( !(p_block = stream_Block( p_demux->s, i_samplessize )) )
-                {
-                    msg_Warn( p_demux, "track[0x%x] will be disabled (eof?)",
-                              tk->i_track_ID );
-                    MP4_TrackUnselect( p_demux, tk );
-                    break;
-                }
-                else if( tk->fmt.i_cat == SPU_ES )
-                {
-                    if ( tk->fmt.i_codec != VLC_CODEC_TX3G &&
-                         tk->fmt.i_codec != VLC_CODEC_SPU )
-                        p_block->i_buffer = 0;
-                }
+        /* go,go go ! */
+        if( stream_Tell( p_demux->s ) != i_candidate_pos )
+        {
+            if( stream_Seek( p_demux->s, i_candidate_pos ) )
+            {
+                msg_Warn( p_demux, "track[0x%x] will be disabled (eof?)",
+                          tk->i_track_ID );
+                MP4_TrackUnselect( p_demux, tk );
+                goto end;
+            }
+        }
 
-                /* dts */
-                p_block->i_dts = VLC_TS_0 + MP4_TrackGetDTS( p_demux, tk );
-                /* pts */
-                i_delta = MP4_TrackGetPTSDelta( p_demux, tk );
-                if( i_delta != -1 )
-                    p_block->i_pts = p_block->i_dts + i_delta;
-                else if( tk->fmt.i_cat != VIDEO_ES )
-                    p_block->i_pts = p_block->i_dts;
-                else
-                    p_block->i_pts = VLC_TS_INVALID;
+        /* now read pes */
+        if( !(p_block = stream_Block( p_demux->s, i_samplessize )) )
+        {
+            msg_Warn( p_demux, "track[0x%x] will be disabled (eof?)",
+                      tk->i_track_ID );
+            MP4_TrackUnselect( p_demux, tk );
+            goto end;
+        }
+        else if( tk->fmt.i_cat == SPU_ES )
+        {
+            if ( tk->fmt.i_codec != VLC_CODEC_TX3G &&
+                 tk->fmt.i_codec != VLC_CODEC_SPU )
+                p_block->i_buffer = 0;
+        }
 
-                if ( !b_data_sent )
-                {
-                    es_out_Control( p_demux->out, ES_OUT_SET_PCR, VLC_TS_0 + p_sys->i_pcr );
-                    b_data_sent = true;
-                }
-                es_out_Send( p_demux->out, tk->p_es, p_block );
-            }
+        /* dts */
+        p_block->i_dts = VLC_TS_0 + MP4_TrackGetDTS( p_demux, tk );
+        /* pts */
+        i_delta = MP4_TrackGetPTSDelta( p_demux, tk );
+        if( i_delta != -1 )
+            p_block->i_pts = p_block->i_dts + i_delta;
+        else if( tk->fmt.i_cat != VIDEO_ES )
+            p_block->i_pts = p_block->i_dts;
+        else
+            p_block->i_pts = VLC_TS_INVALID;
 
-            /* Next sample */
-            if( MP4_TrackNextSample( p_demux, tk, i_nb_samples ) )
-                break;
+        if ( !b_data_sent )
+        {
+            es_out_Control( p_demux->out, ES_OUT_SET_PCR, VLC_TS_0 + p_sys->i_pcr );
+            b_data_sent = true;
         }
+        es_out_Send( p_demux->out, tk->p_es, p_block );
+
+        /* Next sample */
+        MP4_TrackNextSample( p_demux, tk, i_nb_samples );
     }
 
+end:
     if ( b_data_sent )
     {
         p_sys->i_pcr = INT64_MAX;



More information about the vlc-commits mailing list