Skip to content
Snippets Groups Projects
Commit 7c8d4772 authored by Reimar Döffinger's avatar Reimar Döffinger
Browse files

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: default avatarReimar Döffinger <Reimar.Doeffinger@gmx.de>
parent 4538d660
No related branches found
No related tags found
No related merge requests found
...@@ -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);
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); 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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment