basesrc: Fix automatic-eos=false mode if a segment.stop is given

If segment.stop was given, and the subclass provides a size that might be
smaller than segment.stop and also smaller than the actual size, we would
already stop there.

Instead try reading up to segment.stop, the goal is to ignore the (possibly
inaccurate) size the subclass gives and finish until segment.stop or when the
subclass tells us to stop.
This commit is contained in:
Sebastian Dröge 2016-07-12 12:32:56 +03:00
parent 30ebde7b0f
commit af0d087bbd

View file

@ -2363,21 +2363,26 @@ gst_base_src_update_length (GstBaseSrc * src, guint64 offset, guint * length,
if (!bclass->get_size (src, &size))
size = -1;
/* make sure we don't exceed the configured segment stop
* if it was set */
if (stop != -1)
maxsize = MIN (size, stop);
/* when not doing automatic EOS, just use the stop position. We don't use
* the size to check for EOS */
if (!g_atomic_int_get (&src->priv->automatic_eos))
maxsize = stop;
/* Otherwise, the max amount of bytes to read is the total
* size or up to the segment.stop if present. */
else if (stop != -1)
maxsize = size != -1 ? MIN (size, stop) : stop;
else
maxsize = size;
/* if we are at or past the end, EOS */
if (G_UNLIKELY (offset >= maxsize))
goto unexpected_length;
/* else we can clip to the end */
if (G_UNLIKELY (offset + *length >= maxsize))
*length = maxsize - offset;
if (maxsize != -1) {
/* if we are at or past the end, EOS */
if (G_UNLIKELY (offset >= maxsize))
goto unexpected_length;
/* else we can clip to the end */
if (G_UNLIKELY (offset + *length >= maxsize))
*length = maxsize - offset;
}
}
}