summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2014-02-13 12:07:50 +0100
committerSebastian Dröge <sebastian@centricular.com>2014-02-13 12:09:06 +0100
commitf47c704b99b6a9753e8a3f12be483988a937081c (patch)
tree5530e3598c4518aadd0ce14bf61f1af51319bf31 /libs
parentbe8eeabefcec730747369b63395dba941eaf9c69 (diff)
downloadgstreamer-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.c26
-rw-r--r--libs/gst/base/gstbasesrc.h2
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);