From be1c6253b257cec966f852fd8287b2a854a9646a Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kempf Date: Tue, 18 May 2010 23:46:40 +0200 Subject: [PATCH] MP4: support for trkn atom Ref #3630 (cherry picked from commit 1e7532bb4b94f24eaab5fdc4e3045a76137291f7) Signed-off-by: Jean-Baptiste Kempf --- modules/demux/mp4/libmp4.c | 36 ++++++++++++++++++++++++++++++++++++ modules/demux/mp4/libmp4.h | 9 +++++++++ modules/demux/mp4/mp4.c | 9 ++++++++- 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c index 4d3dc241d1..d9972c94fa 100644 --- a/modules/demux/mp4/libmp4.c +++ b/modules/demux/mp4/libmp4.c @@ -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 }, diff --git a/modules/demux/mp4/libmp4.h b/modules/demux/mp4/libmp4.h index a28d4c0e9f..24263fc54e 100644 --- a/modules/demux/mp4/libmp4.h +++ b/modules/demux/mp4/libmp4.h @@ -122,6 +122,7 @@ #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; diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c index 740736a6ad..c7a30eed7c 100644 --- a/modules/demux/mp4/mp4.c +++ b/modules/demux/mp4/mp4.c @@ -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; -- 2.11.4.GIT