UNPKG

3.82 kBJavaScriptView Raw
1/**
2 * @file ad-cue-tags.js
3 */
4'use strict';
5
6Object.defineProperty(exports, '__esModule', {
7 value: true
8});
9
10var _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'); } }; })();
11
12function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
13
14var _globalWindow = require('global/window');
15
16var _globalWindow2 = _interopRequireDefault(_globalWindow);
17
18/**
19 * Searches for an ad cue that overlaps with the given mediaTime
20 */
21var findAdCue = function findAdCue(track, mediaTime) {
22 var cues = track.cues;
23
24 for (var i = 0; i < cues.length; i++) {
25 var cue = cues[i];
26
27 if (mediaTime >= cue.adStartTime && mediaTime <= cue.adEndTime) {
28 return cue;
29 }
30 }
31 return null;
32};
33
34var updateAdCues = function updateAdCues(media, track) {
35 var offset = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2];
36
37 if (!media.segments) {
38 return;
39 }
40
41 var mediaTime = offset;
42 var cue = undefined;
43
44 for (var i = 0; i < media.segments.length; i++) {
45 var segment = media.segments[i];
46
47 if (!cue) {
48 // Since the cues will span for at least the segment duration, adding a fudge
49 // factor of half segment duration will prevent duplicate cues from being
50 // created when timing info is not exact (e.g. cue start time initialized
51 // at 10.006677, but next call mediaTime is 10.003332 )
52 cue = findAdCue(track, mediaTime + segment.duration / 2);
53 }
54
55 if (cue) {
56 if ('cueIn' in segment) {
57 // Found a CUE-IN so end the cue
58 cue.endTime = mediaTime;
59 cue.adEndTime = mediaTime;
60 mediaTime += segment.duration;
61 cue = null;
62 continue;
63 }
64
65 if (mediaTime < cue.endTime) {
66 // Already processed this mediaTime for this cue
67 mediaTime += segment.duration;
68 continue;
69 }
70
71 // otherwise extend cue until a CUE-IN is found
72 cue.endTime += segment.duration;
73 } else {
74 if ('cueOut' in segment) {
75 cue = new _globalWindow2['default'].VTTCue(mediaTime, mediaTime + segment.duration, segment.cueOut);
76 cue.adStartTime = mediaTime;
77 // Assumes tag format to be
78 // #EXT-X-CUE-OUT:30
79 cue.adEndTime = mediaTime + parseFloat(segment.cueOut);
80 track.addCue(cue);
81 }
82
83 if ('cueOutCont' in segment) {
84 // Entered into the middle of an ad cue
85 var adOffset = undefined;
86 var adTotal = undefined;
87
88 // Assumes tag formate to be
89 // #EXT-X-CUE-OUT-CONT:10/30
90
91 var _segment$cueOutCont$split$map = segment.cueOutCont.split('/').map(parseFloat);
92
93 var _segment$cueOutCont$split$map2 = _slicedToArray(_segment$cueOutCont$split$map, 2);
94
95 adOffset = _segment$cueOutCont$split$map2[0];
96 adTotal = _segment$cueOutCont$split$map2[1];
97
98 cue = new _globalWindow2['default'].VTTCue(mediaTime, mediaTime + segment.duration, '');
99 cue.adStartTime = mediaTime - adOffset;
100 cue.adEndTime = cue.adStartTime + adTotal;
101 track.addCue(cue);
102 }
103 }
104 mediaTime += segment.duration;
105 }
106};
107
108exports['default'] = {
109 updateAdCues: updateAdCues,
110 findAdCue: findAdCue
111};
112module.exports = exports['default'];
\No newline at end of file