From e2f2f240a30530257a674f32017dee066ca42fa9 Mon Sep 17 00:00:00 2001 From: Rob Walch Date: Mon, 24 Oct 2022 10:27:26 -0700 Subject: [PATCH] Reload live stream using last segment length when distance to playlist end is less than or equal to four target durations (Reload is scheduled on update. With a default live sync of 3 target durations, without interruption, a distance of 3x-4x is most likely.) --- src/controller/level-helper.ts | 7 +++++-- tests/unit/controller/level-helper.ts | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/controller/level-helper.ts b/src/controller/level-helper.ts index d8fd96952e2..18ce16264a1 100644 --- a/src/controller/level-helper.ts +++ b/src/controller/level-helper.ts @@ -7,7 +7,6 @@ import { logger } from '../utils/logger'; import { Fragment, Part } from '../loader/fragment'; import { LevelDetails } from '../loader/level-details'; import type { Level } from '../types/level'; -import type { LoaderStats } from '../types/loader'; import type { MediaPlaylist } from '../types/media-playlist'; import { DateRange } from '../loader/date-range'; @@ -441,7 +440,11 @@ export function computeReloadInterval( if (newDetails.updated) { // Use last segment duration when shorter than target duration and near live edge const fragments = newDetails.fragments; - if (fragments.length && reloadInterval * 3 > distanceToLiveEdgeMs) { + const liveEdgeMaxTargetDurations = 4; + if ( + fragments.length && + reloadInterval * liveEdgeMaxTargetDurations > distanceToLiveEdgeMs + ) { const lastSegmentDuration = fragments[fragments.length - 1].duration * 1000; if (lastSegmentDuration < reloadInterval) { diff --git a/tests/unit/controller/level-helper.ts b/tests/unit/controller/level-helper.ts index d548cd6f8b8..5c70a739b30 100644 --- a/tests/unit/controller/level-helper.ts +++ b/tests/unit/controller/level-helper.ts @@ -307,11 +307,11 @@ expect: ${JSON.stringify(merged.fragments[i])}` expect(actual).to.equal(2500); }); - it('returns the last fragment duration when distance to live edge is less than three target durations', function () { + it('returns the last fragment duration when distance to live edge is less than or equal to four target durations', function () { const newPlaylist = generatePlaylist([3, 4], 0, 2); newPlaylist.targetduration = 5; newPlaylist.updated = true; - const actual = computeReloadInterval(newPlaylist, 15000); + const actual = computeReloadInterval(newPlaylist, 20000); expect(actual).to.equal(5000); const actualLow = computeReloadInterval(newPlaylist, 14000); expect(actualLow).to.equal(2000);