[vlc-commits] demux: libmp4: add support for index prefixed atom list

Francois Cartegnie git at videolan.org
Thu Oct 16 20:05:20 CEST 2014


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Oct 15 16:41:15 2014 +0200| [fa5dc0c50a756d5a54614214236bd35cbd8d87b2] | committer: Francois Cartegnie

demux: libmp4: add support for index prefixed atom list

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

 modules/demux/mp4/libmp4.c |   22 +++++++++++++++++++---
 modules/demux/mp4/libmp4.h |    1 +
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c
index 45b800b..dbfade3 100644
--- a/modules/demux/mp4/libmp4.c
+++ b/modules/demux/mp4/libmp4.c
@@ -191,15 +191,15 @@ static int MP4_NextBox( stream_t *p_stream, MP4_Box_t *p_box )
  *       after called one of theses functions, file position is unknown
  *       you need to call MP4_GotoBox to go where you want
  *****************************************************************************/
-int MP4_ReadBoxContainerChildren( stream_t *p_stream,
-                                  MP4_Box_t *p_container, uint32_t i_last_child )
+static int MP4_ReadBoxContainerChildrenIndexed( stream_t *p_stream,
+               MP4_Box_t *p_container, uint32_t i_last_child, bool b_indexed )
 {
     MP4_Box_t *p_box;
 
     /* Size of root container is set to 0 when unknown, for exemple
      * with a DASH stream. In that case, we skip the following check */
     if( p_container->i_size
-            && ( stream_Tell( p_stream ) + 8 >
+            && ( stream_Tell( p_stream ) + ((b_indexed)?16:8) >
         (off_t)(p_container->i_pos + p_container->i_size) )
       )
     {
@@ -209,7 +209,16 @@ int MP4_ReadBoxContainerChildren( stream_t *p_stream,
 
     do
     {
+        uint32_t i_index = 0;
+        if ( b_indexed )
+        {
+            uint8_t read[8];
+            if ( stream_Read( p_stream, read, 8 ) < 8 )
+                return 0;
+            i_index = GetDWBE(&read[4]);
+        }
         if( ( p_box = MP4_ReadBox( p_stream, p_container ) ) == NULL ) break;
+        p_box->i_index = i_index;
 
         /* chain this box with the father and the other at same level */
         if( !p_container->p_first ) p_container->p_first = p_box;
@@ -227,6 +236,13 @@ int MP4_ReadBoxContainerChildren( stream_t *p_stream,
     return 1;
 }
 
+int MP4_ReadBoxContainerChildren( stream_t *p_stream, MP4_Box_t *p_container,
+                                  uint32_t i_last_child )
+{
+    return MP4_ReadBoxContainerChildrenIndexed( p_stream, p_container,
+                                                i_last_child, false );
+}
+
 static int MP4_ReadBoxContainerRaw( stream_t *p_stream, MP4_Box_t *p_container )
 {
     return MP4_ReadBoxContainerChildren( p_stream, p_container, 0 );
diff --git a/modules/demux/mp4/libmp4.h b/modules/demux/mp4/libmp4.h
index e8c1094..d61c3e8 100644
--- a/modules/demux/mp4/libmp4.h
+++ b/modules/demux/mp4/libmp4.h
@@ -1446,6 +1446,7 @@ struct MP4_Box_s
     uint32_t     i_type;
     uint32_t     i_shortsize;
     uint32_t     i_handler;  /**/
+    uint32_t     i_index;    /* indexed list (ilst) */
 
     enum
     {



More information about the vlc-commits mailing list