[vlc-commits] demux: mp4: handle moof to mdat gap (fix #21028)

Francois Cartegnie git at videolan.org
Thu Aug 16 11:42:41 CEST 2018


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Aug 16 11:33:59 2018 +0200| [6b00be9e5e60aaf2d52855152395dd44c1c54a39] | committer: Francois Cartegnie

demux: mp4: handle moof to mdat gap (fix #21028)

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

 modules/demux/mp4/mp4.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
index 5bdab8766e..7c904a89d0 100644
--- a/modules/demux/mp4/mp4.c
+++ b/modules/demux/mp4/mp4.c
@@ -4948,19 +4948,38 @@ static int DemuxFrag( demux_t *p_demux )
         }
 
         p_sys->context.i_current_box_type = VLC_FOURCC( p_peek[4], p_peek[5], p_peek[6], p_peek[7] );
-        if( p_sys->context.i_current_box_type == ATOM_mdat )
+        if( p_sys->context.i_current_box_type != ATOM_moof &&
+            p_sys->context.i_current_box_type != ATOM_moov )
         {
-            uint64_t size = GetDWBE( p_peek );
-            if ( size == 1 )
+            uint64_t i_pos = vlc_stream_Tell( p_demux->s );
+            uint64_t i_size = GetDWBE( p_peek );
+            if ( i_size == 1 )
             {
                 if( vlc_stream_Peek( p_demux->s, &p_peek, 16 ) != 16 )
                 {
                     i_status = VLC_DEMUXER_EOF;
                     goto end;
                 }
-                size = GetQWBE( p_peek + 8 );
+                i_size = GetQWBE( p_peek + 8 );
+            }
+
+            if( UINT64_MAX - i_pos < i_size )
+            {
+                i_status = VLC_DEMUXER_EOF;
+                goto end;
+            }
+
+            if( p_sys->context.i_current_box_type == ATOM_mdat )
+            {
+                /* We'll now read mdat using context atom,
+                 * but we'll need post mdat offset, as we'll never seek backward */
+                p_sys->context.i_post_mdat_offset = i_pos + i_size;
+            }
+            else if( MP4_Seek( p_demux->s, i_pos + i_size ) != VLC_SUCCESS ) /* skip other atoms */
+            {
+                i_status = VLC_DEMUXER_EOF;
+                goto end;
             }
-            p_sys->context.i_post_mdat_offset = vlc_stream_Tell( p_demux->s ) + size;
         }
         else
         {



More information about the vlc-commits mailing list