bigscreen-player
Advanced tools
Comparing version 3.4.0 to 3.5.0
{ | ||
"name": "bigscreen-player", | ||
"version": "3.4.0", | ||
"version": "3.5.0", | ||
"description": "Simplified media playback for bigscreen devices.", | ||
@@ -5,0 +5,0 @@ "main": "script/bigscreenplayer.js", |
@@ -20,2 +20,3 @@ require( | ||
var mediaSources; | ||
var mediaSourcesTimeSpy; | ||
@@ -33,2 +34,3 @@ var mockDashjs; | ||
var testManifestObject; | ||
var timeUtilsMock; | ||
@@ -55,3 +57,3 @@ var dashjsMediaPlayerEvents = { | ||
'reset', 'isPaused', 'pause', 'play', 'seek', 'isReady', 'refreshManifest', 'getDashMetrics', 'getMetricsFor', 'setBufferToKeep', | ||
'setBufferAheadToKeep', 'setBufferTimeAtTopQuality', 'setBufferTimeAtTopQualityLongForm', 'getBitrateInfoListFor', 'getAverageThroughput']); | ||
'setBufferAheadToKeep', 'setBufferTimeAtTopQuality', 'setBufferTimeAtTopQualityLongForm', 'getBitrateInfoListFor', 'getAverageThroughput', 'getDVRWindowSize', 'setLiveDelay']); | ||
mockPluginsInterface = jasmine.createSpyObj('interface', ['onErrorCleared', 'onBuffering', 'onBufferingCleared', 'onError', 'onFatalError', 'onErrorHandled', 'onPlayerInfoUpdated']); | ||
@@ -79,2 +81,7 @@ mockPlugins = { | ||
timeUtilsMock = jasmine.createSpyObj('timeUtilsMock', ['calculateSlidingWindowSeekOffset']); | ||
timeUtilsMock.calculateSlidingWindowSeekOffset.and.callFake(function (time) { | ||
return time; | ||
}); | ||
mockDashjs.MediaPlayer.and.returnValue(mockDashMediaPlayer); | ||
@@ -88,2 +95,3 @@ mockDashMediaPlayer.create.and.returnValue(mockDashInstance); | ||
mockDashInstance.getMetricsFor.and.returnValue(true); | ||
mockDashInstance.getDVRWindowSize.and.returnValue(101); | ||
@@ -127,3 +135,4 @@ mockDashInstance.on.and.callFake(function (eventType, handler) { | ||
mediaSources = new MediaSources(); | ||
spyOn(mediaSources, 'time').and.callThrough(); | ||
mediaSourcesTimeSpy = spyOn(mediaSources, 'time'); | ||
mediaSourcesTimeSpy.and.callThrough(); | ||
spyOn(mediaSources, 'failover').and.callThrough(); | ||
@@ -144,3 +153,4 @@ mediaSources.init(cdnArray, new Date(), WindowTypes.STATIC, LiveSupport.SEEKABLE, mediaSourceCallbacks); | ||
'bigscreenplayer/plugins': mockPlugins, | ||
'bigscreenplayer/dynamicwindowutils': mockDynamicWindowUtils | ||
'bigscreenplayer/dynamicwindowutils': mockDynamicWindowUtils, | ||
'bigscreenplayer/utils/timeutils': timeUtilsMock | ||
}); | ||
@@ -168,2 +178,3 @@ | ||
mockDashInstance.seek.calls.reset(); | ||
timeUtilsMock.calculateSlidingWindowSeekOffset.calls.reset(); | ||
}); | ||
@@ -704,3 +715,3 @@ | ||
expect(mockVideoElement.currentTime).toBe(12); | ||
expect(mockDashInstance.seek).toHaveBeenCalledWith(12); | ||
}); | ||
@@ -717,3 +728,3 @@ | ||
expect(mockVideoElement.currentTime).toBe(99.9); | ||
expect(mockDashInstance.seek).toHaveBeenCalledWith(99.9); | ||
}); | ||
@@ -738,2 +749,9 @@ | ||
}); | ||
it('It should calculate seek offset time when paused before seeking', function () { | ||
mseStrategy.pause(); | ||
mseStrategy.setCurrentTime(101); | ||
expect(timeUtilsMock.calculateSlidingWindowSeekOffset).toHaveBeenCalledTimes(1); | ||
}); | ||
}); | ||
@@ -740,0 +758,0 @@ |
@@ -28,4 +28,38 @@ require( | ||
}); | ||
describe('Calculate Sliding Window Seek Offset', function () { | ||
beforeEach(function () { | ||
jasmine.clock().mockDate(new Date('2019-10-22T10:59:20.000Z')); | ||
}); | ||
afterEach(function () { | ||
jasmine.clock().uninstall(); | ||
}); | ||
it('should return the relative time in seconds including the time a user spent seeking', function () { | ||
var time = 4000; | ||
// Note the 5 minute (300 second difference) | ||
var dvrInfoRangeStart = new Date('2019-10-22T09:00:00.000Z') / 1000; | ||
var timeCorrection = new Date('2019-10-22T08:55:00.000Z') / 1000; | ||
var pausedTime = new Date('2019-10-22T10:59:00.000Z'); | ||
// mock Date.now is 20 seconds later. Slow seeking! | ||
expect(TimeUtils.calculateSlidingWindowSeekOffset(time, dvrInfoRangeStart, timeCorrection, pausedTime)).toBe(3680); | ||
}); | ||
it('should return the relative time in seconds if paused time is 0', function () { | ||
var time = 4000; | ||
// Note the 5 minute (300 second difference) | ||
var dvrInfoRangeStart = new Date('2019-10-22T09:00:00.000Z') / 1000; | ||
var timeCorrection = new Date('2019-10-22T08:55:00.000Z') / 1000; | ||
var pausedTime = 0; | ||
expect(TimeUtils.calculateSlidingWindowSeekOffset(time, dvrInfoRangeStart, timeCorrection, pausedTime)).toBe(3700); | ||
}); | ||
}); | ||
}); | ||
} | ||
); |
@@ -12,2 +12,3 @@ define('bigscreenplayer/playbackstrategy/msestrategy', | ||
'bigscreenplayer/playbackstrategy/growingwindowrefresher', | ||
'bigscreenplayer/utils/timeutils', | ||
@@ -17,4 +18,5 @@ // static imports | ||
], | ||
function (MediaState, WindowTypes, DebugTool, MediaKinds, Plugins, ManifestModifier, LiveSupport, DynamicWindowUtils, GrowingWindowRefresher) { | ||
function (MediaState, WindowTypes, DebugTool, MediaKinds, Plugins, ManifestModifier, LiveSupport, DynamicWindowUtils, GrowingWindowRefresher, TimeUtils) { | ||
var MSEStrategy = function (mediaSources, windowType, mediaKind, playbackElement, isUHD, device) { | ||
var LIVE_DELAY_SECONDS = 1.1; | ||
var mediaPlayer; | ||
@@ -30,2 +32,3 @@ var mediaElement; | ||
var refreshFailoverTime; | ||
var slidingWindowPausedTime = 0; | ||
var isEnded = false; | ||
@@ -254,3 +257,3 @@ | ||
function getClampedTime (time, range) { | ||
return Math.min(Math.max(time, range.start), range.end - 1.1); | ||
return Math.min(Math.max(time, range.start), range.end - LIVE_DELAY_SECONDS); | ||
} | ||
@@ -285,2 +288,3 @@ | ||
mediaPlayer.getDebug().setLogToBrowserConsole(false); | ||
mediaPlayer.setLiveDelay(LIVE_DELAY_SECONDS); | ||
@@ -386,2 +390,17 @@ mediaPlayer.setBufferToKeep(0); | ||
function calculateSeekOffset (time) { | ||
function getClampedTimeForLive (time) { | ||
return Math.min(Math.max(time, 0), mediaPlayer.getDVRWindowSize() - LIVE_DELAY_SECONDS); | ||
} | ||
if (windowType === WindowTypes.SLIDING) { | ||
var dvrInfo = mediaPlayer.getDashMetrics().getCurrentDVRInfo(mediaPlayer.getMetricsFor(mediaKind)); | ||
var offset = TimeUtils.calculateSlidingWindowSeekOffset(time, dvrInfo.range.start, timeCorrection, slidingWindowPausedTime); | ||
slidingWindowPausedTime = 0; | ||
return getClampedTimeForLive(offset); | ||
} | ||
return getClampedTime(time, getSeekableRange()); | ||
} | ||
return { | ||
@@ -466,2 +485,6 @@ transitions: { | ||
pause: function (opts) { | ||
if (windowType === WindowTypes.SLIDING) { | ||
slidingWindowPausedTime = Date.now(); | ||
} | ||
mediaPlayer.pause(); | ||
@@ -486,8 +509,7 @@ opts = opts || {}; | ||
var seekToTime = getClampedTime(time, getSeekableRange()); | ||
if (windowType === WindowTypes.SLIDING) { | ||
mediaElement.currentTime = (seekToTime + timeCorrection); | ||
} else if (windowType === WindowTypes.GROWING && seekToTime > getCurrentTime()) { | ||
if (windowType === WindowTypes.GROWING && seekToTime > getCurrentTime()) { | ||
refreshManifestBeforeSeek(seekToTime); | ||
} else { | ||
mediaPlayer.seek(seekToTime); | ||
var seekTime = calculateSeekOffset(time); | ||
mediaPlayer.seek(seekTime); | ||
} | ||
@@ -494,0 +516,0 @@ } |
@@ -29,8 +29,19 @@ define( | ||
function calculateSlidingWindowSeekOffset (time, dvrInfoRangeStart, timeCorrection, slidingWindowPausedTime) { | ||
var dashRelativeTime = time + timeCorrection - dvrInfoRangeStart; | ||
if (slidingWindowPausedTime === 0) { | ||
return dashRelativeTime; | ||
} | ||
return dashRelativeTime - ((Date.now() - slidingWindowPausedTime) / 1000); | ||
} | ||
return { | ||
durationToSeconds: durationToSeconds, | ||
convertToSeekableVideoTime: convertToSeekableVideoTime, | ||
convertToVideoTime: convertToVideoTime | ||
convertToVideoTime: convertToVideoTime, | ||
calculateSlidingWindowSeekOffset: calculateSlidingWindowSeekOffset | ||
}; | ||
} | ||
); |
7836603
101
75745