Mercurial > libavformat.hg
changeset 3261:bf5f112efcff libavformat
parse mpeg4audio config to correctly detect mp3on4, fix iso mp3on4 reference files
author | bcoudurier |
---|---|
date | Fri, 25 Apr 2008 14:03:28 +0000 |
parents | ffd1506d3e3b |
children | 07299732f3b8 |
files | mov.c |
diffstat | 1 files changed, 16 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/mov.c Fri Apr 25 13:56:08 2008 +0000 +++ b/mov.c Fri Apr 25 14:03:28 2008 +0000 @@ -27,6 +27,7 @@ #include "riff.h" #include "isom.h" #include "dv.h" +#include "mpeg4audio.h" #ifdef CONFIG_ZLIB #include <zlib.h> @@ -361,6 +362,14 @@ #define MP4DecConfigDescrTag 0x04 #define MP4DecSpecificDescrTag 0x05 +static const AVCodecTag mp4_audio_types[] = { + { CODEC_ID_MP3ON4, 29 }, /* old mp3on4 draft */ + { CODEC_ID_MP3ON4, 32 }, /* layer 1 */ + { CODEC_ID_MP3ON4, 33 }, /* layer 2 */ + { CODEC_ID_MP3ON4, 34 }, /* layer 3 */ + { CODEC_ID_NONE, 0 }, +}; + static int mov_read_esds(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) { AVStream *st = c->fc->streams[c->fc->nb_streams-1]; @@ -394,9 +403,13 @@ return AVERROR(ENOMEM); get_buffer(pb, st->codec->extradata, len); st->codec->extradata_size = len; - /* from mplayer */ - if ((*st->codec->extradata >> 3) == 29) { - st->codec->codec_id = CODEC_ID_MP3ON4; + if (st->codec->codec_id == CODEC_ID_AAC) { + MPEG4AudioConfig cfg; + ff_mpeg4audio_get_config(&cfg, st->codec->extradata, + st->codec->extradata_size); + if (!(st->codec->codec_id = codec_get_id(mp4_audio_types, + cfg.object_type))) + st->codec->codec_id = CODEC_ID_AAC; } } }