summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2016-08-25 19:35:13 +0300
committerSebastian Dröge <sebastian@centricular.com>2016-08-25 19:52:37 +0300
commit4f6ae1f48c2a139faf07958b9e2232da8dde1b83 (patch)
treece18fe51672422c11fd4a578cd4b02223a3e8567 /ext
parent2702d98d6bfb12d96ffcfc7521e575dbbbf235a5 (diff)
adaptivedemux: Enable bitrate selection for trick mode streaming again
And scale the bitrate with the absolute rate (if it's bigger than 1.0) to get to the real bitrate due to faster playback. This allowed in my tests to play a stream with 10x speed without buffering as the lowest bitrate is chosen, instead of staying/selecting the highest bitrate and then buffering all the time. It was previously disabled for not very well specified reasons, which seem to be not valid anymore nowadays.
Diffstat (limited to 'ext')
-rw-r--r--ext/dash/gstdashdemux.c11
-rw-r--r--ext/hls/gsthlsdemux.c7
-rw-r--r--ext/smoothstreaming/gstmssdemux.c3
3 files changed, 14 insertions, 7 deletions
diff --git a/ext/dash/gstdashdemux.c b/ext/dash/gstdashdemux.c
index 5fe629c3f..2b29a1de8 100644
--- a/ext/dash/gstdashdemux.c
+++ b/ext/dash/gstdashdemux.c
@@ -1437,6 +1437,7 @@ gst_dash_demux_stream_select_bitrate (GstAdaptiveDemuxStream * stream,
GstActiveStream *active_stream = NULL;
GList *rep_list = NULL;
gint new_index;
+ GstAdaptiveDemux *base_demux = stream->demux;
GstDashDemux *demux = GST_DASH_DEMUX_CAST (stream->demux);
GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
gboolean ret = FALSE;
@@ -1457,7 +1458,15 @@ gst_dash_demux_stream_select_bitrate (GstAdaptiveDemuxStream * stream,
"Trying to change to bitrate: %" G_GUINT64_FORMAT, bitrate);
/* get representation index with current max_bandwidth */
- new_index = gst_mpdparser_get_rep_idx_with_max_bandwidth (rep_list, bitrate);
+ if ((base_demux->segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) ||
+ ABS (base_demux->segment.rate) <= 1.0) {
+ new_index =
+ gst_mpdparser_get_rep_idx_with_max_bandwidth (rep_list, bitrate);
+ } else {
+ new_index =
+ gst_mpdparser_get_rep_idx_with_max_bandwidth (rep_list,
+ bitrate / ABS (base_demux->segment.rate));
+ }
/* if no representation has the required bandwidth, take the lowest one */
if (new_index == -1)
diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c
index 4cf5b8138..a4eaacd69 100644
--- a/ext/hls/gsthlsdemux.c
+++ b/ext/hls/gsthlsdemux.c
@@ -1086,11 +1086,8 @@ gst_hls_demux_select_bitrate (GstAdaptiveDemuxStream * stream, guint64 bitrate)
return FALSE;
}
- /* Bitrate adaptation during trick modes does not work well */
- if (demux->segment.rate != 1.0)
- return FALSE;
-
- gst_hls_demux_change_playlist (hlsdemux, bitrate, &changed);
+ gst_hls_demux_change_playlist (hlsdemux, bitrate / MAX (1.0,
+ ABS (demux->segment.rate)), &changed);
if (changed)
gst_hls_demux_setup_streams (GST_ADAPTIVE_DEMUX_CAST (hlsdemux));
return changed;
diff --git a/ext/smoothstreaming/gstmssdemux.c b/ext/smoothstreaming/gstmssdemux.c
index 27725ca53..9d0aece2b 100644
--- a/ext/smoothstreaming/gstmssdemux.c
+++ b/ext/smoothstreaming/gstmssdemux.c
@@ -543,7 +543,8 @@ gst_mss_demux_stream_select_bitrate (GstAdaptiveDemuxStream * stream,
GST_DEBUG_OBJECT (stream->pad,
"Using stream download bitrate %" G_GUINT64_FORMAT, bitrate);
- if (gst_mss_stream_select_bitrate (mssstream->manifest_stream, bitrate)) {
+ if (gst_mss_stream_select_bitrate (mssstream->manifest_stream,
+ bitrate / MAX (1.0, ABS (stream->demux->segment.rate)))) {
GstCaps *caps;
GstCaps *msscaps;
GstMssDemux *mssdemux = GST_MSS_DEMUX_CAST (stream->demux);