Better spec compliance regarding playlist update timing
This commit is contained in:
parent
96bfd4e027
commit
eca4245836
|
@ -122,7 +122,11 @@ public abstract class AbstractHlsDownload extends AbstractDownload {
|
||||||
handleMissedSegments(segmentPlaylist, nextSegmentNumber);
|
handleMissedSegments(segmentPlaylist, nextSegmentNumber);
|
||||||
enqueueNewSegments(segmentPlaylist, nextSegmentNumber);
|
enqueueNewSegments(segmentPlaylist, nextSegmentNumber);
|
||||||
splitRecordingIfNecessary();
|
splitRecordingIfNecessary();
|
||||||
calculateRescheduleTime();
|
// by the spec we must wait `targetDuration` before next playlist request if there are changes
|
||||||
|
// if there are none - half that amount
|
||||||
|
calculateRescheduleTime(playlistChanged(segmentPlaylist, nextSegmentNumber)
|
||||||
|
? segmentPlaylist.targetDuration*1000
|
||||||
|
: segmentPlaylist.targetDuration*500);
|
||||||
processFinishedSegments();
|
processFinishedSegments();
|
||||||
|
|
||||||
// this if-check makes sure, that we don't decrease nextSegment. for some reason
|
// this if-check makes sure, that we don't decrease nextSegment. for some reason
|
||||||
|
@ -175,6 +179,11 @@ public abstract class AbstractHlsDownload extends AbstractDownload {
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean playlistChanged(SegmentPlaylist segmentPlaylist, int nextSegmentNumber) {
|
||||||
|
return segmentPlaylist.seq + segmentPlaylist.segments.size() > nextSegmentNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected void processFinishedSegments() {
|
protected void processFinishedSegments() {
|
||||||
downloadExecutor.submit(() -> {
|
downloadExecutor.submit(() -> {
|
||||||
|
@ -427,8 +436,8 @@ public abstract class AbstractHlsDownload extends AbstractDownload {
|
||||||
return new SegmentDownload(model, playlist, segment, client, targetStream);
|
return new SegmentDownload(model, playlist, segment, client, targetStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void calculateRescheduleTime() {
|
private void calculateRescheduleTime(float duration_ms) {
|
||||||
rescheduleTime = beforeLastPlaylistRequest.plusMillis(1000);
|
rescheduleTime = beforeLastPlaylistRequest.plusMillis(Math.max((int)Math.ceil(duration_ms), 250));
|
||||||
if (Instant.now().isAfter(rescheduleTime))
|
if (Instant.now().isAfter(rescheduleTime))
|
||||||
rescheduleTime = Instant.now();
|
rescheduleTime = Instant.now();
|
||||||
recordingEvents.add(RecordingEvent.of("next playlist download scheduled for " + rescheduleTime.toString()));
|
recordingEvents.add(RecordingEvent.of("next playlist download scheduled for " + rescheduleTime.toString()));
|
||||||
|
|
Loading…
Reference in New Issue