From 7c8d477299c9b5e89fc30ed22f9e42b50761342c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= Date: Mon, 6 Feb 2012 22:04:46 +0100 Subject: [PATCH] Make AAC in Ogg (ogm) work. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This needs the extradata to be extracted. The approach used is the one MPlayer uses, though it is unclear whether the 4 bytes extradata that are skipped should be skipped always or only for AAC. The AAC parser must be disabled, too, otherwise playback still does not work. Fixes trac issue #547. Signed-off-by: Reimar Döffinger --- libavformat/oggparseogm.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/libavformat/oggparseogm.c b/libavformat/oggparseogm.c index 0a8a7c6bd4..36f61c7680 100644 --- a/libavformat/oggparseogm.c +++ b/libavformat/oggparseogm.c @@ -23,6 +23,7 @@ **/ #include +#include "libavutil/avassert.h" #include "libavutil/intreadwrite.h" #include "libavcodec/get_bits.h" #include "libavcodec/bytestream.h" @@ -40,6 +41,7 @@ ogm_header(AVFormatContext *s, int idx) const uint8_t *p = os->buf + os->pstart; uint64_t time_unit; uint64_t spu; + uint32_t size; if(!(*p & 1)) return 0; @@ -67,11 +69,13 @@ ogm_header(AVFormatContext *s, int idx) acid[4] = 0; cid = strtol(acid, NULL, 16); st->codec->codec_id = ff_codec_get_id(ff_codec_wav_tags, cid); - st->need_parsing = AVSTREAM_PARSE_FULL; + // our parser completely breaks AAC in Ogg + if (st->codec->codec_id != CODEC_ID_AAC) + st->need_parsing = AVSTREAM_PARSE_FULL; } - p += 4; /* useless size field */ - + size = bytestream_get_le32(&p); + size = FFMIN(size, os->psize); time_unit = bytestream_get_le64(&p); spu = bytestream_get_le64(&p); p += 4; /* default_len */ @@ -89,6 +93,17 @@ ogm_header(AVFormatContext *s, int idx) st->codec->bit_rate = bytestream_get_le32(&p) * 8; st->codec->sample_rate = spu * 10000000 / time_unit; avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate); + if (size >= 56 && st->codec->codec_id == CODEC_ID_AAC) { + p += 4; + size -= 4; + } + if (size > 52) { + av_assert0(FF_INPUT_BUFFER_PADDING_SIZE <= 52); + size -= 52; + st->codec->extradata_size = size; + st->codec->extradata = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE); + bytestream_get_buffer(&p, st->codec->extradata, size); + } } } else if (*p == 3) { if (os->psize > 8)