From e3b07e1a74abea3534f6e922d364c70c47521f2c Mon Sep 17 00:00:00 2001 From: Måns Rullgård Date: Thu, 6 Nov 2008 01:57:17 +0000 Subject: OGG: correct PTS with old theora streams Originally committed as revision 15785 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/oggparsetheora.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'libavformat') 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; -- cgit v1.2.3