[Bug 753751] Dashdemux: returned seekable range for live streams is not usable

GStreamer (GNOME Bugzilla) bugzilla at gnome.org
Thu Oct 1 04:44:50 PDT 2015


https://bugzilla.gnome.org/show_bug.cgi?id=753751

--- Comment #22 from A Ashley <bugzilla at ashley-family.net> ---
Under normal circumstances a 404 is not a temporary error and therefore should
not be retried. An error in the 500 range (e.g. 503, 504) should cause a retry.
A retry of a 404 (or 410) error is particularly bad because these requests tend
to cause a request to make it all the way back to the origin.

However, in the case of a DASH live stream, a 404 might indicate that the
segment is not yet available on the server. This probably indicates a clock
drift error or a server-side error.

The DVB DASH specification defines two different behaviours, depending upon
whether the stream is a live stream or an on-demand stream.

On-demand:
The Player shall change BaseURL as specified in clause 10.8.2.3.

Live:
The Player shall reload the MPD. If the MPD indicates a source of time as
specified in clause 4.7.3 the Player shall resynchronise to one of the time
sources as described in clause 4.7.3.

If as a result of reloading the MPD and carrying out time synchronisation the
Player determines the request is no longer appropriate, it shall adjust its
position in the media to reflect the new MPD and time.

If the request is still valid the Player may retry the request up to the max
number of retries specified.

If trying the above does not result in success the Player shall change
BaseURL as specified in clause 10.8.2.3.



I don't think we're quite ready to implement the full DVB approach, but we do
need to be careful about creating code that acts like a denial of service
attack on the origin server.

My suggestion is:
For 5xx errors:
/* Check if requested segment still exists (i.e. it hasn't fallen out of the
timeshift buffer).*/
if( segment_no_longer_exists() ) {
  move_play_position_forward_until_valid_segment_is_found();
  load_segment();
}
else {
  retry_segment(); /* with some suitable retry limit */
}

For 4xx errors:
now = server_utc_time_of_day()
if (current_position >= now ) { /* maybe check should be if pos close to now?*/
  /* maybe poll clock server */
  wait();
  retry_segment(); /* with some suitable retry limit */
}
else{
  move_play_position_forward_one_segment();
  load_segment();
}

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.


More information about the gstreamer-bugs mailing list