diff options
author | Måns Rullgård <mans@mansr.com> | 2008-11-06 01:57:17 +0000 |
---|---|---|
committer | Måns Rullgård <mans@mansr.com> | 2008-11-06 01:57:17 +0000 |
commit | e3b07e1a74abea3534f6e922d364c70c47521f2c (patch) | |
tree | ffc86ba7614799c14e71015ea8a8ca9814634fe4 | |
parent | 77be08eeb199c8f3f78b3426e970decadbc1425c (diff) | |
download | ffmpeg-e3b07e1a74abea3534f6e922d364c70c47521f2c.tar.gz |
OGG: correct PTS with old theora streams
Originally committed as revision 15785 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/oggparsetheora.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/libavformat/oggparsetheora.c b/libavformat/oggparsetheora.c index c835fadf6b..2d362e6ecc 100644 --- a/libavformat/oggparsetheora.c +++ b/libavformat/oggparsetheora.c @@ -31,6 +31,7 @@ struct theora_params { int gpshift; int gpmask; + unsigned version; }; static int @@ -54,17 +55,16 @@ theora_header (AVFormatContext * s, int idx) if (os->buf[os->pstart] == 0x80) { GetBitContext gb; int width, height; - int version; init_get_bits(&gb, os->buf + os->pstart, os->psize*8); skip_bits(&gb, 7*8); /* 0x80"theora" */ - version = get_bits_long(&gb, 24); - if (version < 0x030100) + thp->version = get_bits_long(&gb, 24); + if (thp->version < 0x030100) { av_log(s, AV_LOG_ERROR, - "Too old or unsupported Theora (%x)\n", version); + "Too old or unsupported Theora (%x)\n", thp->version); return -1; } @@ -72,10 +72,10 @@ theora_header (AVFormatContext * s, int idx) height = get_bits(&gb, 16) << 4; avcodec_set_dimensions(st->codec, width, height); - if (version >= 0x030400) + if (thp->version >= 0x030400) skip_bits(&gb, 100); - if (version >= 0x030200) { + if (thp->version >= 0x030200) { width = get_bits_long(&gb, 24); height = get_bits_long(&gb, 24); if ( width <= st->codec->width && width > st->codec->width-16 @@ -91,9 +91,9 @@ theora_header (AVFormatContext * s, int idx) st->sample_aspect_ratio.num = get_bits_long(&gb, 24); st->sample_aspect_ratio.den = get_bits_long(&gb, 24); - if (version >= 0x030200) + if (thp->version >= 0x030200) skip_bits(&gb, 38); - if (version >= 0x304000) + if (thp->version >= 0x304000) skip_bits(&gb, 2); thp->gpshift = get_bits(&gb, 5); @@ -125,6 +125,9 @@ theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp) uint64_t iframe = gp >> thp->gpshift; uint64_t pframe = gp & thp->gpmask; + if (thp->version < 0x030201) + iframe++; + if(!pframe) os->pflags |= PKT_FLAG_KEY; |