]> git.sesse.net Git - vlc/commitdiff
demux: libmp4: add support for index prefixed atom list
authorFrancois Cartegnie <fcvlcdev@free.fr>
Wed, 15 Oct 2014 14:41:15 +0000 (16:41 +0200)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Thu, 16 Oct 2014 18:05:01 +0000 (20:05 +0200)
modules/demux/mp4/libmp4.c
modules/demux/mp4/libmp4.h

index 45b800b0ced98b4f3c5fcb08bcea95f2e013cb56..dbfade3046a2d4d89623236cb26652151506e2ec 100644 (file)
@@ -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 );
index e8c1094fb38a90fa1a7d3a89449762f136837648..d61c3e85846d40ef2a4dffd198c62756081fdb75 100644 (file)
@@ -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
     {