mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
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:
parent
be8eeabefc
commit
f47c704b99
4 changed files with 29 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue