Commit 7c8d4772 authored by Reimar Döffinger's avatar Reimar Döffinger

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: 's avatarReimar Döffinger <Reimar.Doeffinger@gmx.de>
parent 4538d660
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
**/ **/
#include <stdlib.h> #include <stdlib.h>
#include "libavutil/avassert.h"
#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "libavcodec/get_bits.h" #include "libavcodec/get_bits.h"
#include "libavcodec/bytestream.h" #include "libavcodec/bytestream.h"
...@@ -40,6 +41,7 @@ ogm_header(AVFormatContext *s, int idx) ...@@ -40,6 +41,7 @@ ogm_header(AVFormatContext *s, int idx)
const uint8_t *p = os->buf + os->pstart; const uint8_t *p = os->buf + os->pstart;
uint64_t time_unit; uint64_t time_unit;
uint64_t spu; uint64_t spu;
uint32_t size;
if(!(*p & 1)) if(!(*p & 1))
return 0; return 0;
...@@ -67,11 +69,13 @@ ogm_header(AVFormatContext *s, int idx) ...@@ -67,11 +69,13 @@ ogm_header(AVFormatContext *s, int idx)
acid[4] = 0; acid[4] = 0;
cid = strtol(acid, NULL, 16); cid = strtol(acid, NULL, 16);
st->codec->codec_id = ff_codec_get_id(ff_codec_wav_tags, cid); st->codec->codec_id = ff_codec_get_id(ff_codec_wav_tags, cid);
// our parser completely breaks AAC in Ogg
if (st->codec->codec_id != CODEC_ID_AAC)
st->need_parsing = AVSTREAM_PARSE_FULL; 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); time_unit = bytestream_get_le64(&p);
spu = bytestream_get_le64(&p); spu = bytestream_get_le64(&p);
p += 4; /* default_len */ p += 4; /* default_len */
...@@ -89,6 +93,17 @@ ogm_header(AVFormatContext *s, int idx) ...@@ -89,6 +93,17 @@ ogm_header(AVFormatContext *s, int idx)
st->codec->bit_rate = bytestream_get_le32(&p) * 8; st->codec->bit_rate = bytestream_get_le32(&p) * 8;
st->codec->sample_rate = spu * 10000000 / time_unit; st->codec->sample_rate = spu * 10000000 / time_unit;
avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate); 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) { } else if (*p == 3) {
if (os->psize > 8) if (os->psize > 8)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment