diff --git a/src/sync-controller.js b/src/sync-controller.js index 331a2990c..6005c3dc5 100644 --- a/src/sync-controller.js +++ b/src/sync-controller.js @@ -39,28 +39,26 @@ export const syncPointStrategies = [ let syncPoint = null; currentTime = currentTime || 0; - let i = segments.length; - while (i--) { + for (let i = 0; i < segments.length; i++) { let segment = segments[i]; - if (!segment.dateTimeObject) { - continue; - } - - let segmentTime = segment.dateTimeObject.getTime() / 1000; - let segmentStart = segmentTime + syncController.datetimeToDisplayTime; + if (segment.dateTimeObject) { + let segmentTime = segment.dateTimeObject.getTime() / 1000; + let segmentStart = segmentTime + syncController.datetimeToDisplayTime; - syncPoint = { - time: segmentStart, - segmentIndex: i - }; + // if we have a sync point and + // Current time minus segments start is less than or equal to 0 + // then the previous segment is directly behind the currentTime + // and can stop searching + if (syncPoint && (currentTime - segmentStart) <= 0) { + break; + } - // As this segments start time minus current time is less than 0 - // then we have moved to a segment directly behind the currentTime - // and can stop searching - if ((segmentStart - currentTime) < 0) { - break; + syncPoint = { + time: segmentStart, + segmentIndex: i + }; } } return syncPoint; diff --git a/test/sync-controller.test.js b/test/sync-controller.test.js index 093da73aa..e9ee22b18 100644 --- a/test/sync-controller.test.js +++ b/test/sync-controller.test.js @@ -99,6 +99,13 @@ QUnit.test('ProgramDateTime strategy finds nearest segment for sync', function(a time: 160, segmentIndex: 15 }, 'syncpoint found for ProgramDateTime set'); + + syncPoint = strategy.run(this.syncController, newPlaylist, duration, timeline, 0); + + assert.deepEqual(syncPoint, { + time: 10, + segmentIndex: 0 + }, 'syncpoint found for ProgramDateTime set at 0'); }); QUnit.test('Does not set date time mapping if date time info not on first segment',