diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2014-02-13 12:07:50 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-02-13 12:09:06 +0100 |
commit | f47c704b99b6a9753e8a3f12be483988a937081c (patch) | |
tree | 5530e3598c4518aadd0ce14bf61f1af51319bf31 /libs | |
parent | be8eeabefcec730747369b63395dba941eaf9c69 (diff) | |
download | gstreamer-f47c704b99b6a9753e8a3f12be483988a937081c.tar.gz |
basesrc: Add gst_base_src_set_automatic_eos() API
This defaults to TRUE and if it is set to FALSE it is the subclasses
responsibility to return GST_FLOW_EOS from the create() vmethod once
the stream is done.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/gst/base/gstbasesrc.c | 26 | ||||
-rw-r--r-- | libs/gst/base/gstbasesrc.h | 2 |
2 files changed, 27 insertions, 1 deletions
diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c index 5bb046012c..878ecedbc1 100644 --- a/libs/gst/base/gstbasesrc.c +++ b/libs/gst/base/gstbasesrc.c @@ -252,6 +252,7 @@ struct _GstBaseSrcPrivate gboolean do_timestamp; volatile gint dynamic_size; + volatile gint automatic_eos; /* stream sequence number */ guint32 seqnum; @@ -435,6 +436,7 @@ gst_base_src_init (GstBaseSrc * basesrc, gpointer g_class) g_cond_init (&basesrc->live_cond); basesrc->num_buffers = DEFAULT_NUM_BUFFERS; basesrc->num_buffers_left = -1; + basesrc->priv->automatic_eos = TRUE; basesrc->can_activate_push = TRUE; @@ -625,6 +627,26 @@ gst_base_src_set_dynamic_size (GstBaseSrc * src, gboolean dynamic) } /** + * gst_base_src_set_automatic_eos: + * @src: base source instance + * @automatic_eos: automatic eos + * + * If @automatic_eos is %TRUE, basesrc will automatically go EOS if a buffer + * after the total size is returned. By default this is %TRUE but sources + * that can't return an authoritative size and only know that they're EOS + * when trying to read more should set this to %FALSE. + * + * Since: 1.4 + */ +void +gst_base_src_set_automatic_eos (GstBaseSrc * src, gboolean automatic_eos) +{ + g_return_if_fail (GST_IS_BASE_SRC (src)); + + g_atomic_int_set (&src->priv->automatic_eos, automatic_eos); +} + +/** * gst_base_src_set_async: * @src: base source instance * @async: new async mode @@ -2299,6 +2321,8 @@ gst_base_src_update_length (GstBaseSrc * src, guint64 offset, guint * length, stop = src->segment.stop; /* get total file size */ size = src->segment.duration; + if (!g_atomic_int_get (&src->priv->automatic_eos)) + size = -1; /* only operate if we are working with bytes */ if (format != GST_FORMAT_BYTES) @@ -2307,7 +2331,7 @@ gst_base_src_update_length (GstBaseSrc * src, guint64 offset, guint * length, /* the max amount of bytes to read is the total size or * up to the segment.stop if present. */ if (stop != -1) - maxsize = MIN (size, stop); + maxsize = size != -1 ? MIN (size, stop) : stop; else maxsize = size; diff --git a/libs/gst/base/gstbasesrc.h b/libs/gst/base/gstbasesrc.h index 9afd5e0491..8b9eb4dbb0 100644 --- a/libs/gst/base/gstbasesrc.h +++ b/libs/gst/base/gstbasesrc.h @@ -239,6 +239,8 @@ void gst_base_src_set_format (GstBaseSrc *src, GstFormat format void gst_base_src_set_dynamic_size (GstBaseSrc * src, gboolean dynamic); +void gst_base_src_set_automatic_eos (GstBaseSrc * src, gboolean automatic_eos); + void gst_base_src_set_async (GstBaseSrc *src, gboolean async); gboolean gst_base_src_is_async (GstBaseSrc *src); |