Mercurial > libavformat.hg
changeset 4017:b2a3ed76122e libavformat
OGG: correct PTS with old theora streams
author | mru |
---|---|
date | Thu, 06 Nov 2008 01:57:17 +0000 |
parents | 6cd006bc2de9 |
children | 0c2f650d31bb |
files | oggparsetheora.c |
diffstat | 1 files changed, 11 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/oggparsetheora.c Thu Nov 06 01:50:56 2008 +0000 +++ b/oggparsetheora.c Thu Nov 06 01:57:17 2008 +0000 @@ -31,6 +31,7 @@ struct theora_params { int gpshift; int gpmask; + unsigned version; }; static int @@ -54,17 +55,16 @@ 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 @@ 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 @@ 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 @@ uint64_t iframe = gp >> thp->gpshift; uint64_t pframe = gp & thp->gpmask; + if (thp->version < 0x030201) + iframe++; + if(!pframe) os->pflags |= PKT_FLAG_KEY;