mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 00:31:13 +00:00
basesrc: Send an update NEWSEGMENT event downstream if the duration changes
This allows streaming the complete file for files that have grown since streaming started. Fixes bug #647940.
This commit is contained in:
parent
8a3721a1ca
commit
934faf163c
1 changed files with 24 additions and 0 deletions
|
@ -2028,6 +2028,7 @@ gst_base_src_update_length (GstBaseSrc * src, guint64 offset, guint * length)
|
||||||
GstBaseSrcClass *bclass;
|
GstBaseSrcClass *bclass;
|
||||||
GstFormat format;
|
GstFormat format;
|
||||||
gint64 stop;
|
gint64 stop;
|
||||||
|
gboolean updated = FALSE;
|
||||||
|
|
||||||
bclass = GST_BASE_SRC_GET_CLASS (src);
|
bclass = GST_BASE_SRC_GET_CLASS (src);
|
||||||
|
|
||||||
|
@ -2083,10 +2084,33 @@ gst_base_src_update_length (GstBaseSrc * src, guint64 offset, guint * length)
|
||||||
/* keep track of current position and update duration.
|
/* keep track of current position and update duration.
|
||||||
* segment is in bytes, we checked that above. */
|
* segment is in bytes, we checked that above. */
|
||||||
GST_OBJECT_LOCK (src);
|
GST_OBJECT_LOCK (src);
|
||||||
|
updated = (src->segment.duration != size);
|
||||||
gst_segment_set_duration (&src->segment, GST_FORMAT_BYTES, size);
|
gst_segment_set_duration (&src->segment, GST_FORMAT_BYTES, size);
|
||||||
gst_segment_set_last_stop (&src->segment, GST_FORMAT_BYTES, offset);
|
gst_segment_set_last_stop (&src->segment, GST_FORMAT_BYTES, offset);
|
||||||
GST_OBJECT_UNLOCK (src);
|
GST_OBJECT_UNLOCK (src);
|
||||||
|
|
||||||
|
/* If we updated the duration and doing forward playback, we
|
||||||
|
* have to update the downstream segments to update the stop
|
||||||
|
* position */
|
||||||
|
if (updated && src->segment.rate >= 0.0) {
|
||||||
|
gint64 stop;
|
||||||
|
GstEvent *event;
|
||||||
|
|
||||||
|
/* for deriving a stop position for the playback segment from the seek
|
||||||
|
* segment, we must take the duration when the stop is not set */
|
||||||
|
if ((stop = src->segment.stop) == -1)
|
||||||
|
stop = src->segment.duration;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (src, "Sending update newsegment from %" G_GINT64_FORMAT
|
||||||
|
" to %" G_GINT64_FORMAT, src->segment.start, stop);
|
||||||
|
|
||||||
|
event =
|
||||||
|
gst_event_new_new_segment_full (TRUE,
|
||||||
|
src->segment.rate, src->segment.applied_rate, src->segment.format,
|
||||||
|
src->segment.start, stop, src->segment.time);
|
||||||
|
gst_pad_push_event (src->srcpad, event);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
|
|
Loading…
Reference in a new issue