adaptivedemux: Check live seeking range more often

The live seeking range was only checked when doing actual seeks. This was
assuming that the rate would always be 1.0 (i.e. the playback would
advance in realtime, and therefore fragments would always be available
since the seeking window moves at the same rate).

With non-1.0 rates, this no longer becomes valid, and therefore we need
to check whether we are still within the live seeking range when advancing.

https://bugzilla.gnome.org/show_bug.cgi?id=783075
This commit is contained in:
Edward Hervey 2017-05-25 09:48:53 +02:00 committed by Edward Hervey
parent 2cf4ece73b
commit f4190a49c0

View file

@ -1446,6 +1446,25 @@ gst_adaptive_demux_get_live_seek_range (GstAdaptiveDemux * demux,
return klass->get_live_seek_range (demux, range_start, range_stop); return klass->get_live_seek_range (demux, range_start, range_stop);
} }
/* must be called with manifest_lock taken */
static gboolean
gst_adaptive_demux_stream_in_live_seek_range (GstAdaptiveDemux * demux,
GstAdaptiveDemuxStream * stream)
{
gint64 range_start, range_stop;
if (gst_adaptive_demux_get_live_seek_range (demux, &range_start, &range_stop)) {
GST_LOG_OBJECT (stream->pad,
"stream position %" GST_STIME_FORMAT " live seek range %"
GST_STIME_FORMAT " - %" GST_STIME_FORMAT,
GST_STIME_ARGS (stream->segment.position), GST_STIME_ARGS (range_start),
GST_STIME_ARGS (range_stop));
return (stream->segment.position >= range_start
&& stream->segment.position <= range_stop);
}
return FALSE;
}
/* must be called with manifest_lock taken */ /* must be called with manifest_lock taken */
static gboolean static gboolean
gst_adaptive_demux_can_seek (GstAdaptiveDemux * demux) gst_adaptive_demux_can_seek (GstAdaptiveDemux * demux)
@ -3703,7 +3722,8 @@ gst_adaptive_demux_stream_download_loop (GstAdaptiveDemuxStream * stream)
case GST_FLOW_EOS: case GST_FLOW_EOS:
GST_DEBUG_OBJECT (stream->pad, "EOS, checking to stop download loop"); GST_DEBUG_OBJECT (stream->pad, "EOS, checking to stop download loop");
/* we push the EOS after releasing the object lock */ /* we push the EOS after releasing the object lock */
if (gst_adaptive_demux_is_live (demux)) { if (gst_adaptive_demux_is_live (demux)
&& gst_adaptive_demux_stream_in_live_seek_range (demux, stream)) {
GstAdaptiveDemuxClass *demux_class = GstAdaptiveDemuxClass *demux_class =
GST_ADAPTIVE_DEMUX_GET_CLASS (demux); GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
@ -4120,7 +4140,15 @@ gst_adaptive_demux_stream_advance_fragment_unlocked (GstAdaptiveDemux * demux,
} }
GST_ADAPTIVE_DEMUX_SEGMENT_UNLOCK (demux); GST_ADAPTIVE_DEMUX_SEGMENT_UNLOCK (demux);
if (gst_adaptive_demux_is_live (demux) /* When advancing with a non 1.0 rate on live streams, we need to check
* the live seeking range again to make sure we can still advance to
* that position */
if (demux->segment.rate != 1.0 && gst_adaptive_demux_is_live (demux)) {
if (!gst_adaptive_demux_stream_in_live_seek_range (demux, stream))
ret = GST_FLOW_EOS;
else
ret = klass->stream_advance_fragment (stream);
} else if (gst_adaptive_demux_is_live (demux)
|| gst_adaptive_demux_stream_has_next_fragment (demux, stream)) { || gst_adaptive_demux_stream_has_next_fragment (demux, stream)) {
ret = klass->stream_advance_fragment (stream); ret = klass->stream_advance_fragment (stream);
} else { } else {