UNPKG

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