]> git.sesse.net Git - vlc/commitdiff
demux: libmp4: add meta keys atom
authorFrancois Cartegnie <fcvlcdev@free.fr>
Tue, 14 Oct 2014 20:08:27 +0000 (22:08 +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 a57e8faa48b5189e040690a9e5293c59f88195a8..0c5b4f16fdce743eb70d01bff2d38fa24bf13181 100644 (file)
@@ -3090,6 +3090,60 @@ static void MP4_FreeBox_tref_generic( MP4_Box_t *p_box )
     FREENULL( p_box->data.p_tref_generic->i_track_ID );
 }
 
+static int MP4_ReadBox_keys( stream_t *p_stream, MP4_Box_t *p_box )
+{
+    MP4_READBOX_ENTER( MP4_Box_data_keys_t );
+
+    if ( i_read < 8 )
+        MP4_READBOX_EXIT( 0 );
+
+    uint32_t i_count;
+    MP4_GET4BYTES( i_count ); /* reserved + flags */
+    if ( i_count != 0 )
+        MP4_READBOX_EXIT( 0 );
+
+    MP4_GET4BYTES( i_count );
+    p_box->data.p_keys->p_entries = calloc( i_count, sizeof(*p_box->data.p_keys->p_entries) );
+    if ( !p_box->data.p_keys->p_entries )
+        MP4_READBOX_EXIT( 0 );
+    p_box->data.p_keys->i_entry_count = i_count;
+
+    uint32_t i=0;
+    for( ; i < i_count; i++ )
+    {
+        if ( i_read < 8 )
+            break;
+        uint32_t i_keysize;
+        MP4_GET4BYTES( i_keysize );
+        if ( (i_keysize < 8) || (i_keysize - 4 > i_read) )
+            break;
+        MP4_GETFOURCC( p_box->data.p_keys->p_entries[i].i_namespace );
+        i_keysize -= 8;
+        p_box->data.p_keys->p_entries[i].psz_value = malloc( i_keysize + 1 );
+        if ( !p_box->data.p_keys->p_entries[i].psz_value )
+            break;
+        memcpy( p_box->data.p_keys->p_entries[i].psz_value, p_peek, i_keysize );
+        p_box->data.p_keys->p_entries[i].psz_value[i_keysize] = 0;
+        p_peek += i_keysize;
+        i_read -= i_keysize;
+#ifdef MP4_ULTRA_VERBOSE
+        msg_Dbg( p_stream, "read box: \"keys\": %u '%s'", i + 1,
+                 p_box->data.p_keys->p_entries[i].p_value );
+#endif
+    }
+    if ( i < i_count )
+        p_box->data.p_keys->i_entry_count = i;
+
+    MP4_READBOX_EXIT( 1 );
+}
+
+static void MP4_FreeBox_keys( MP4_Box_t *p_box )
+{
+    for( uint32_t i=0; i<p_box->data.p_keys->i_entry_count; i++ )
+        free( p_box->data.p_keys->p_entries[i].psz_value );
+    free( p_box->data.p_keys->p_entries );
+}
+
 static int MP4_ReadBox_meta( stream_t *p_stream, MP4_Box_t *p_box )
 {
     uint8_t meta_data[8];
@@ -3544,6 +3598,7 @@ static const struct
     { ATOM_enda,    MP4_ReadBox_enda,         MP4_FreeBox_Common, 0 },
     { ATOM_iods,    MP4_ReadBox_iods,         MP4_FreeBox_Common, 0 },
     { ATOM_pasp,    MP4_ReadBox_pasp,         MP4_FreeBox_Common, 0 },
+    { ATOM_keys,    MP4_ReadBox_keys,         MP4_FreeBox_keys,   ATOM_meta },
 
     /* Nothing to do with this box */
     { ATOM_mdat,    MP4_ReadBoxSkip,          MP4_FreeBox_Common, 0 },
index 50fe38f03f25c2d902362154eed149891da43bcc..8824784a8a2f060613f1a36b371eccd2bfa57c7d 100644 (file)
@@ -93,6 +93,7 @@
 #define ATOM_mfra VLC_FOURCC( 'm', 'f', 'r', 'a' )
 #define ATOM_mfro VLC_FOURCC( 'm', 'f', 'r', 'o' )
 #define ATOM_tfra VLC_FOURCC( 't', 'f', 'r', 'a' )
+#define ATOM_keys VLC_FOURCC( 'k', 'e', 'y', 's' )
 
 #define ATOM_nmhd VLC_FOURCC( 'n', 'm', 'h', 'd' )
 #define ATOM_mp2v VLC_FOURCC( 'm', 'p', '2', 'v' )
@@ -1191,6 +1192,16 @@ typedef struct
 
 } MP4_Box_data_gnre_t;
 
+typedef struct
+{
+    uint32_t i_entry_count;
+    struct
+    {
+        uint32_t i_namespace;
+        char    *psz_value;
+    } *p_entries;
+} MP4_Box_data_keys_t;
+
 typedef struct
 {
     uint32_t i_track_number;
@@ -1347,6 +1358,7 @@ typedef union MP4_Box_data_s
     MP4_Box_data_dvc1_t *p_dvc1;
     MP4_Box_data_chan_t *p_chan;
     MP4_Box_data_enda_t *p_enda;
+    MP4_Box_data_keys_t *p_keys;
     MP4_Box_data_gnre_t *p_gnre;
     MP4_Box_data_trkn_t *p_trkn;
     MP4_Box_data_iods_t *p_iods;