UNPKG

videojs-contrib-hls

Version:

Play back HLS with video.js, even where it's not natively supported

112 lines (89 loc) 3.82 kB
/** * @file ad-cue-tags.js */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })(); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _globalWindow = require('global/window'); var _globalWindow2 = _interopRequireDefault(_globalWindow); /** * Searches for an ad cue that overlaps with the given mediaTime */ var findAdCue = function findAdCue(track, mediaTime) { var cues = track.cues; for (var i = 0; i < cues.length; i++) { var cue = cues[i]; if (mediaTime >= cue.adStartTime && mediaTime <= cue.adEndTime) { return cue; } } return null; }; var updateAdCues = function updateAdCues(media, track) { var offset = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; if (!media.segments) { return; } var mediaTime = offset; var cue = undefined; for (var i = 0; i < media.segments.length; i++) { var segment = media.segments[i]; if (!cue) { // Since the cues will span for at least the segment duration, adding a fudge // factor of half segment duration will prevent duplicate cues from being // created when timing info is not exact (e.g. cue start time initialized // at 10.006677, but next call mediaTime is 10.003332 ) cue = findAdCue(track, mediaTime + segment.duration / 2); } if (cue) { if ('cueIn' in segment) { // Found a CUE-IN so end the cue cue.endTime = mediaTime; cue.adEndTime = mediaTime; mediaTime += segment.duration; cue = null; continue; } if (mediaTime < cue.endTime) { // Already processed this mediaTime for this cue mediaTime += segment.duration; continue; } // otherwise extend cue until a CUE-IN is found cue.endTime += segment.duration; } else { if ('cueOut' in segment) { cue = new _globalWindow2['default'].VTTCue(mediaTime, mediaTime + segment.duration, segment.cueOut); cue.adStartTime = mediaTime; // Assumes tag format to be // #EXT-X-CUE-OUT:30 cue.adEndTime = mediaTime + parseFloat(segment.cueOut); track.addCue(cue); } if ('cueOutCont' in segment) { // Entered into the middle of an ad cue var adOffset = undefined; var adTotal = undefined; // Assumes tag formate to be // #EXT-X-CUE-OUT-CONT:10/30 var _segment$cueOutCont$split$map = segment.cueOutCont.split('/').map(parseFloat); var _segment$cueOutCont$split$map2 = _slicedToArray(_segment$cueOutCont$split$map, 2); adOffset = _segment$cueOutCont$split$map2[0]; adTotal = _segment$cueOutCont$split$map2[1]; cue = new _globalWindow2['default'].VTTCue(mediaTime, mediaTime + segment.duration, ''); cue.adStartTime = mediaTime - adOffset; cue.adEndTime = cue.adStartTime + adTotal; track.addCue(cue); } } mediaTime += segment.duration; } }; exports['default'] = { updateAdCues: updateAdCues, findAdCue: findAdCue }; module.exports = exports['default'];