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;
"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)
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;
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);
{
GstAdaptiveDemuxClass *klass = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
- /* FIXME: Currently several issues have be found when letting bitrate adaptation
- * happen using trick modes (such as 'All streams finished without buffers') and
- * the adaptive algorithm does not properly behave. */
- if (demux->segment.rate != 1.0)
- return FALSE;
-
if (klass->stream_select_bitrate)
return klass->stream_select_bitrate (stream, bitrate);
return FALSE;