UNPKG

videojs-contrib-media-sources

Version:

A Media Source Extensions plugin for video.js

198 lines (161 loc) 6.5 kB
<!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_ &amp;&amp; sourceHandler.metadataTrack_.cues &amp;&amp; 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 &lt; 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>