vhs-utils.min.js 13 KB

12
  1. /*! @name @videojs/vhs-utils @version 4.0.0 @license MIT */
  2. !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).vhsUtils=t()}(this,(function(){"use strict";const e={mp4:/^(av0?1|avc0?[1234]|vp0?9|flac|opus|mp3|mp4a|mp4v|stpp.ttml.im1t)/,webm:/^(vp0?[89]|av0?1|opus|vorbis)/,ogg:/^(vp0?[89]|theora|flac|opus|vorbis)/,video:/^(av0?1|avc0?[1234]|vp0?[89]|hvc1|hev1|theora|mp4v)/,audio:/^(mp4a|flac|vorbis|opus|ac-[34]|ec-3|alac|mp3|speex|aac)/,text:/^(stpp.ttml.im1t)/,muxerVideo:/^(avc0?1)/,muxerAudio:/^(mp4a)/,muxerText:/a^/},t=["video","audio","text"],r=["Video","Audio","Text"],n=function(e){return e?e.replace(/avc1\.(\d+)\.(\d+)/i,(function(e,t,r){return"avc1."+("00"+Number(t).toString(16)).slice(-2)+"00"+("00"+Number(r).toString(16)).slice(-2)})):e},o=function(e){return e.map(n)},a=function(r=""){const n=r.split(","),o=[];return n.forEach((function(r){let n;r=r.trim(),t.forEach((function(t){const a=e[t].exec(r.toLowerCase());if(!a||a.length<=1)return;n=t;const i=r.substring(0,a[1].length),s=r.replace(i,"");o.push({type:i,details:s,mediaType:t})})),n||o.push({type:r,details:"",mediaType:"unknown"})})),o},i=(t="")=>e.audio.test(t.trim().toLowerCase()),s=(t="")=>e.text.test(t.trim().toLowerCase()),l=t=>{if(!t||"string"!=typeof t)return;const r=t.toLowerCase().split(",").map((e=>n(e.trim())));let o="video";1===r.length&&i(r[0])?o="audio":1===r.length&&s(r[0])&&(o="application");let a="mp4";return r.every((t=>e.mp4.test(t)))?a="mp4":r.every((t=>e.webm.test(t)))?a="webm":r.every((t=>e.ogg.test(t)))&&(a="ogg"),`${o}/${a};codecs="${t}"`};var c=Object.freeze({__proto__:null,translateLegacyCodec:n,translateLegacyCodecs:o,mapLegacyAvcCodecs:function(e){return e.replace(/avc1\.(\d+)\.(\d+)/i,(e=>o([e])[0]))},parseCodecs:a,codecsFromDefault:(e,t)=>{if(!e.mediaGroups.AUDIO||!t)return null;const r=e.mediaGroups.AUDIO[t];if(!r)return null;for(const e in r){const t=r[e];if(t.default&&t.playlists)return a(t.playlists[0].attributes.CODECS)}return null},isVideoCodec:(t="")=>e.video.test(t.trim().toLowerCase()),isAudioCodec:i,isTextCodec:s,getMimeForCodec:l,browserSupportsCodec:(e="")=>window.MediaSource&&window.MediaSource.isTypeSupported&&window.MediaSource.isTypeSupported(l(e))||!1,muxerSupportsCodec:(t="")=>t.toLowerCase().split(",").every((t=>{t=t.trim();for(let n=0;n<r.length;n++){if(e[`muxer${r[n]}`].test(t))return!0}return!1})),DEFAULT_AUDIO_CODEC:"mp4a.40.2",DEFAULT_VIDEO_CODEC:"avc1.4d400d"});const u=e=>e.toString(2).length,f=e=>Math.ceil(u(e)/8),p=(e,t,r=" ")=>(function(e,t){let r="";for(;t--;)r+=e;return r}(r,t)+e.toString()).slice(-t),h=e=>"function"===ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer instanceof ArrayBuffer,y=e=>h(e),g=function(e){return e instanceof Uint8Array?e:(Array.isArray(e)||y(e)||e instanceof ArrayBuffer||(e="number"!=typeof e||"number"==typeof e&&e!=e?0:[e]),new Uint8Array(e&&e.buffer||e,e&&e.byteOffset||0,e&&e.byteLength||0))},m=window.BigInt||Number,d=[m("0x1"),m("0x100"),m("0x10000"),m("0x1000000"),m("0x100000000"),m("0x10000000000"),m("0x1000000000000"),m("0x100000000000000"),m("0x10000000000000000")],b=function(){const e=new Uint16Array([65484]),t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);return 255===t[0]?"big":204===t[0]?"little":"unknown"}(),v="big"===b,w="little"===b,A=function(e,{signed:t=!1,le:r=!1}={}){e=g(e);const n=r?"reduce":"reduceRight";let o=(e[n]?e[n]:Array.prototype[n]).call(e,(function(t,n,o){const a=r?o:Math.abs(o+1-e.length);return t+m(n)*d[a]}),m(0));if(t){const t=d[e.length]/m(2)-m(1);o=m(o),o>t&&(o-=t,o-=t,o-=m(2))}return Number(o)},L=function(e,{le:t=!1}={}){("bigint"!=typeof e&&"number"!=typeof e||"number"==typeof e&&e!=e)&&(e=0),e=m(e);const r=f(e),n=new Uint8Array(new ArrayBuffer(r));for(let o=0;o<r;o++){const r=t?o:Math.abs(o+1-n.length);n[r]=Number(e/d[o]&m(255)),e<0&&(n[r]=Math.abs(~n[r]),n[r]-=0===o?1:2)}return n},U=(e,t)=>{if("string"!=typeof e&&e&&"function"==typeof e.toString&&(e=e.toString()),"string"!=typeof e)return new Uint8Array;t||(e=unescape(encodeURIComponent(e)));const r=new Uint8Array(e.length);for(let t=0;t<e.length;t++)r[t]=e.charCodeAt(t);return r},x=(e,t,{offset:r=0,mask:n=[]}={})=>{e=g(e);const o=(t=g(t)).every?t.every:Array.prototype.every;return t.length&&e.length-r>=t.length&&o.call(t,((t,o)=>t===(n[o]?n[o]&e[r+o]:e[r+o])))};var T=Object.freeze({__proto__:null,countBits:u,countBytes:f,padStart:p,isArrayBufferView:h,isTypedArray:y,toUint8:g,toHexString:function(e){e=g(e);let t="";for(let r=0;r<e.length;r++)t+=p(e[r].toString(16),2,"0");return t},toBinaryString:function(e){e=g(e);let t="";for(let r=0;r<e.length;r++)t+=p(e[r].toString(2),8,"0");return t},ENDIANNESS:b,IS_BIG_ENDIAN:v,IS_LITTLE_ENDIAN:w,bytesToNumber:A,numberToBytes:L,bytesToString:e=>{if(!e)return"";e=Array.prototype.slice.call(e);const t=String.fromCharCode.apply(null,g(e));try{return decodeURIComponent(escape(t))}catch(e){}return t},stringToBytes:U,concatTypedArrays:(...e)=>{if((e=e.filter((e=>e&&(e.byteLength||e.length)&&"string"!=typeof e))).length<=1)return g(e[0]);const t=e.reduce(((e,t,r)=>e+(t.byteLength||t.length)),0),r=new Uint8Array(t);let n=0;return e.forEach((function(e){e=g(e),r.set(e,n),n+=e.byteLength})),r},bytesMatch:x,sliceBytes:function(e,t,r){return Uint8Array.prototype.slice?Uint8Array.prototype.slice.call(e,t,r):new Uint8Array(Array.prototype.slice.call(e,t,r))},reverseBytes:function(e){return e.reverse?e.reverse():Array.prototype.reverse.call(e)}});const C=function(e){return"string"==typeof e?U(e):e},S=function(e,t,r=!1){t=function(e){return Array.isArray(e)?e.map((e=>C(e))):[C(e)]}(t),e=g(e);const n=[];if(!t.length)return n;let o=0;for(;o<e.length;){const a=(e[o]<<24|e[o+1]<<16|e[o+2]<<8|e[o+3])>>>0,i=e.subarray(o+4,o+8);if(0===a)break;let s=o+a;if(s>e.length){if(r)break;s=e.length}const l=e.subarray(o+8,s);x(i,t[0])&&(1===t.length?n.push(l):n.push.apply(n,S(l,t.slice(1),r))),o=s}return n},E={EBML:g([26,69,223,163]),DocType:g([66,130]),Segment:g([24,83,128,103]),SegmentInfo:g([21,73,169,102]),Tracks:g([22,84,174,107]),Track:g([174]),TrackNumber:g([215]),DefaultDuration:g([35,227,131]),TrackEntry:g([174]),TrackType:g([131]),FlagDefault:g([136]),CodecID:g([134]),CodecPrivate:g([99,162]),VideoTrack:g([224]),AudioTrack:g([225]),Cluster:g([31,67,182,117]),Timestamp:g([231]),TimestampScale:g([42,215,177]),BlockGroup:g([160]),BlockDuration:g([155]),Block:g([161]),SimpleBlock:g([163])},B=[128,64,32,16,8,4,2,1],k=function(e,t,r=!0,n=!1){const o=function(e){let t=1;for(let r=0;r<B.length&&!(e&B[r]);r++)t++;return t}(e[t]);let a=e.subarray(t,t+o);return r&&(a=Array.prototype.slice.call(e,t,t+o),a[0]^=B[o-1]),{length:o,value:A(a,{signed:n}),bytes:a}},_=function(e){return"string"==typeof e?e.match(/.{1,2}/g).map((e=>_(e))):"number"==typeof e?L(e):e},D=(e,t,r)=>{if(r>=t.length)return t.length;const n=k(t,r,!1);if(x(e.bytes,n.bytes))return r;const o=k(t,r+n.length);return D(e,t,r+o.length+o.value+n.length)},R=function(e,t){t=function(e){return Array.isArray(e)?e.map((e=>_(e))):[_(e)]}(t),e=g(e);let r=[];if(!t.length)return r;let n=0;for(;n<e.length;){const o=k(e,n,!1),a=k(e,n+o.length),i=n+o.length+a.length;127===a.value&&(a.value=D(o,e,i),a.value!==e.length&&(a.value-=i));const s=i+a.value>e.length?e.length:i+a.value,l=e.subarray(i,s);x(t[0],o.bytes)&&(1===t.length?r.push(l):r=r.concat(R(l,t.slice(1))));n+=o.length+a.length+l.length}return r},I=g([73,68,51]),N=function(e,t=0){return(e=g(e)).length-t<10||!x(e,I,{offset:t})?t:(t+=function(e,t=0){const r=(e=g(e))[t+5],n=e[t+6]<<21|e[t+7]<<14|e[t+8]<<7|e[t+9];return(16&r)>>4?n+20:n+10}(e,t),N(e,t))},O=g([0,0,0,1]),z=g([0,0,1]),M=g([0,0,3]),F=function(e){const t=[];let r=1;for(;r<e.length-2;)x(e.subarray(r,r+3),M)&&(t.push(r+2),r++),r++;if(0===t.length)return e;const n=e.length-t.length,o=new Uint8Array(n);let a=0;for(r=0;r<n;a++,r++)a===t[0]&&(a++,t.shift()),o[r]=e[a];return o},P=function(e,t,r,n=1/0){e=g(e),r=[].concat(r);let o,a=0,i=0;for(;a<e.length&&(i<n||o);){let n,s;if(x(e.subarray(a),O)?n=4:x(e.subarray(a),z)&&(n=3),n){if(i++,o)return F(e.subarray(o,a));"h264"===t?s=31&e[a+n]:"h265"===t&&(s=e[a+n]>>1&63),-1!==r.indexOf(s)&&(o=a+n),a+=n+("h264"===t?1:2)}else a++}return e.subarray(0,0)},G={webm:g([119,101,98,109]),matroska:g([109,97,116,114,111,115,107,97]),flac:g([102,76,97,67]),ogg:g([79,103,103,83]),ac3:g([11,119]),riff:g([82,73,70,70]),avi:g([65,86,73]),wav:g([87,65,86,69]),"3gp":g([102,116,121,112,51,103]),mp4:g([102,116,121,112]),fmp4:g([115,116,121,112]),mov:g([102,116,121,112,113,116]),moov:g([109,111,111,118]),moof:g([109,111,111,102])},j={aac(e){const t=N(e);return x(e,[255,16],{offset:t,mask:[255,22]})},mp3(e){const t=N(e);return x(e,[255,2],{offset:t,mask:[255,6]})},webm(e){const t=R(e,[E.EBML,E.DocType])[0];return x(t,G.webm)},mkv(e){const t=R(e,[E.EBML,E.DocType])[0];return x(t,G.matroska)},mp4:e=>!j["3gp"](e)&&!j.mov(e)&&(!(!x(e,G.mp4,{offset:4})&&!x(e,G.fmp4,{offset:4}))||(!(!x(e,G.moof,{offset:4})&&!x(e,G.moov,{offset:4}))||void 0)),mov:e=>x(e,G.mov,{offset:4}),"3gp":e=>x(e,G["3gp"],{offset:4}),ac3(e){const t=N(e);return x(e,G.ac3,{offset:t})},ts(e){if(e.length<189&&e.length>=1)return 71===e[0];let t=0;for(;t+188<e.length&&t<188;){if(71===e[t]&&71===e[t+188])return!0;t+=1}return!1},flac(e){const t=N(e);return x(e,G.flac,{offset:t})},ogg:e=>x(e,G.ogg),avi:e=>x(e,G.riff)&&x(e,G.avi,{offset:8}),wav:e=>x(e,G.riff)&&x(e,G.wav,{offset:8}),h264:e=>((e,t,r)=>P(e,"h264",t,r))(e,7,3).length,h265:e=>((e,t,r)=>P(e,"h265",t,r))(e,[32,33],3).length},V=Object.keys(j).filter((e=>"ts"!==e&&"h264"!==e&&"h265"!==e)).concat(["ts","h264","h265"]);V.forEach((function(e){const t=j[e];j[e]=e=>t(g(e))}));const q=j;var $=Object.freeze({__proto__:null,isLikely:q,detectContainerForBytes:e=>{e=g(e);for(let t=0;t<V.length;t++){const r=V[t];if(q[r](e))return r}return""},isLikelyFmp4MediaSegment:e=>S(e,["moof"]).length>0});var H=Object.freeze({__proto__:null,forEachMediaGroup:(e,t,r)=>{t.forEach((t=>{for(const n in e.mediaGroups[t])for(const o in e.mediaGroups[t][n]){const a=e.mediaGroups[t][n][o];r(a,t,n,o)}}))}}),Z={exports:{}};!function(e,t){!function(t){var r=/^((?:[a-zA-Z0-9+\-.]+:)?)(\/\/[^\/?#]*)?((?:[^\/?#]*\/)*[^;?#]*)?(;[^?#]*)?(\?[^#]*)?(#.*)?$/,n=/^([^\/?#]*)(.*)$/,o=/(?:\/|^)\.(?=\/)/g,a=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,i={buildAbsoluteURL:function(e,t,r){if(r=r||{},e=e.trim(),!(t=t.trim())){if(!r.alwaysNormalize)return e;var o=i.parseURL(e);if(!o)throw new Error("Error trying to parse base URL.");return o.path=i.normalizePath(o.path),i.buildURLFromParts(o)}var a=i.parseURL(t);if(!a)throw new Error("Error trying to parse relative URL.");if(a.scheme)return r.alwaysNormalize?(a.path=i.normalizePath(a.path),i.buildURLFromParts(a)):t;var s=i.parseURL(e);if(!s)throw new Error("Error trying to parse base URL.");if(!s.netLoc&&s.path&&"/"!==s.path[0]){var l=n.exec(s.path);s.netLoc=l[1],s.path=l[2]}s.netLoc&&!s.path&&(s.path="/");var c={scheme:s.scheme,netLoc:a.netLoc,path:null,params:a.params,query:a.query,fragment:a.fragment};if(!a.netLoc&&(c.netLoc=s.netLoc,"/"!==a.path[0]))if(a.path){var u=s.path,f=u.substring(0,u.lastIndexOf("/")+1)+a.path;c.path=i.normalizePath(f)}else c.path=s.path,a.params||(c.params=s.params,a.query||(c.query=s.query));return null===c.path&&(c.path=r.alwaysNormalize?i.normalizePath(a.path):a.path),i.buildURLFromParts(c)},parseURL:function(e){var t=r.exec(e);return t?{scheme:t[1]||"",netLoc:t[2]||"",path:t[3]||"",params:t[4]||"",query:t[5]||"",fragment:t[6]||""}:null},normalizePath:function(e){for(e=e.split("").reverse().join("").replace(o,"");e.length!==(e=e.replace(a,"")).length;);return e.split("").reverse().join("")},buildURLFromParts:function(e){return e.scheme+e.netLoc+e.path+e.params+e.query+e.fragment}};e.exports=i}()}(Z);var J=Z.exports;const K="http://example.com";var Q={codecs:c,byteHelpers:T,containers:$,decodeB64ToUint8Array:function(e){const t=(r=e,window.atob?window.atob(r):Buffer.from(r,"base64").toString("binary"));var r;const n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n},mediaGroups:H,resolveUrl:(e,t)=>{if(/^[a-z]+:/i.test(t))return t;/^data:/.test(e)&&(e=window.location&&window.location.href||"");const r="function"==typeof window.URL,n=/^\/\//.test(e),o=!window.location&&!/\/\//i.test(e);if(r?e=new window.URL(e,window.location||K):/\/\//i.test(e)||(e=J.buildAbsoluteURL(window.location&&window.location.href||"",e)),r){const r=new URL(t,e);return o?r.href.slice(K.length):n?r.href.slice(r.protocol.length):r.href}return J.buildAbsoluteURL(e,t)},Stream:class{constructor(){this.listeners={}}on(e,t){this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(t)}off(e,t){if(!this.listeners[e])return!1;const r=this.listeners[e].indexOf(t);return this.listeners[e]=this.listeners[e].slice(0),this.listeners[e].splice(r,1),r>-1}trigger(e){const t=this.listeners[e];if(t)if(2===arguments.length){const e=t.length;for(let r=0;r<e;++r)t[r].call(this,arguments[1])}else{const e=Array.prototype.slice.call(arguments,1),r=t.length;for(let n=0;n<r;++n)t[n].apply(this,e)}}dispose(){this.listeners={}}pipe(e){this.on("data",(function(t){e.push(t)}))}}};return Q}));