diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2006-02-22 00:18:12 +0000 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2006-02-22 00:18:12 +0000 |
commit | 571fa531056c8b1e221868d1404fac4c1eaa676e (patch) | |
tree | e073957cdb786db832847cc3b86b8710635f70b3 | |
parent | 5cb9fda4b02140cb7c950c0c4208185a9a5bfb96 (diff) | |
download | ffmpeg-571fa531056c8b1e221868d1404fac4c1eaa676e.tar.gz |
support correct ptses on other than version 3.2.0 aswell
Originally committed as revision 5047 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/oggparsetheora.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/libavformat/oggparsetheora.c b/libavformat/oggparsetheora.c index f1820e8b63..2f35d1b73c 100644 --- a/libavformat/oggparsetheora.c +++ b/libavformat/oggparsetheora.c @@ -1,5 +1,5 @@ /** - Copyright (C) 2005 Matthieu CASTET + Copyright (C) 2005 Matthieu CASTET, Alex Beregszaszi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation @@ -53,26 +53,41 @@ theora_header (AVFormatContext * s, int idx) if (os->buf[os->pstart] == 0x80) { GetBitContext gb; + int version; + init_get_bits(&gb, os->buf + os->pstart, os->psize*8); skip_bits(&gb, 7*8); /* 0x80"theora" */ - if(get_bits(&gb, 8) != 3) /* major version */ - return -1; - if(get_bits(&gb, 8) != 2) /* minor version */ + + version = get_bits(&gb, 8) << 16; + version |= get_bits(&gb, 8) << 8; + version |= get_bits(&gb, 8); + + if (version < 0x030100) + { + av_log(s, AV_LOG_ERROR, + "Too old or unsupported Theora (%x)\n", version); return -1; - skip_bits(&gb, 8); /* revision */ + } st->codec->width = get_bits(&gb, 16) << 4; st->codec->height = get_bits(&gb, 16) << 4; - skip_bits(&gb, 64); + if (version >= 0x030400) + skip_bits(&gb, 164); + else + skip_bits(&gb, 64); st->codec->time_base.den = get_bits(&gb, 32); st->codec->time_base.num = get_bits(&gb, 32); st->codec->sample_aspect_ratio.num = get_bits(&gb, 24); st->codec->sample_aspect_ratio.den = get_bits(&gb, 24); - skip_bits(&gb, 38); + if (version >= 0x030200) + skip_bits(&gb, 38); + if (version >= 0x304000) + skip_bits(&gb, 2); + thp->gpshift = get_bits(&gb, 5); thp->gpmask = (1 << thp->gpshift) - 1; |