/*****************************************************************************
* mp4.c : MP4 file input module for vlc
*****************************************************************************
- * Copyright (C) 2001-2004 the VideoLAN team
+ * Copyright (C) 2001-2004, 2010 the VideoLAN team
* $Id$
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
#include "libmp4.h"
#include "drms.h"
+#include "../../meta_engine/id3genres.h"
/*****************************************************************************
* Module descriptor
p_sys->p_tref_chap = p_chap;
}
- /* now process each track and extract all usefull information */
+ /* now process each track and extract all useful information */
for( i = 0; i < p_sys->i_tracks; i++ )
{
p_trak = MP4_BoxGet( p_sys->p_root, "/moov/trak[%d]", i );
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 - 1] );
+ break;
+
case FOURCC_0xa9alb: /* Album */
SET( vlc_meta_SetAlbum );
break;
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;
SET( vlc_meta_SetURL );
break;
+ case FOURCC_0xa9too: /* Encoder Tool */
case FOURCC_0xa9enc: /* Encoded By */
SET( vlc_meta_SetEncodedBy );
break;
-
- case FOURCC_0xa9swr:
- case FOURCC_0xa9inf: /* Information */
- case FOURCC_0xa9dir: /* Director */
- case FOURCC_0xa9dis: /* Disclaimer */
- case FOURCC_0xa9req: /* Requirements */
- case FOURCC_0xa9fmt: /* Original Format */
- case FOURCC_0xa9dsa: /* Display Source As */
- case FOURCC_0xa9hst: /* Host Computer */
- case FOURCC_0xa9prd: /* Producer */
- case FOURCC_0xa9prf: /* Performers */
- case FOURCC_0xa9ope: /* Original Performer */
- case FOURCC_0xa9src: /* Providers Source Content */
- case FOURCC_0xa9wrt: /* Writer */
- case FOURCC_0xa9com: /* Composer */
- case FOURCC_WLOC: /* Window Location */
- /* TODO one day, but they aren't really meaningfull */
- break;
-#undef SET
default:
break;
}
+#undef SET
+ static const struct { uint32_t xa9_type; char metadata[25]; } xa9typetoextrameta[] =
+ {
+ { FOURCC_0xa9wrt, N_("Writer") },
+ { FOURCC_0xa9com, N_("Composr") },
+ { FOURCC_0xa9prd, N_("Producer") },
+ { FOURCC_0xa9inf, N_("Information") },
+ { FOURCC_0xa9dir, N_("Director") },
+ { FOURCC_0xa9dis, N_("Disclaimer") },
+ { FOURCC_0xa9req, N_("Requirements") },
+ { FOURCC_0xa9fmt, N_("Original Format") },
+ { FOURCC_0xa9dsa, N_("Display Source As") },
+ { FOURCC_0xa9hst, N_("Host Computer") },
+ { FOURCC_0xa9prf, N_("Performers") },
+ { FOURCC_0xa9ope, N_("Original Performer") },
+ { FOURCC_0xa9src, N_("Providers Source Content") },
+ { FOURCC_0xa9wrn, N_("Warning") },
+ { FOURCC_0xa9swr, N_("Software") },
+ { FOURCC_0xa9lyr, N_("Lyrics") },
+ { FOURCC_0xa9mak, N_("Make") },
+ { FOURCC_0xa9mod, N_("Model") },
+ { FOURCC_0xa9PRD, N_("Product") },
+ { FOURCC_0xa9grp, N_("Grouping") },
+ { 0, "" },
+ };
+ for( unsigned i = 0; xa9typetoextrameta[i].xa9_type; i++ )
+ {
+ if( p_0xa9xxx->i_type == xa9typetoextrameta[i].xa9_type )
+ {
+ char *psz_utf = strdup( p_0xa9xxx->data.p_0xa9xxx->psz_text ? p_0xa9xxx->data.p_0xa9xxx->psz_text : "" );
+ if( psz_utf )
+ {
+ EnsureUTF8( psz_utf );
+ vlc_meta_AddExtra( p_meta, _(xa9typetoextrameta[i].metadata), psz_utf );
+ free( psz_utf );
+ }
+ break;
+ }
+ }
}
return VLC_SUCCESS;
}
case VLC_FOURCC( 'a', 'l', 'a', 'w' ):
case VLC_FOURCC( 'u', 'l', 'a', 'w' ):
p_soun->i_samplesize = 8;
+ p_track->i_sample_size = p_soun->i_channelcount;
break;
case VLC_FOURCC( 'N', 'O', 'N', 'E' ):
case VLC_FOURCC( 'r', 'a', 'w', ' ' ):
p_soun->i_qt_version = 0;
}
}
+ else if( p_track->fmt.i_cat == AUDIO_ES && p_sample->data.p_sample_soun->i_qt_version == 1 )
+ {
+ MP4_Box_data_sample_soun_t *p_soun = p_sample->data.p_sample_soun;
+
+ switch( p_sample->i_type )
+ {
+ case( VLC_FOURCC( '.', 'm', 'p', '3' ) ):
+ case( VLC_FOURCC( 'm', 's', 0x00, 0x55 ) ):
+ {
+ if( p_track->i_sample_size > 1 )
+ p_soun->i_qt_version = 0;
+ break;
+ }
+ case( VLC_FOURCC( 'a', 'c', '-', '3' ) ):
+ case( VLC_FOURCC( 'e', 'c', '-', '3' ) ):
+ case( VLC_FOURCC( 'm', 's', 0x20, 0x00 ) ):
+ p_soun->i_qt_version = 0;
+ break;
+ default:
+ break;
+ }
+ }
/* */
switch( p_track->fmt.i_cat )
case( VLC_FOURCC( '.', 'm', 'p', '3' ) ):
case( VLC_FOURCC( 'm', 's', 0x00, 0x55 ) ):
{
- MP4_Box_data_sample_soun_t *p_soun = p_sample->data.p_sample_soun;
p_track->fmt.i_codec = VLC_FOURCC( 'm', 'p', 'g', 'a' );
- if( p_track->i_sample_size > 1 )
- p_soun->i_qt_version = 0;
break;
}
case( VLC_FOURCC( 'a', 'c', '-', '3' ) ):
break;
case( 0x40):
p_track->fmt.i_codec = VLC_FOURCC( 'm','p','4','a' );
+ if( p_decconfig->i_decoder_specific_info_len >= 2 &&
+ p_decconfig->p_decoder_specific_info[0] == 0xF8 &&
+ (p_decconfig->p_decoder_specific_info[1]&0xE0) == 0x80 )
+ {
+ p_track->fmt.i_codec = VLC_CODEC_ALS;
+ }
break;
case( 0x60):
case( 0x61):
p_track->fmt.i_extra);
}
break;
+ case VLC_FOURCC( 's', 'a', 'm', 'r' ):
+ p_track->fmt.audio.i_rate = 8000;
case VLC_FOURCC( 'Q', 'D', 'M', 'C' ):
case VLC_FOURCC( 'Q', 'D', 'M', '2' ):
- case VLC_FOURCC( 's', 'a', 'm', 'r' ):
case VLC_FOURCC( 'a', 'l', 'a', 'c' ):
p_track->fmt.i_extra =
p_sample->data.p_sample_soun->i_qt_description;