]> git.sesse.net Git - vlc/commitdiff
MP4: support for trkn atom
authorJean-Baptiste Kempf <jb@videolan.org>
Tue, 18 May 2010 21:46:40 +0000 (23:46 +0200)
committerJean-Baptiste Kempf <jb@videolan.org>
Tue, 18 May 2010 21:57:35 +0000 (23:57 +0200)
Ref #3630

modules/demux/mp4/libmp4.c
modules/demux/mp4/libmp4.h
modules/demux/mp4/mp4.c

index e21196683ba4d1e7f7178b373928669e7fe60b11..f669e925dbb63944525a869c6eca1cd366724c39 100644 (file)
@@ -1179,6 +1179,41 @@ static int MP4_ReadBox_gnre( stream_t *p_stream, MP4_Box_t *p_box )
     MP4_READBOX_EXIT( 1 );
 }
 
+static int MP4_ReadBox_trkn( stream_t *p_stream, MP4_Box_t *p_box )
+{
+    MP4_Box_data_trkn_t *p_trkn;
+    MP4_READBOX_ENTER( MP4_Box_data_trkn_t );
+
+    p_trkn = p_box->data.p_trkn;
+
+    uint32_t i_data_len;
+    uint32_t i_data_tag;
+
+    MP4_GET4BYTES( i_data_len );
+    MP4_GETFOURCC( i_data_tag );
+    if( i_data_len < 12 || i_data_tag != VLC_FOURCC('d', 'a', 't', 'a') )
+        MP4_READBOX_EXIT( 0 );
+
+    uint32_t i_version;
+    uint32_t i_reserved;
+    MP4_GET4BYTES( i_version );
+    MP4_GET4BYTES( i_reserved );
+    MP4_GET4BYTES( p_trkn->i_track_number );
+#ifdef MP4_VERBOSE
+    msg_Dbg( p_stream, "read box: \"trkn\" number=%i", p_trkn->i_track_number );
+#endif
+    if( i_data_len > 15 )
+    {
+       MP4_GET4BYTES( p_trkn->i_track_total );
+#ifdef MP4_VERBOSE
+       msg_Dbg( p_stream, "read box: \"trkn\" total=%i", p_trkn->i_track_total );
+#endif
+    }
+
+    MP4_READBOX_EXIT( 1 );
+}
+
+
 static int MP4_ReadBox_sample_soun( stream_t *p_stream, MP4_Box_t *p_box )
 {
     unsigned int i;
@@ -2599,6 +2634,7 @@ static const struct
     { FOURCC_dac3,  MP4_ReadBox_dac3,       MP4_FreeBox_Common },
     { FOURCC_enda,  MP4_ReadBox_enda,       MP4_FreeBox_Common },
     { FOURCC_gnre,  MP4_ReadBox_gnre,       MP4_FreeBox_Common },
+    { FOURCC_trkn,  MP4_ReadBox_trkn,       MP4_FreeBox_Common },
 
     /* Nothing to do with this box */
     { FOURCC_mdat,  MP4_ReadBoxSkip,        MP4_FreeBox_Common },
index a28d4c0e9fc0d233086a19536d023640107877d2..24263fc54e4c9758d5198d08a46b3ae4ac95d6e3 100644 (file)
 #define FOURCC_dec3 VLC_FOURCC( 'd', 'e', 'c', '3' )
 #define FOURCC_enda VLC_FOURCC( 'e', 'n', 'd', 'a' )
 #define FOURCC_gnre VLC_FOURCC( 'g', 'n', 'r', 'e' )
+#define FOURCC_trkn VLC_FOURCC( 't', 'r', 'k', 'n' )
 
 #define FOURCC_zlib VLC_FOURCC( 'z', 'l', 'i', 'b' )
 #define FOURCC_SVQ1 VLC_FOURCC( 'S', 'V', 'Q', '1' )
@@ -886,6 +887,13 @@ typedef struct
 
 } MP4_Box_data_gnre_t;
 
+typedef struct
+{
+    uint32_t i_track_number;
+    uint32_t i_track_total;
+
+} MP4_Box_data_trkn_t;
+
 /*
 typedef struct MP4_Box_data__s
 {
@@ -922,6 +930,7 @@ typedef union MP4_Box_data_s
         MP4_Box_data_dac3_t *p_dac3;
         MP4_Box_data_enda_t *p_enda;
         MP4_Box_data_gnre_t *p_gnre;
+        MP4_Box_data_trkn_t *p_trkn;
 
     MP4_Box_data_stsz_t *p_stsz;
     MP4_Box_data_stz2_t *p_stz2;
index 740736a6adc3f6be448c71d3d2228a297735bb79..c7a30eed7cf71bb6b69dc25cac404aa70c3fe423 100644 (file)
@@ -916,7 +916,14 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
                 case FOURCC_0xa9trk: /* Track */
                     SET( vlc_meta_SetTrackNum );
                     break;
-
+                case FOURCC_trkn:
+                {
+                    char psz_trck[11];
+                    snprintf( psz_trck, sizeof( psz_trck ), "%i",
+                              p_0xa9xxx->data.p_trkn->i_track_number );
+                    vlc_meta_SetTrackNum( p_meta, psz_trck );
+                    break;
+                }
                 case FOURCC_0xa9cmt: /* Commment */
                     SET( vlc_meta_SetDescription );
                     break;