From efb69308b883496b3305d3380a04c063324dcc78 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kempf Date: Tue, 18 May 2010 23:02:19 +0200 Subject: [PATCH] MP4: support for gnre atom Ref #3630 (cherry picked from commit 8cba4462239f3524e789937bfc69c93f55ca3c30) Signed-off-by: Jean-Baptiste Kempf --- modules/demux/mp4/libmp4.c | 28 ++++++++++++++++++++++++++++ modules/demux/mp4/libmp4.h | 8 ++++++++ modules/demux/mp4/mp4.c | 6 ++++++ 3 files changed, 42 insertions(+) diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c index c84b74efd9..4d3dc241d1 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 5216c1c76c..a28d4c0e9f 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 22a708e83c..740736a6ad 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; -- 2.11.4.GIT