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.
This commit is contained in:
Sebastian Dröge 2014-02-13 12:07:50 +01:00
parent be8eeabefc
commit f47c704b99
4 changed files with 29 additions and 1 deletions

View 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

View 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;
@ -624,6 +626,26 @@ gst_base_src_set_dynamic_size (GstBaseSrc * src, gboolean dynamic)
g_atomic_int_set (&src->priv->dynamic_size, 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
@ -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;

View 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);

View 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