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> 2008-07-24 Rene Stadler <mail@renestadler.de>
* docs/manual/advanced-autoplugging.xml: Add fakesink to example * 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); guint length, GstBuffer ** buf);
static GstFlowReturn gst_base_src_get_range (GstBaseSrc * src, guint64 offset, static GstFlowReturn gst_base_src_get_range (GstBaseSrc * src, guint64 offset,
guint length, GstBuffer ** buf); guint length, GstBuffer ** buf);
static gboolean gst_base_src_seekable (GstBaseSrc * src);
static void static void
gst_base_src_base_init (gpointer g_class) 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: case GST_QUERY_SEEKING:
{ {
gst_query_set_seeking (query, src->segment.format, 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; res = TRUE;
break; 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 static gboolean
gst_base_src_default_event (GstBaseSrc * src, GstEvent * event) 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)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_SEEK: case GST_EVENT_SEEK:
/* is normally called when in push mode */ /* is normally called when in push mode */
if (!src->seekable) if (!gst_base_src_seekable (src))
goto not_seekable; goto not_seekable;
result = gst_base_src_perform_seek (src, event, TRUE); result = gst_base_src_perform_seek (src, event, TRUE);
@ -2347,6 +2359,7 @@ gst_base_src_start (GstBaseSrc * basesrc)
GstBaseSrcClass *bclass; GstBaseSrcClass *bclass;
gboolean result; gboolean result;
guint64 size; guint64 size;
gboolean seekable;
if (GST_OBJECT_FLAG_IS_SET (basesrc, GST_BASE_SRC_STARTED)) if (GST_OBJECT_FLAG_IS_SET (basesrc, GST_BASE_SRC_STARTED))
return TRUE; return TRUE;
@ -2391,16 +2404,11 @@ gst_base_src_start (GstBaseSrc * basesrc)
G_GINT64_FORMAT, basesrc->segment.format, result, size, G_GINT64_FORMAT, basesrc->segment.format, result, size,
basesrc->segment.duration); basesrc->segment.duration);
/* check if we can seek */ seekable = gst_base_src_seekable (basesrc);
if (bclass->is_seekable) GST_DEBUG_OBJECT (basesrc, "is seekable: %d", seekable);
basesrc->seekable = bclass->is_seekable (basesrc);
else
basesrc->seekable = FALSE;
GST_DEBUG_OBJECT (basesrc, "is seekable: %d", basesrc->seekable);
/* update for random access flag */ /* update for random access flag */
basesrc->random_access = basesrc->seekable && basesrc->random_access = seekable &&
basesrc->segment.format == GST_FORMAT_BYTES; basesrc->segment.format == GST_FORMAT_BYTES;
GST_DEBUG_OBJECT (basesrc, "is random_access: %d", basesrc->random_access); 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 */ gint blocksize; /* size of buffers when operating push based */
gboolean can_activate_push; /* some scheduling properties */ gboolean can_activate_push; /* some scheduling properties */
GstActivateMode pad_mode; GstActivateMode pad_mode;
gboolean seekable;
gboolean random_access; gboolean random_access;
GstClockID clock_id; /* for syncing */ GstClockID clock_id; /* for syncing */