[FFmpeg-devel] [PATCH] [RFC] Make AAC in Ogg (ogm) work.

Reimar Döffinger Reimar.Doeffinger at gmx.de
Mon Feb 6 22:07:43 CET 2012


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.
For some unexplainable reason the AAC parser must be
disabled, too, otherwise playback still does not work.
Fixes trac issue #547.

Signed-off-by: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
---
 libavformat/oggparseogm.c |   17 ++++++++++++++---
 1 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/libavformat/oggparseogm.c b/libavformat/oggparseogm.c
index 0a8a7c6..5d19edb 100644
--- a/libavformat/oggparseogm.c
+++ b/libavformat/oggparseogm.c
@@ -40,6 +40,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 +68,11 @@ 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;
+//            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 +90,16 @@ 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) {
+                size -= 52;
+                st->codec->extradata_size = size;
+                st->codec->extradata = av_malloc(size);
+                bytestream_get_buffer(&p, st->codec->extradata, size);
+            }
         }
     } else if (*p == 3) {
         if (os->psize > 8)
-- 
1.7.9



More information about the ffmpeg-devel mailing list