basesrc: Add gst_base_src_set_automatic_eos() API
authorSebastian Dröge <sebastian@centricular.com>
Thu, 13 Feb 2014 11:07:50 +0000 (12:07 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 13 Feb 2014 11:09:06 +0000 (12:09 +0100)
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.

docs/libs/gstreamer-libs-sections.txt
libs/gst/base/gstbasesrc.c
libs/gst/base/gstbasesrc.h
win32/common/libgstbase.def

index f16744c..99dfb1c 100644 (file)
@@ -256,6 +256,7 @@ gst_base_src_set_blocksize
 gst_base_src_get_do_timestamp
 gst_base_src_set_do_timestamp
 gst_base_src_set_dynamic_size
+gst_base_src_set_automatic_eos
 gst_base_src_new_seamless_segment
 gst_base_src_set_caps
 gst_base_src_get_allocator
index 5bb0460..878eced 100644 (file)
@@ -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;
 
index 9afd5e0..8b9eb4d 100644 (file)
@@ -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);
 
index e84db3a..fac5702 100644 (file)
@@ -77,6 +77,7 @@ EXPORTS
        gst_base_src_new_seamless_segment
        gst_base_src_query_latency
        gst_base_src_set_async
+       gst_base_src_set_automatic_eos
        gst_base_src_set_blocksize
        gst_base_src_set_caps
        gst_base_src_set_do_timestamp