| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 | <!DOCTYPE html><html lang="en"><head>    <meta charset="utf-8">    <title>JSDoc: Source: add-text-track-data.js</title>    <script src="scripts/prettify/prettify.js"> </script>    <script src="scripts/prettify/lang-css.js"> </script>    <!--[if lt IE 9]>      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>    <![endif]-->    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"></head><body><div id="main">    <h1 class="page-title">Source: add-text-track-data.js</h1>            <section>        <article>            <pre class="prettyprint source linenums"><code>/** * @file add-text-track-data.js */import window from 'global/window';import videojs from 'video.js';/** * Define properties on a cue for backwards compatability, * but warn the user that the way that they are using it * is depricated and will be removed at a later date. * * @param {Cue} cue the cue to add the properties on * @private */const deprecateOldCue = function(cue) {  Object.defineProperties(cue.frame, {    id: {      get() {        videojs.log.warn(          'cue.frame.id is deprecated. Use cue.value.key instead.'        );        return cue.value.key;      }    },    value: {      get() {        videojs.log.warn(          'cue.frame.value is deprecated. Use cue.value.data instead.'        );        return cue.value.data;      }    },    privateData: {      get() {        videojs.log.warn(          'cue.frame.privateData is deprecated. Use cue.value.data instead.'        );        return cue.value.data;      }    }  });};const durationOfVideo = function(duration) {  let dur;  if (isNaN(duration) || Math.abs(duration) === Infinity) {    dur = Number.MAX_VALUE;  } else {    dur = duration;  }  return dur;};/** * Add text track data to a source handler given the captions and * metadata from the buffer. * * @param {Object} sourceHandler the flash or virtual source buffer * @param {Array} captionArray an array of caption data * @param {Array} metadataArray an array of meta data * @private */const addTextTrackData = function(sourceHandler, captionArray, metadataArray) {  let Cue = window.WebKitDataCue || window.VTTCue;  if (captionArray) {    captionArray.forEach(function(caption) {      let track = caption.stream;      this.inbandTextTracks_[track].addCue(        new Cue(          caption.startTime + this.timestampOffset,          caption.endTime + this.timestampOffset,          caption.text        ));    }, sourceHandler);  }  if (metadataArray) {    let videoDuration = durationOfVideo(sourceHandler.mediaSource_.duration);    metadataArray.forEach(function(metadata) {      let time = metadata.cueTime + this.timestampOffset;      metadata.frames.forEach(function(frame) {        let cue = new Cue(          time,          time,          frame.value || frame.url || frame.data || '');        cue.frame = frame;        cue.value = frame;        deprecateOldCue(cue);        this.metadataTrack_.addCue(cue);      }, this);    }, sourceHandler);    // Updating the metadeta cues so that    // the endTime of each cue is the startTime of the next cue    // the endTime of last cue is the duration of the video    if (sourceHandler.metadataTrack_ &&        sourceHandler.metadataTrack_.cues &&        sourceHandler.metadataTrack_.cues.length) {      let cues = sourceHandler.metadataTrack_.cues;      let cuesArray = [];      // Create a copy of the TextTrackCueList...      // ...disregarding cues with a falsey value      for (let i = 0; i < cues.length; i++) {        if (cues[i]) {          cuesArray.push(cues[i]);        }      }      // Group cues by their startTime value      let cuesGroupedByStartTime = cuesArray.reduce((obj, cue) => {        let timeSlot = obj[cue.startTime] || [];        timeSlot.push(cue);        obj[cue.startTime] = timeSlot;        return obj;      }, {});      // Sort startTimes by ascending order      let sortedStartTimes = Object.keys(cuesGroupedByStartTime)                                   .sort((a, b) => Number(a) - Number(b));      // Map each cue group's endTime to the next group's startTime      sortedStartTimes.forEach((startTime, idx) => {        let cueGroup = cuesGroupedByStartTime[startTime];        let nextTime = Number(sortedStartTimes[idx + 1]) || videoDuration;        // Map each cue's endTime the next group's startTime        cueGroup.forEach((cue) => {          cue.endTime = nextTime;        });      });    }  }};export default {  addTextTrackData,  durationOfVideo};</code></pre>        </article>    </section></div><nav>    <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="FlashMediaSource.html">FlashMediaSource</a></li><li><a href="FlashSourceBuffer.html">FlashSourceBuffer</a></li><li><a href="HtmlMediaSource.html">HtmlMediaSource</a></li><li><a href="MessageHandlers.html">MessageHandlers</a></li><li><a href="VirtualSourceBuffer.html">VirtualSourceBuffer</a></li></ul><h3>Global</h3><ul><li><a href="global.html#abort">abort</a></li><li><a href="global.html#addSourceBuffer">addSourceBuffer</a></li><li><a href="global.html#appendBuffer">appendBuffer</a></li><li><a href="global.html#appendGopInfo_">appendGopInfo_</a></li><li><a href="global.html#endOfStream">endOfStream</a></li><li><a href="global.html#FlashTransmuxerWorker">FlashTransmuxerWorker</a></li><li><a href="global.html#get">get</a></li><li><a href="global.html#gopsSafeToAlignWith">gopsSafeToAlignWith</a></li><li><a href="global.html#MediaSource">MediaSource</a></li><li><a href="global.html#open">open</a></li><li><a href="global.html#remove">remove</a></li><li><a href="global.html#removeGopBuffer">removeGopBuffer</a></li><li><a href="global.html#set">set</a></li><li><a href="global.html#supportsNativeMediaSources">supportsNativeMediaSources</a></li><li><a href="global.html#TransmuxerWorker">TransmuxerWorker</a></li><li><a href="global.html#updateGopBuffer">updateGopBuffer</a></li><li><a href="global.html#URL">URL</a></li></ul></nav><br class="clear"><footer>    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.4</a> on Thu Nov 02 2017 12:03:25 GMT-0400 (EDT)</footer><script> prettyPrint(); </script><script src="scripts/linenumber.js"> </script></body></html>
 |