From: Sebastian Dröge Date: Thu, 13 Feb 2014 11:07:50 +0000 (+0100) Subject: basesrc: Add gst_base_src_set_automatic_eos() API X-Git-Tag: 1.3.1~156 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f47c704b99b6a9753e8a3f12be483988a937081c;p=platform%2Fupstream%2Fgstreamer.git 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. --- diff --git a/docs/libs/gstreamer-libs-sections.txt b/docs/libs/gstreamer-libs-sections.txt index f16744c..99dfb1c 100644 --- a/docs/libs/gstreamer-libs-sections.txt +++ b/docs/libs/gstreamer-libs-sections.txt @@ -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 diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c index 5bb0460..878eced 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 9afd5e0..8b9eb4d 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); diff --git a/win32/common/libgstbase.def b/win32/common/libgstbase.def index e84db3a..fac5702 100644 --- a/win32/common/libgstbase.def +++ b/win32/common/libgstbase.def @@ -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