From ac2d0170a8c35a0764d386d81be567eec0ebe735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 14 May 2010 13:31:42 +0200 Subject: [PATCH] oggdemux: Fix granulepos->key granule calculation for Dirac --- ext/ogg/gstoggstream.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/ext/ogg/gstoggstream.c b/ext/ogg/gstoggstream.c index 1e766c1d5b..cbcb6d9ef1 100644 --- a/ext/ogg/gstoggstream.c +++ b/ext/ogg/gstoggstream.c @@ -465,6 +465,29 @@ granule_to_granulepos_dirac (GstOggStream * pad, gint64 granule, return -1; } +static gint64 +granulepos_to_key_granule_dirac (GstOggStream * pad, gint64 gp) +{ + gint64 pt; + int dist_h; + int dist_l; + int dist; + int delay; + gint64 dt; + + if (gp == -1 || gp == 0) + return gp; + + pt = ((gp >> 22) + (gp & OGG_DIRAC_GRANULE_LOW_MASK)) >> 9; + dist_h = (gp >> 22) & 0xff; + dist_l = gp & 0xff; + dist = (dist_h << 8) | dist_l; + delay = (gp >> 9) & 0x1fff; + dt = pt - delay; + + return dt - 2 * dist + 4; +} + /* VP8 */ static gboolean @@ -1600,7 +1623,7 @@ static const GstOggMap mappers[] = { is_keyframe_dirac, is_header_count, packet_duration_constant, - NULL + granulepos_to_key_granule_dirac }, { "VP80\1", 5, 4,