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
This commit is contained in:
Thijs Vermeir 2008-07-24 14:47:58 +00:00
parent 4abe96918a
commit 4d9689b66a
3 changed files with 25 additions and 11 deletions

View file

@ -1,3 +1,10 @@
2008-07-24 Thijs Vermeir <thijsvermeir@gmail.com>
* libs/gst/base/gstbasesrc.c:
* libs/gst/base/gstbasesrc.h:
Don't cache the seekable status.
Fixes bug #544174
2008-07-24 Rene Stadler <mail@renestadler.de>
* docs/manual/advanced-autoplugging.xml: Add fakesink to example

View file

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

View file

@ -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 */