From 4d9689b66a276ae01538c07ecb91fdcd8f785e13 Mon Sep 17 00:00:00 2001 From: Thijs Vermeir Date: Thu, 24 Jul 2008 14:47:58 +0000 Subject: [PATCH] libs/gst/base/gstbasesrc.*: Don't cache the seekable status. Original commit message from CVS: * libs/gst/base/gstbasesrc.c: * libs/gst/base/gstbasesrc.h: Don't cache the seekable status. Fixes bug #544174 --- ChangeLog | 7 +++++++ libs/gst/base/gstbasesrc.c | 28 ++++++++++++++++++---------- libs/gst/base/gstbasesrc.h | 1 - 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index b78853ce3b..75056d5a3a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-07-24 Thijs Vermeir + + * libs/gst/base/gstbasesrc.c: + * libs/gst/base/gstbasesrc.h: + Don't cache the seekable status. + Fixes bug #544174 + 2008-07-24 Rene Stadler * docs/manual/advanced-autoplugging.xml: Add fakesink to example diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c index 7cd542923d..afc03a7ed6 100644 --- a/libs/gst/base/gstbasesrc.c +++ b/libs/gst/base/gstbasesrc.c @@ -319,6 +319,7 @@ static GstFlowReturn gst_base_src_pad_get_range (GstPad * pad, guint64 offset, guint length, GstBuffer ** buf); static GstFlowReturn gst_base_src_get_range (GstBaseSrc * src, guint64 offset, guint length, GstBuffer ** buf); +static gboolean gst_base_src_seekable (GstBaseSrc * src); static void gst_base_src_base_init (gpointer g_class) @@ -794,7 +795,7 @@ gst_base_src_default_query (GstBaseSrc * src, GstQuery * query) case GST_QUERY_SEEKING: { gst_query_set_seeking (query, src->segment.format, - src->seekable, 0, src->segment.duration); + gst_base_src_seekable (src), 0, src->segment.duration); res = TRUE; break; } @@ -1445,6 +1446,17 @@ wrong_mode: } } +static gboolean +gst_base_src_seekable (GstBaseSrc * src) +{ + GstBaseSrcClass *bclass; + bclass = GST_BASE_SRC_GET_CLASS (src); + if (bclass->is_seekable) + return bclass->is_seekable (src); + else + return FALSE; +} + static gboolean gst_base_src_default_event (GstBaseSrc * src, GstEvent * event) { @@ -1453,7 +1465,7 @@ gst_base_src_default_event (GstBaseSrc * src, GstEvent * event) switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: /* is normally called when in push mode */ - if (!src->seekable) + if (!gst_base_src_seekable (src)) goto not_seekable; result = gst_base_src_perform_seek (src, event, TRUE); @@ -2347,6 +2359,7 @@ gst_base_src_start (GstBaseSrc * basesrc) GstBaseSrcClass *bclass; gboolean result; guint64 size; + gboolean seekable; if (GST_OBJECT_FLAG_IS_SET (basesrc, GST_BASE_SRC_STARTED)) return TRUE; @@ -2391,16 +2404,11 @@ gst_base_src_start (GstBaseSrc * basesrc) G_GINT64_FORMAT, basesrc->segment.format, result, size, basesrc->segment.duration); - /* check if we can seek */ - if (bclass->is_seekable) - basesrc->seekable = bclass->is_seekable (basesrc); - else - basesrc->seekable = FALSE; - - GST_DEBUG_OBJECT (basesrc, "is seekable: %d", basesrc->seekable); + seekable = gst_base_src_seekable (basesrc); + GST_DEBUG_OBJECT (basesrc, "is seekable: %d", seekable); /* update for random access flag */ - basesrc->random_access = basesrc->seekable && + basesrc->random_access = seekable && basesrc->segment.format == GST_FORMAT_BYTES; GST_DEBUG_OBJECT (basesrc, "is random_access: %d", basesrc->random_access); diff --git a/libs/gst/base/gstbasesrc.h b/libs/gst/base/gstbasesrc.h index f90e6e7ca6..a90df5ddfc 100644 --- a/libs/gst/base/gstbasesrc.h +++ b/libs/gst/base/gstbasesrc.h @@ -85,7 +85,6 @@ struct _GstBaseSrc { gint blocksize; /* size of buffers when operating push based */ gboolean can_activate_push; /* some scheduling properties */ GstActivateMode pad_mode; - gboolean seekable; gboolean random_access; GstClockID clock_id; /* for syncing */