diff --git a/ext/ogg/gstoggstream.c b/ext/ogg/gstoggstream.c index 02c5abad1f..5ec4abbd22 100644 --- a/ext/ogg/gstoggstream.c +++ b/ext/ogg/gstoggstream.c @@ -299,6 +299,26 @@ setup_theora_mapper (GstOggStream * pad, ogg_packet * packet) return TRUE; } +static gint64 +granulepos_to_granule_theora (GstOggStream * pad, gint64 granulepos) +{ + gint64 keyindex, keyoffset; + + if (pad->granuleshift != 0) { + keyindex = granulepos >> pad->granuleshift; + keyoffset = granulepos - (keyindex << pad->granuleshift); + if (keyoffset == 0) { + pad->theora_has_zero_keyoffset = TRUE; + } + if (pad->theora_has_zero_keyoffset) { + keyoffset++; + } + return keyindex + keyoffset; + } else { + return granulepos; + } +} + static gboolean is_keyframe_theora (GstOggStream * pad, gint64 granulepos) { @@ -944,7 +964,7 @@ static const GstOggMap mappers[] = { "\200theora", 7, 42, "video/x-theora", setup_theora_mapper, - granulepos_to_granule_default, + granulepos_to_granule_theora, granule_to_granulepos_default, is_keyframe_theora, is_header_theora, diff --git a/ext/ogg/gstoggstream.h b/ext/ogg/gstoggstream.h index f359e90d84..752a3fcad3 100644 --- a/ext/ogg/gstoggstream.h +++ b/ext/ogg/gstoggstream.h @@ -63,6 +63,8 @@ struct _GstOggStream int vorbis_log2_num_modes; int vorbis_mode_sizes[256]; int last_size; + /* theora stuff */ + gboolean theora_has_zero_keyoffset; };