[vlc-commits] demux: mp4: add check for reversed moov/mdat order with non seekable files

Francois Cartegnie git at videolan.org
Wed Sep 9 11:46:29 CEST 2015


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue Sep  8 16:53:33 2015 +0200| [89c26f3581721572ee86b62dfdbb3e2a672a5568] | committer: Francois Cartegnie

demux: mp4: add check for reversed moov/mdat order with non seekable files

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

 modules/demux/mp4/libmp4.c |   20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c
index 6e59ba7..1063110 100644
--- a/modules/demux/mp4/libmp4.c
+++ b/modules/demux/mp4/libmp4.c
@@ -4185,13 +4185,29 @@ MP4_Box_t *MP4_BoxGetRoot( stream_t *p_stream )
     CreateUUID( &p_root->i_uuid, p_root->i_type );
 
     /* First get the moov */
-    const uint32_t stoplist[] = { ATOM_moov, 0 };
+    const uint32_t stoplist[] = { ATOM_moov, ATOM_mdat, 0 };
     i_result = MP4_ReadBoxContainerChildren( p_stream, p_root, stoplist );
 
+    /* mdat appeared first */
+    if( i_result && !MP4_BoxGet( p_root, "moov" ) )
+    {
+        bool b_seekable;
+        if( stream_Control( p_stream, STREAM_CAN_SEEK, &b_seekable ) != VLC_SUCCESS || !b_seekable )
+        {
+            msg_Err( p_stream, "no moov before mdat and the stream is not seekable" );
+            goto error;
+        }
+
+        /* continue loading up to moov */
+        const uint32_t stoplist[] = { ATOM_moov, 0 };
+        i_result = MP4_ReadBoxContainerChildren( p_stream, p_root, stoplist );
+    }
+
     if( !i_result )
         goto error;
+
     /* If there is a mvex box, it means fragmented MP4, and we're done */
-    else if( MP4_BoxCount( p_root, "moov/mvex" ) > 0 )
+    if( MP4_BoxCount( p_root, "moov/mvex" ) > 0 )
         return p_root;
 
     if( stream_Tell( p_stream ) + 8 < (uint64_t) stream_Size( p_stream ) )



More information about the vlc-commits mailing list