[vlc-commits] commit: MP4: support for gnre atom (Jean-Baptiste Kempf )

git at videolan.org git at videolan.org
Wed May 19 00:02:20 CEST 2010


vlc/vlc-1.1 | branch: master | Jean-Baptiste Kempf <jb at videolan.org> | Tue May 18 23:02:19 2010 +0200| [efb69308b883496b3305d3380a04c063324dcc78] | committer: Jean-Baptiste Kempf 

MP4: support for gnre atom

Ref #3630
(cherry picked from commit 8cba4462239f3524e789937bfc69c93f55ca3c30)

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

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

 modules/demux/mp4/libmp4.c |   28 ++++++++++++++++++++++++++++
 modules/demux/mp4/libmp4.h |    8 ++++++++
 modules/demux/mp4/mp4.c    |    6 ++++++
 3 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c
index c84b74e..4d3dc24 100644
--- a/modules/demux/mp4/libmp4.c
+++ b/modules/demux/mp4/libmp4.c
@@ -1152,6 +1152,33 @@ static int MP4_ReadBox_enda( stream_t *p_stream, MP4_Box_t *p_box )
     MP4_READBOX_EXIT( 1 );
 }
 
+static int MP4_ReadBox_gnre( stream_t *p_stream, MP4_Box_t *p_box )
+{
+    MP4_Box_data_gnre_t *p_gnre;
+    MP4_READBOX_ENTER( MP4_Box_data_gnre_t );
+
+    p_gnre = p_box->data.p_gnre;
+
+    uint32_t i_data_len;
+    uint32_t i_data_tag;
+
+    MP4_GET4BYTES( i_data_len );
+    MP4_GETFOURCC( i_data_tag );
+    if( i_data_len < 10 || 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_GET2BYTES( p_gnre->i_genre );
+#ifdef MP4_VERBOSE
+    msg_Dbg( p_stream, "read box: \"gnre\" genre=%i", p_gnre->i_genre );
+#endif
+
+    MP4_READBOX_EXIT( 1 );
+}
+
 static int MP4_ReadBox_sample_soun( stream_t *p_stream, MP4_Box_t *p_box )
 {
     unsigned int i;
@@ -2571,6 +2598,7 @@ static const struct
     { FOURCC_avcC,  MP4_ReadBox_avcC,       MP4_FreeBox_avcC },
     { FOURCC_dac3,  MP4_ReadBox_dac3,       MP4_FreeBox_Common },
     { FOURCC_enda,  MP4_ReadBox_enda,       MP4_FreeBox_Common },
+    { FOURCC_gnre,  MP4_ReadBox_gnre,       MP4_FreeBox_Common },
 
     /* Nothing to do with this box */
     { FOURCC_mdat,  MP4_ReadBoxSkip,        MP4_FreeBox_Common },
diff --git a/modules/demux/mp4/libmp4.h b/modules/demux/mp4/libmp4.h
index 5216c1c..a28d4c0 100644
--- a/modules/demux/mp4/libmp4.h
+++ b/modules/demux/mp4/libmp4.h
@@ -121,6 +121,7 @@
 #define FOURCC_dac3 VLC_FOURCC( 'd', 'a', 'c', '3' )
 #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_zlib VLC_FOURCC( 'z', 'l', 'i', 'b' )
 #define FOURCC_SVQ1 VLC_FOURCC( 'S', 'V', 'Q', '1' )
@@ -879,6 +880,12 @@ typedef struct
 
 } MP4_Box_data_enda_t;
 
+typedef struct
+{
+    uint16_t i_genre;
+
+} MP4_Box_data_gnre_t;
+
 /*
 typedef struct MP4_Box_data__s
 {
@@ -914,6 +921,7 @@ typedef union MP4_Box_data_s
         MP4_Box_data_avcC_t *p_avcC;
         MP4_Box_data_dac3_t *p_dac3;
         MP4_Box_data_enda_t *p_enda;
+        MP4_Box_data_gnre_t *p_gnre;
 
     MP4_Box_data_stsz_t *p_stsz;
     MP4_Box_data_stz2_t *p_stz2;
diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
index 22a708e..740736a 100644
--- a/modules/demux/mp4/mp4.c
+++ b/modules/demux/mp4/mp4.c
@@ -41,6 +41,7 @@
 
 #include "libmp4.h"
 #include "drms.h"
+#include "../../meta_engine/id3genres.h"
 
 /*****************************************************************************
  * Module descriptor
@@ -903,6 +904,11 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
                     SET( vlc_meta_SetGenre );
                     break;
 
+                case FOURCC_gnre:
+                    if( p_0xa9xxx->data.p_gnre->i_genre < NUM_GENRES )
+                        vlc_meta_SetGenre( p_meta, ppsz_genres[p_0xa9xxx->data.p_gnre->i_genre] );
+                    break;
+
                 case FOURCC_0xa9alb: /* Album */
                     SET( vlc_meta_SetAlbum );
                     break;



More information about the vlc-commits mailing list