summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReimar Döffinger <[email protected]>2012-02-06 22:04:46 +0100
committerReimar Döffinger <[email protected]>2012-02-18 12:04:14 +0100
commit7c8d477299c9b5e89fc30ed22f9e42b50761342c (patch)
treebb5d9152d9bc3173431541d84ad43bb245b5b524
parent4538d66010cedee83ea2cba4480f091c7cd02311 (diff)
Make AAC in Ogg (ogm) work.
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 <[email protected]>
-rw-r--r--libavformat/oggparseogm.c21
1 files 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 <stdlib.h>
+#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)