support correct ptses on other than version 3.2.0 aswell

Originally committed as revision 5047 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Alex Beregszaszi 2006-02-22 00:18:12 +00:00
parent 5cb9fda4b0
commit 571fa53105
1 changed files with 22 additions and 7 deletions

View File

@ -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 Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation 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) { if (os->buf[os->pstart] == 0x80) {
GetBitContext gb; GetBitContext gb;
int version;
init_get_bits(&gb, os->buf + os->pstart, os->psize*8); init_get_bits(&gb, os->buf + os->pstart, os->psize*8);
skip_bits(&gb, 7*8); /* 0x80"theora" */ skip_bits(&gb, 7*8); /* 0x80"theora" */
if(get_bits(&gb, 8) != 3) /* major 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; return -1;
if(get_bits(&gb, 8) != 2) /* minor version */ }
return -1;
skip_bits(&gb, 8); /* revision */
st->codec->width = get_bits(&gb, 16) << 4; st->codec->width = get_bits(&gb, 16) << 4;
st->codec->height = 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.den = get_bits(&gb, 32);
st->codec->time_base.num = 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.num = get_bits(&gb, 24);
st->codec->sample_aspect_ratio.den = 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->gpshift = get_bits(&gb, 5);
thp->gpmask = (1 << thp->gpshift) - 1; thp->gpmask = (1 << thp->gpshift) - 1;