|
|
@@ -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; |
|
|
|
|
|
|
|