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

Michael Niedermayer michaelni at gmx.at
Fri Feb 17 22:02:32 CET 2012


On Fri, Feb 17, 2012 at 08:42:39PM +0100, Reimar Döffinger wrote:
> 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 <Reimar.Doeffinger at gmx.de>
> ---
>  libavformat/oggparseogm.c |   19 ++++++++++++++++---
>  1 files changed, 16 insertions(+), 3 deletions(-)
> 
> diff --git a/libavformat/oggparseogm.c b/libavformat/oggparseogm.c
> index 0a8a7c6..a7e5aaa 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,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 +92,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);

this probably should have padding added

otherwise, LGTM

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

DNS cache poisoning attacks, popular search engine, Google internet authority
dont be evil, please
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20120217/73d88dbc/attachment.asc>


More information about the ffmpeg-devel mailing list