diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 5f21d1450e..48adf7e67b 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,8 +8,9 @@ The changelog for SRS. ## SRS 6.0 Changelog -* v5.0, 2023-04-01, Merge [#3392](https://github.com/ossrs/srs/pull/3392): Support composited bridges for 1:N protocols converting. v6.0.41 (#3392) -* v5.0, 2023-04-01, Merge [#3458](https://github.com/ossrs/srs/pull/3450): API: Support HTTP basic authentication for API. v6.0.40 (#3458) +* v6.0, 2023-04-08, Merge [#3495](https://github.com/ossrs/srs/pull/3495): RTMP: Support enhanced RTMP specification for HEVC. v6.0.42 (#3495) +* v6.0, 2023-04-01, Merge [#3392](https://github.com/ossrs/srs/pull/3392): Support composited bridges for 1:N protocols converting. v6.0.41 (#3392) +* v6.0, 2023-04-01, Merge [#3458](https://github.com/ossrs/srs/pull/3450): API: Support HTTP basic authentication for API. v6.0.40 (#3458) * v6.0, 2023-03-27, Merge [#3450](https://github.com/ossrs/srs/pull/3450): WebRTC: Error message carries the SDP when failed. v6.0.39 (#3450) * v6.0, 2023-03-25, Merge [#3477](https://github.com/ossrs/srs/pull/3477): Remove unnecessary NULL check in srs_freep. v6.0.38 (#3477) * v6.0, 2023-03-25, Merge [#3455](https://github.com/ossrs/srs/pull/3455): RTC: Call on_play before create session, for it might be freed for timeout. v6.0.37 (#3455) diff --git a/trunk/research/players/js/mpegts-1.7.2.min.js b/trunk/research/players/js/mpegts-1.7.2.min.js deleted file mode 100644 index 05e7de954f..0000000000 --- a/trunk/research/players/js/mpegts-1.7.2.min.js +++ /dev/null @@ -1,9 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.mpegts=t():e.mpegts=t()}(window,(function(){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=14)}([function(e,t,i){"use strict";var n=i(6),r=i.n(n),a=function(){function e(){}return e.e=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","error",n),e.ENABLE_ERROR&&(console.error?console.error(n):console.warn?console.warn(n):console.log(n))},e.i=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","info",n),e.ENABLE_INFO&&(console.info?console.info(n):console.log(n))},e.w=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","warn",n),e.ENABLE_WARN&&(console.warn?console.warn(n):console.log(n))},e.d=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","debug",n),e.ENABLE_DEBUG&&(console.debug?console.debug(n):console.log(n))},e.v=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","verbose",n),e.ENABLE_VERBOSE&&console.log(n)},e}();a.GLOBAL_TAG="mpegts.js",a.FORCE_GLOBAL_TAG=!1,a.ENABLE_ERROR=!0,a.ENABLE_INFO=!0,a.ENABLE_WARN=!0,a.ENABLE_DEBUG=!0,a.ENABLE_VERBOSE=!0,a.ENABLE_CALLBACK=!1,a.emitter=new r.a,t.a=a},function(e,t,i){"use strict";t.a={IO_ERROR:"io_error",DEMUX_ERROR:"demux_error",INIT_SEGMENT:"init_segment",MEDIA_SEGMENT:"media_segment",LOADING_COMPLETE:"loading_complete",RECOVERED_EARLY_EOF:"recovered_early_eof",MEDIA_INFO:"media_info",METADATA_ARRIVED:"metadata_arrived",SCRIPTDATA_ARRIVED:"scriptdata_arrived",TIMED_ID3_METADATA_ARRIVED:"timed_id3_metadata_arrived",SMPTE2038_METADATA_ARRIVED:"smpte2038_metadata_arrived",SCTE35_METADATA_ARRIVED:"scte35_metadata_arrived",PES_PRIVATE_DATA_DESCRIPTOR:"pes_private_data_descriptor",PES_PRIVATE_DATA_ARRIVED:"pes_private_data_arrived",STATISTICS_INFO:"statistics_info",RECOMMEND_SEEKPOINT:"recommend_seekpoint"}},function(e,t,i){"use strict";i.d(t,"c",(function(){return r})),i.d(t,"b",(function(){return a})),i.d(t,"a",(function(){return s}));var n=i(3),r={kIdle:0,kConnecting:1,kBuffering:2,kError:3,kComplete:4},a={OK:"OK",EXCEPTION:"Exception",HTTP_STATUS_CODE_INVALID:"HttpStatusCodeInvalid",CONNECTING_TIMEOUT:"ConnectingTimeout",EARLY_EOF:"EarlyEof",UNRECOVERABLE_EARLY_EOF:"UnrecoverableEarlyEof"},s=function(){function e(e){this._type=e||"undefined",this._status=r.kIdle,this._needStash=!1,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null}return e.prototype.destroy=function(){this._status=r.kIdle,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null},e.prototype.isWorking=function(){return this._status===r.kConnecting||this._status===r.kBuffering},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"status",{get:function(){return this._status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"needStashBuffer",{get:function(){return this._needStash},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onContentLengthKnown",{get:function(){return this._onContentLengthKnown},set:function(e){this._onContentLengthKnown=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onURLRedirect",{get:function(){return this._onURLRedirect},set:function(e){this._onURLRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),e.prototype.open=function(e,t){throw new n.c("Unimplemented abstract function!")},e.prototype.abort=function(){throw new n.c("Unimplemented abstract function!")},e}()},function(e,t,i){"use strict";i.d(t,"d",(function(){return a})),i.d(t,"a",(function(){return s})),i.d(t,"b",(function(){return o})),i.d(t,"c",(function(){return d}));var n,r=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),a=function(){function e(e){this._message=e}return Object.defineProperty(e.prototype,"name",{get:function(){return"RuntimeException"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return this.name+": "+this.message},e}(),s=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"IllegalStateException"},enumerable:!1,configurable:!0}),t}(a),o=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"InvalidArgumentException"},enumerable:!1,configurable:!0}),t}(a),d=function(e){function t(t){return e.call(this,t)||this}return r(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"NotImplementedException"},enumerable:!1,configurable:!0}),t}(a)},function(e,t,i){"use strict";var n={};!function(){var e=self.navigator.userAgent.toLowerCase(),t=/(edge)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(chrome)[ \/]([\w.]+)/.exec(e)||/(iemobile)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("trident")>=0&&/(rv)(?::| )([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(firefox)[ \/]([\w.]+)/.exec(e)||[],i=/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(android)/.exec(e)||/(windows)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||[],r={browser:t[5]||t[3]||t[1]||"",version:t[2]||t[4]||"0",majorVersion:t[4]||t[2]||"0",platform:i[0]||""},a={};if(r.browser){a[r.browser]=!0;var s=r.majorVersion.split(".");a.version={major:parseInt(r.majorVersion,10),string:r.version},s.length>1&&(a.version.minor=parseInt(s[1],10)),s.length>2&&(a.version.build=parseInt(s[2],10))}if(r.platform&&(a[r.platform]=!0),(a.chrome||a.opr||a.safari)&&(a.webkit=!0),a.rv||a.iemobile){a.rv&&delete a.rv;r.browser="msie",a.msie=!0}if(a.edge){delete a.edge;r.browser="msedge",a.msedge=!0}if(a.opr){r.browser="opera",a.opera=!0}if(a.safari&&a.android){r.browser="android",a.android=!0}for(var o in a.name=r.browser,a.platform=r.platform,n)n.hasOwnProperty(o)&&delete n[o];Object.assign(n,a)}(),t.a=n},function(e,t,i){"use strict";t.a={OK:"OK",FORMAT_ERROR:"FormatError",FORMAT_UNSUPPORTED:"FormatUnsupported",CODEC_UNSUPPORTED:"CodecUnsupported"}},function(e,t,i){"use strict";var n,r="object"==typeof Reflect?Reflect:null,a=r&&"function"==typeof r.apply?r.apply:function(e,t,i){return Function.prototype.apply.call(e,t,i)};n=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function o(){o.init.call(this)}e.exports=o,e.exports.once=function(e,t){return new Promise((function(i,n){function r(i){e.removeListener(t,a),n(i)}function a(){"function"==typeof e.removeListener&&e.removeListener("error",r),i([].slice.call(arguments))}g(e,t,a,{once:!0}),"error"!==t&&function(e,t,i){"function"==typeof e.on&&g(e,"error",t,i)}(e,r,{once:!0})}))},o.EventEmitter=o,o.prototype._events=void 0,o.prototype._eventsCount=0,o.prototype._maxListeners=void 0;var d=10;function h(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function _(e){return void 0===e._maxListeners?o.defaultMaxListeners:e._maxListeners}function u(e,t,i,n){var r,a,s,o;if(h(i),void 0===(a=e._events)?(a=e._events=Object.create(null),e._eventsCount=0):(void 0!==a.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),a=e._events),s=a[t]),void 0===s)s=a[t]=i,++e._eventsCount;else if("function"==typeof s?s=a[t]=n?[i,s]:[s,i]:n?s.unshift(i):s.push(i),(r=_(e))>0&&s.length>r&&!s.warned){s.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=s.length,o=d,console&&console.warn&&console.warn(o)}return e}function l(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function c(e,t,i){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:i},r=l.bind(n);return r.listener=i,n.wrapFn=r,r}function f(e,t,i){var n=e._events;if(void 0===n)return[];var r=n[t];return void 0===r?[]:"function"==typeof r?i?[r.listener||r]:[r]:i?function(e){for(var t=new Array(e.length),i=0;i0&&(s=t[0]),s instanceof Error)throw s;var o=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw o.context=s,o}var d=r[e];if(void 0===d)return!1;if("function"==typeof d)a(d,this,t);else{var h=d.length,_=m(d,h);for(i=0;i=0;a--)if(i[a]===t||i[a].listener===t){s=i[a].listener,r=a;break}if(r<0)return this;0===r?i.shift():function(e,t){for(;t+1=0;n--)this.removeListener(e,t[n]);return this},o.prototype.listeners=function(e){return f(this,e,!0)},o.prototype.rawListeners=function(e){return f(this,e,!1)},o.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},o.prototype.listenerCount=p,o.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]}},function(e,t,i){"use strict";i.d(t,"d",(function(){return n})),i.d(t,"b",(function(){return r})),i.d(t,"a",(function(){return a})),i.d(t,"c",(function(){return s}));var n=function(e,t,i,n,r){this.dts=e,this.pts=t,this.duration=i,this.originalDts=n,this.isSyncPoint=r,this.fileposition=null},r=function(){function e(){this.beginDts=0,this.endDts=0,this.beginPts=0,this.endPts=0,this.originalBeginDts=0,this.originalEndDts=0,this.syncPoints=[],this.firstSample=null,this.lastSample=null}return e.prototype.appendSyncPoint=function(e){e.isSyncPoint=!0,this.syncPoints.push(e)},e}(),a=function(){function e(){this._list=[]}return e.prototype.clear=function(){this._list=[]},e.prototype.appendArray=function(e){var t=this._list;0!==e.length&&(t.length>0&&e[0].originalDts=t[r].dts&&et[n].lastSample.originalDts&&e=t[n].lastSample.originalDts&&(n===t.length-1||n0&&(r=this._searchNearestSegmentBefore(i.originalBeginDts)+1),this._lastAppendLocation=r,this._list.splice(r,0,i)},e.prototype.getLastSegmentBefore=function(e){var t=this._searchNearestSegmentBefore(e);return t>=0?this._list[t]:null},e.prototype.getLastSampleBefore=function(e){var t=this.getLastSegmentBefore(e);return null!=t?t.lastSample:null},e.prototype.getLastSyncPointBefore=function(e){for(var t=this._searchNearestSegmentBefore(e),i=this._list[t].syncPoints;0===i.length&&t>0;)t--,i=this._list[t].syncPoints;return i.length>0?i[i.length-1]:null},e}()},function(e,t,i){"use strict";var n=function(){function e(){this.mimeType=null,this.duration=null,this.hasAudio=null,this.hasVideo=null,this.audioCodec=null,this.videoCodec=null,this.audioDataRate=null,this.videoDataRate=null,this.audioSampleRate=null,this.audioChannelCount=null,this.width=null,this.height=null,this.fps=null,this.profile=null,this.level=null,this.refFrames=null,this.chromaFormat=null,this.sarNum=null,this.sarDen=null,this.metadata=null,this.segments=null,this.segmentCount=null,this.hasKeyframesIndex=null,this.keyframesIndex=null}return e.prototype.isComplete=function(){var e=!1===this.hasAudio||!0===this.hasAudio&&null!=this.audioCodec&&null!=this.audioSampleRate&&null!=this.audioChannelCount,t=!1===this.hasVideo||!0===this.hasVideo&&null!=this.videoCodec&&null!=this.width&&null!=this.height&&null!=this.fps&&null!=this.profile&&null!=this.level&&null!=this.refFrames&&null!=this.chromaFormat&&null!=this.sarNum&&null!=this.sarDen;return null!=this.mimeType&&e&&t},e.prototype.isSeekable=function(){return!0===this.hasKeyframesIndex},e.prototype.getNearestKeyframe=function(e){if(null==this.keyframesIndex)return null;var t=this.keyframesIndex,i=this._search(t.times,e);return{index:i,milliseconds:t.times[i],fileposition:t.filepositions[i]}},e.prototype._search=function(e,t){var i=0,n=e.length-1,r=0,a=0,s=n;for(t=e[r]&&t0){var i=e.getConfig();t.emit("change",i)}},e.registerListener=function(t){e.emitter.addListener("change",t)},e.removeListener=function(t){e.emitter.removeListener("change",t)},e.addLogListener=function(t){a.a.emitter.addListener("log",t),a.a.emitter.listenerCount("log")>0&&(a.a.ENABLE_CALLBACK=!0,e._notifyChange())},e.removeLogListener=function(t){a.a.emitter.removeListener("log",t),0===a.a.emitter.listenerCount("log")&&(a.a.ENABLE_CALLBACK=!1,e._notifyChange())},e}();s.emitter=new r.a,t.a=s},function(e,t,i){"use strict";var n=i(6),r=i.n(n),a=i(0),s=i(4),o=i(8);function d(e,t,i){var n=e;if(t+i=128){t.push(String.fromCharCode(65535&a)),n+=2;continue}}else if(i[n]<240){if(d(i,n,2))if((a=(15&i[n])<<12|(63&i[n+1])<<6|63&i[n+2])>=2048&&55296!=(63488&a)){t.push(String.fromCharCode(65535&a)),n+=3;continue}}else if(i[n]<248){var a;if(d(i,n,3))if((a=(7&i[n])<<18|(63&i[n+1])<<12|(63&i[n+2])<<6|63&i[n+3])>65536&&a<1114112){a-=65536,t.push(String.fromCharCode(a>>>10|55296)),t.push(String.fromCharCode(1023&a|56320)),n+=4;continue}}t.push(String.fromCharCode(65533)),++n}return t.join("")},u=i(3),l=(h=new ArrayBuffer(2),new DataView(h).setInt16(0,256,!0),256===new Int16Array(h)[0]),c=function(){function e(){}return e.parseScriptData=function(t,i,n){var r={};try{var s=e.parseValue(t,i,n),o=e.parseValue(t,i+s.size,n-s.size);r[s.data]=o.data}catch(e){a.a.e("AMF",e.toString())}return r},e.parseObject=function(t,i,n){if(n<3)throw new u.a("Data not enough when parse ScriptDataObject");var r=e.parseString(t,i,n),a=e.parseValue(t,i+r.size,n-r.size),s=a.objectEnd;return{data:{name:r.data,value:a.data},size:r.size+a.size,objectEnd:s}},e.parseVariable=function(t,i,n){return e.parseObject(t,i,n)},e.parseString=function(e,t,i){if(i<2)throw new u.a("Data not enough when parse String");var n=new DataView(e,t,i).getUint16(0,!l);return{data:n>0?_(new Uint8Array(e,t+2,n)):"",size:2+n}},e.parseLongString=function(e,t,i){if(i<4)throw new u.a("Data not enough when parse LongString");var n=new DataView(e,t,i).getUint32(0,!l);return{data:n>0?_(new Uint8Array(e,t+4,n)):"",size:4+n}},e.parseDate=function(e,t,i){if(i<10)throw new u.a("Data size invalid when parse Date");var n=new DataView(e,t,i),r=n.getFloat64(0,!l),a=n.getInt16(8,!l);return{data:new Date(r+=60*a*1e3),size:10}},e.parseValue=function(t,i,n){if(n<1)throw new u.a("Data not enough when parse Value");var r,s=new DataView(t,i,n),o=1,d=s.getUint8(0),h=!1;try{switch(d){case 0:r=s.getFloat64(1,!l),o+=8;break;case 1:r=!!s.getUint8(1),o+=1;break;case 2:var _=e.parseString(t,i+1,n-1);r=_.data,o+=_.size;break;case 3:r={};var c=0;for(9==(16777215&s.getUint32(n-4,!l))&&(c=3);o32)throw new u.b("ExpGolomb: readBits() bits exceeded max 32bits!");if(e<=this._current_word_bits_left){var t=this._current_word>>>32-e;return this._current_word<<=e,this._current_word_bits_left-=e,t}var i=this._current_word_bits_left?this._current_word:0;i>>>=32-this._current_word_bits_left;var n=e-this._current_word_bits_left;this._fillCurrentWord();var r=Math.min(n,this._current_word_bits_left),a=this._current_word>>>32-r;return this._current_word<<=r,this._current_word_bits_left-=r,i=i<>>e))return this._current_word<<=e,this._current_word_bits_left-=e,e;return this._fillCurrentWord(),e+this._skipLeadingZero()},e.prototype.readUEG=function(){var e=this._skipLeadingZero();return this.readBits(e+1)-1},e.prototype.readSEG=function(){var e=this.readUEG();return 1&e?e+1>>>1:-1*(e>>>1)},e}(),p=function(){function e(){}return e._ebsp2rbsp=function(e){for(var t=e,i=t.byteLength,n=new Uint8Array(i),r=0,a=0;a=2&&3===t[a]&&0===t[a-1]&&0===t[a-2]||(n[r]=t[a],r++);return new Uint8Array(n.buffer,0,r)},e.parseSPS=function(t){for(var i=t.subarray(1,4),n="avc1.",r=0;r<3;r++){var a=i[r].toString(16);a.length<2&&(a="0"+a),n+=a}var s=e._ebsp2rbsp(t),o=new f(s);o.readByte();var d=o.readByte();o.readByte();var h=o.readByte();o.readUEG();var _=e.getProfileString(d),u=e.getLevelString(h),l=1,c=420,p=8,m=8;if((100===d||110===d||122===d||244===d||44===d||83===d||86===d||118===d||128===d||138===d||144===d)&&(3===(l=o.readUEG())&&o.readBits(1),l<=3&&(c=[0,420,422,444][l]),p=o.readUEG()+8,m=o.readUEG()+8,o.readBits(1),o.readBool()))for(var g=3!==l?8:12,v=0;v0&&M<16?(k=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][M-1],C=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][M-1]):255===M&&(k=o.readByte()<<8|o.readByte(),C=o.readByte()<<8|o.readByte())}if(o.readBool()&&o.readBool(),o.readBool()&&(o.readBits(4),o.readBool()&&o.readBits(24)),o.readBool()&&(o.readUEG(),o.readUEG()),o.readBool()){var x=o.readBits(32),U=o.readBits(32);I=o.readBool(),B=(P=U)/(O=2*x)}}var N=1;1===k&&1===C||(N=k/C);var G=0,V=0;0===l?(G=1,V=2-R):(G=3===l?1:2,V=(1===l?2:1)*(2-R));var F=16*(b+1),j=16*(A+1)*(2-R);F-=(T+L)*G,j-=(w+D)*V;var z=Math.ceil(F*N);return o.destroy(),o=null,{codec_mimetype:n,profile_idc:d,level_idc:h,profile_string:_,level_string:u,chroma_format_idc:l,bit_depth:p,bit_depth_luma:p,bit_depth_chroma:m,ref_frames:S,chroma_format:c,chroma_format_string:e.getChromaFormatString(c),frame_rate:{fixed:I,fps:B,fps_den:O,fps_num:P},sar_ratio:{width:k,height:C},codec_size:{width:F,height:j},present_size:{width:z,height:j}}},e._skipScalingList=function(e,t){for(var i=8,n=8,r=0;r=2&&3===t[a]&&0===t[a-1]&&0===t[a-2]||(n[r]=t[a],r++);return new Uint8Array(n.buffer,0,r)},e.parseVPS=function(t){var i=e._ebsp2rbsp(t),n=new f(i);n.readByte(),n.readByte();n.readBits(4);n.readBits(2);n.readBits(6);return{num_temporal_layers:n.readBits(3)+1,temporal_id_nested:n.readBool()}},e.parseSPS=function(t){var i=e._ebsp2rbsp(t),n=new f(i);n.readByte(),n.readByte();n.readBits(4);for(var r=n.readBits(3),a=(n.readBool(),n.readBits(2)),s=n.readBool(),o=n.readBits(5),d=n.readByte(),h=n.readByte(),_=n.readByte(),u=n.readByte(),l=n.readByte(),c=n.readByte(),p=n.readByte(),m=n.readByte(),g=n.readByte(),v=n.readByte(),y=n.readByte(),E=[],S=[],b=0;b0)for(b=r;b<8;b++)n.readBits(2);for(b=0;b1&&n.readSEG();for(b=0;b0&&X<16?(z=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][X-1],H=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][X-1]):255===X&&(z=n.readBits(16),H=n.readBits(16))}if(n.readBool()&&n.readBool(),n.readBool())n.readBits(3),n.readBool(),n.readBool()&&(n.readByte(),n.readByte(),n.readByte());n.readBool()&&(n.readUEG(),n.readUEG());n.readBool(),n.readBool(),n.readBool();if(n.readBool()&&(n.readUEG(),n.readUEG(),n.readUEG(),n.readUEG()),n.readBool())if(K=n.readBits(32),W=n.readBits(32),n.readBool())if(n.readUEG(),n.readBool()){var Y=!1,Z=!1,J=!1;if(Y=n.readBool(),Z=n.readBool(),Y||Z){(J=n.readBool())&&(n.readByte(),n.readBits(5),n.readBool(),n.readBits(5));n.readBits(4),n.readBits(4);J&&n.readBits(4),n.readBits(5),n.readBits(5),n.readBits(5)}for(b=0;b<=r;b++){var Q=n.readBool();q=Q;var $=!1,ee=1;Q||($=n.readBool());var te=!1;if($?n.readSEG():te=n.readBool(),te||(ee=n.readUEG()+1),Y)for(x=0;x>>2!=0,s=0!=(1&t[4]),o=(n=t)[r=5]<<24|n[r+1]<<16|n[r+2]<<8|n[r+3];return o<9?i:{match:!0,consumed:o,dataOffset:o,hasAudioTrack:a,hasVideoTrack:s}},e.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},Object.defineProperty(e.prototype,"onTrackMetadata",{get:function(){return this._onTrackMetadata},set:function(e){this._onTrackMetadata=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaInfo",{get:function(){return this._onMediaInfo},set:function(e){this._onMediaInfo=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMetaDataArrived",{get:function(){return this._onMetaDataArrived},set:function(e){this._onMetaDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onScriptDataArrived",{get:function(){return this._onScriptDataArrived},set:function(e){this._onScriptDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataAvailable",{get:function(){return this._onDataAvailable},set:function(e){this._onDataAvailable=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"timestampBase",{get:function(){return this._timestampBase},set:function(e){this._timestampBase=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedDuration",{get:function(){return this._duration},set:function(e){this._durationOverrided=!0,this._duration=e,this._mediaInfo.duration=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasAudio",{set:function(e){this._hasAudioFlagOverrided=!0,this._hasAudio=e,this._mediaInfo.hasAudio=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasVideo",{set:function(e){this._hasVideoFlagOverrided=!0,this._hasVideo=e,this._mediaInfo.hasVideo=e},enumerable:!1,configurable:!0}),e.prototype.resetMediaInfo=function(){this._mediaInfo=new o.a},e.prototype._isInitialMetadataDispatched=function(){return this._hasAudio&&this._hasVideo?this._audioInitialMetadataDispatched&&this._videoInitialMetadataDispatched:this._hasAudio&&!this._hasVideo?this._audioInitialMetadataDispatched:!(this._hasAudio||!this._hasVideo)&&this._videoInitialMetadataDispatched},e.prototype.parseChunks=function(t,i){if(!(this._onError&&this._onMediaInfo&&this._onTrackMetadata&&this._onDataAvailable))throw new u.a("Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var n=0,r=this._littleEndian;if(0===i){if(!(t.byteLength>13))return 0;n=e.probe(t).dataOffset}this._firstParse&&(this._firstParse=!1,i+n!==this._dataOffset&&a.a.w(this.TAG,"First time parsing but chunk byteStart invalid!"),0!==(s=new DataView(t,n)).getUint32(0,!r)&&a.a.w(this.TAG,"PrevTagSize0 !== 0 !!!"),n+=4);for(;nt.byteLength)break;var o=s.getUint8(0),d=16777215&s.getUint32(0,!r);if(n+11+d+4>t.byteLength)break;if(8===o||9===o||18===o){var h=s.getUint8(4),_=s.getUint8(5),l=s.getUint8(6)|_<<8|h<<16|s.getUint8(7)<<24;0!==(16777215&s.getUint32(7,!r))&&a.a.w(this.TAG,"Meet tag which has StreamID != 0!");var c=n+11;switch(o){case 8:this._parseAudioData(t,c,d,l);break;case 9:this._parseVideoData(t,c,d,l,i+n);break;case 18:this._parseScriptData(t,c,d)}var f=s.getUint32(11+d,!r);f!==11+d&&a.a.w(this.TAG,"Invalid PrevTagSize "+f),n+=11+d+4}else a.a.w(this.TAG,"Unsupported tag type "+o+", skipped"),n+=11+d+4}return this._isInitialMetadataDispatched()&&this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack),n},e.prototype._parseScriptData=function(e,t,i){var n=c.parseScriptData(e,t,i);if(n.hasOwnProperty("onMetaData")){if(null==n.onMetaData||"object"!=typeof n.onMetaData)return void a.a.w(this.TAG,"Invalid onMetaData structure!");this._metadata&&a.a.w(this.TAG,"Found another onMetaData tag!"),this._metadata=n;var r=this._metadata.onMetaData;if(this._onMetaDataArrived&&this._onMetaDataArrived(Object.assign({},r)),"boolean"==typeof r.hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=r.hasAudio,this._mediaInfo.hasAudio=this._hasAudio),"boolean"==typeof r.hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=r.hasVideo,this._mediaInfo.hasVideo=this._hasVideo),"number"==typeof r.audiodatarate&&(this._mediaInfo.audioDataRate=r.audiodatarate),"number"==typeof r.videodatarate&&(this._mediaInfo.videoDataRate=r.videodatarate),"number"==typeof r.width&&(this._mediaInfo.width=r.width),"number"==typeof r.height&&(this._mediaInfo.height=r.height),"number"==typeof r.duration){if(!this._durationOverrided){var s=Math.floor(r.duration*this._timescale);this._duration=s,this._mediaInfo.duration=s}}else this._mediaInfo.duration=0;if("number"==typeof r.framerate){var o=Math.floor(1e3*r.framerate);if(o>0){var d=o/1e3;this._referenceFrameRate.fixed=!0,this._referenceFrameRate.fps=d,this._referenceFrameRate.fps_num=o,this._referenceFrameRate.fps_den=1e3,this._mediaInfo.fps=d}}if("object"==typeof r.keyframes){this._mediaInfo.hasKeyframesIndex=!0;var h=r.keyframes;this._mediaInfo.keyframesIndex=this._parseKeyframesIndex(h),r.keyframes=null}else this._mediaInfo.hasKeyframesIndex=!1;this._dispatch=!1,this._mediaInfo.metadata=r,a.a.v(this.TAG,"Parsed onMetaData"),this._mediaInfo.isComplete()&&this._onMediaInfo(this._mediaInfo)}Object.keys(n).length>0&&this._onScriptDataArrived&&this._onScriptDataArrived(Object.assign({},n))},e.prototype._parseKeyframesIndex=function(e){for(var t=[],i=[],n=1;n>>4;if(2===s||10===s){var o=0,d=(12&r)>>>2;if(d>=0&&d<=4){o=this._flvSoundRateTable[d];var h=1&r,_=this._audioMetadata,u=this._audioTrack;if(_||(!1===this._hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=!0,this._mediaInfo.hasAudio=!0),(_=this._audioMetadata={}).type="audio",_.id=u.id,_.timescale=this._timescale,_.duration=this._duration,_.audioSampleRate=o,_.channelCount=0===h?1:2),10===s){var l=this._parseAACAudioData(e,t+1,i-1);if(null==l)return;if(0===l.packetType){if(_.config){if(S(l.data.config,_.config))return;a.a.w(this.TAG,"AudioSpecificConfig has been changed, re-generate initialization segment")}var c=l.data;_.audioSampleRate=c.samplingRate,_.channelCount=c.channelCount,_.codec=c.codec,_.originalCodec=c.originalCodec,_.config=c.config,_.refSampleDuration=1024/_.audioSampleRate*_.timescale,a.a.v(this.TAG,"Parsed AudioSpecificConfig"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._audioInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("audio",_),(g=this._mediaInfo).audioCodec=_.originalCodec,g.audioSampleRate=_.audioSampleRate,g.audioChannelCount=_.channelCount,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}else if(1===l.packetType){var f=this._timestampBase+n,p={unit:l.data,length:l.data.byteLength,dts:f,pts:f};u.samples.push(p),u.length+=l.data.length}else a.a.e(this.TAG,"Flv: Unsupported AAC data type "+l.packetType)}else if(2===s){if(!_.codec){var g;if(null==(c=this._parseMP3AudioData(e,t+1,i-1,!0)))return;_.audioSampleRate=c.samplingRate,_.channelCount=c.channelCount,_.codec=c.codec,_.originalCodec=c.originalCodec,_.refSampleDuration=1152/_.audioSampleRate*_.timescale,a.a.v(this.TAG,"Parsed MPEG Audio Frame Header"),this._audioInitialMetadataDispatched=!0,this._onTrackMetadata("audio",_),(g=this._mediaInfo).audioCodec=_.codec,g.audioSampleRate=_.audioSampleRate,g.audioChannelCount=_.channelCount,g.audioDataRate=c.bitRate,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}var v=this._parseMP3AudioData(e,t+1,i-1,!1);if(null==v)return;f=this._timestampBase+n;var y={unit:v,length:v.byteLength,dts:f,pts:f};u.samples.push(y),u.length+=v.length}}else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid audio sample rate idx: "+d)}else this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported audio codec idx: "+s)}},e.prototype._parseAACAudioData=function(e,t,i){if(!(i<=1)){var n={},r=new Uint8Array(e,t,i);return n.packetType=r[0],0===r[0]?n.data=this._parseAACAudioSpecificConfig(e,t+1,i-1):n.data=r.subarray(1),n}a.a.w(this.TAG,"Flv: Invalid AAC packet, missing AACPacketType or/and Data!")},e.prototype._parseAACAudioSpecificConfig=function(e,t,i){var n,r,a=new Uint8Array(e,t,i),s=null,o=0,d=null;if(o=n=a[0]>>>3,(r=(7&a[0])<<1|a[1]>>>7)<0||r>=this._mpegSamplingRates.length)this._onError(m.a.FORMAT_ERROR,"Flv: AAC invalid sampling frequency index!");else{var h=this._mpegSamplingRates[r],_=(120&a[1])>>>3;if(!(_<0||_>=8)){5===o&&(d=(7&a[1])<<1|a[2]>>>7,(124&a[2])>>>2);var u=self.navigator.userAgent.toLowerCase();return-1!==u.indexOf("firefox")?r>=6?(o=5,s=new Array(4),d=r-3):(o=2,s=new Array(2),d=r):-1!==u.indexOf("android")?(o=2,s=new Array(2),d=r):(o=5,d=r,s=new Array(4),r>=6?d=r-3:1===_&&(o=2,s=new Array(2),d=r)),s[0]=o<<3,s[0]|=(15&r)>>>1,s[1]=(15&r)<<7,s[1]|=(15&_)<<3,5===o&&(s[1]|=(15&d)>>>1,s[2]=(1&d)<<7,s[2]|=8,s[3]=0),{config:s,samplingRate:h,channelCount:_,codec:"mp4a.40."+o,originalCodec:"mp4a.40."+n}}this._onError(m.a.FORMAT_ERROR,"Flv: AAC invalid channel configuration")}},e.prototype._parseMP3AudioData=function(e,t,i,n){if(!(i<4)){this._littleEndian;var r=new Uint8Array(e,t,i),s=null;if(n){if(255!==r[0])return;var o=r[1]>>>3&3,d=(6&r[1])>>1,h=(240&r[2])>>>4,_=(12&r[2])>>>2,u=3!==(r[3]>>>6&3)?2:1,l=0,c=0;switch(o){case 0:l=this._mpegAudioV25SampleRateTable[_];break;case 2:l=this._mpegAudioV20SampleRateTable[_];break;case 3:l=this._mpegAudioV10SampleRateTable[_]}switch(d){case 1:34,h>>4,d=15&s;if(7===d)this._parseAVCVideoPacket(e,t+1,i-1,n,r,o);else{if(12!==d)return void this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported codec in video frame: "+d);this._parseHEVCVideoPacket(e,t+1,i-1,n,r,o)}}},e.prototype._parseAVCVideoPacket=function(e,t,i,n,r,s){if(i<4)a.a.w(this.TAG,"Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime");else{var o=this._littleEndian,d=new DataView(e,t,i),h=d.getUint8(0),_=(16777215&d.getUint32(0,!o))<<8>>8;if(0===h)this._parseAVCDecoderConfigurationRecord(e,t+4,i-4);else if(1===h)this._parseAVCVideoData(e,t+4,i-4,n,r,s,_);else if(2!==h)return void this._onError(m.a.FORMAT_ERROR,"Flv: Invalid video packet type "+h)}},e.prototype._parseHEVCVideoPacket=function(e,t,i,n,r,s){if(i<4)a.a.w(this.TAG,"Flv: Invalid HEVC packet, missing HEVCPacketType or/and CompositionTime");else{var o=this._littleEndian,d=new DataView(e,t,i),h=d.getUint8(0),_=(16777215&d.getUint32(0,!o))<<8>>8;if(0===h)this._parseHEVCDecoderConfigurationRecord(e,t+4,i-4);else if(1===h)this._parseHEVCVideoData(e,t+4,i-4,n,r,s,_);else if(2!==h)return void this._onError(m.a.FORMAT_ERROR,"Flv: Invalid video packet type "+h)}},e.prototype._parseAVCDecoderConfigurationRecord=function(e,t,i){if(i<7)a.a.w(this.TAG,"Flv: Invalid AVCDecoderConfigurationRecord, lack of data!");else{var n=this._videoMetadata,r=this._videoTrack,s=this._littleEndian,o=new DataView(e,t,i);if(n){if(void 0!==n.avcc){var d=new Uint8Array(e,t,i);if(S(d,n.avcc))return;a.a.w(this.TAG,"AVCDecoderConfigurationRecord has been changed, re-generate initialization segment")}}else!1===this._hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=!0,this._mediaInfo.hasVideo=!0),(n=this._videoMetadata={}).type="video",n.id=r.id,n.timescale=this._timescale,n.duration=this._duration;var h=o.getUint8(0),_=o.getUint8(1);o.getUint8(2),o.getUint8(3);if(1===h&&0!==_)if(this._naluLengthSize=1+(3&o.getUint8(4)),3===this._naluLengthSize||4===this._naluLengthSize){var u=31&o.getUint8(5);if(0!==u){u>1&&a.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: SPS Count = "+u);for(var l=6,c=0;c1&&a.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: PPS Count = "+w),l++;for(c=0;c=i){a.a.w(this.TAG,"Malformed Nalu near timestamp "+f+", offset = "+l+", dataSize = "+i);break}var m=h.getUint32(l,!d);if(3===c&&(m>>>=8),m>i-c)return void a.a.w(this.TAG,"Malformed Nalus near timestamp "+f+", NaluSize > DataSize!");var g=31&h.getUint8(l+c);5===g&&(p=!0);var v=new Uint8Array(e,t+l,c+m),y={type:g,data:v};_.push(y),u+=v.byteLength,l+=c+m}if(_.length){var E=this._videoTrack,S={units:_,length:u,isKeyframe:p,dts:f,cts:o,pts:f+o};p&&(S.fileposition=r),E.samples.push(S),E.length+=u}},e.prototype._parseHEVCVideoData=function(e,t,i,n,r,s,o){for(var d=this._littleEndian,h=new DataView(e,t,i),_=[],u=0,l=0,c=this._naluLengthSize,f=this._timestampBase+n,p=1===s;l=i){a.a.w(this.TAG,"Malformed Nalu near timestamp "+f+", offset = "+l+", dataSize = "+i);break}var m=h.getUint32(l,!d);if(3===c&&(m>>>=8),m>i-c)return void a.a.w(this.TAG,"Malformed Nalus near timestamp "+f+", NaluSize > DataSize!");var g=31&h.getUint8(l+c);19!==g&&20!==g||(p=!0);var v=new Uint8Array(e,t+l,c+m),y={type:g,data:v};_.push(y),u+=v.byteLength,l+=c+m}if(_.length){var E=this._videoTrack,S={units:_,length:u,isKeyframe:p,dts:f,cts:o,pts:f+o};p&&(S.fileposition=r),E.samples.push(S),E.length+=u}},e}(),R=function(){function e(){}return e.prototype.destroy=function(){this.onError=null,this.onMediaInfo=null,this.onMetaDataArrived=null,this.onTrackMetadata=null,this.onDataAvailable=null,this.onTimedID3Metadata=null,this.onSMPTE2038Metadata=null,this.onSCTE35Metadata=null,this.onPESPrivateData=null,this.onPESPrivateDataDescriptor=null},e}(),T=function(){this.program_pmt_pid={}};!function(e){e[e.kMPEG1Audio=3]="kMPEG1Audio",e[e.kMPEG2Audio=4]="kMPEG2Audio",e[e.kPESPrivateData=6]="kPESPrivateData",e[e.kADTSAAC=15]="kADTSAAC",e[e.kID3=21]="kID3",e[e.kSCTE35=134]="kSCTE35",e[e.kH264=27]="kH264",e[e.kH265=36]="kH265"}(b||(b={}));var L,w=function(){this.pid_stream_type={},this.common_pids={h264:void 0,h265:void 0,adts_aac:void 0,mp3:void 0},this.pes_private_data_pids={},this.timed_id3_pids={},this.scte_35_pids={},this.smpte2038_pids={}},D=function(){},k=function(){},C=function(){this.slices=[],this.total_length=0,this.expected_length=0,this.file_position=0};!function(e){e[e.kUnspecified=0]="kUnspecified",e[e.kSliceNonIDR=1]="kSliceNonIDR",e[e.kSliceDPA=2]="kSliceDPA",e[e.kSliceDPB=3]="kSliceDPB",e[e.kSliceDPC=4]="kSliceDPC",e[e.kSliceIDR=5]="kSliceIDR",e[e.kSliceSEI=6]="kSliceSEI",e[e.kSliceSPS=7]="kSliceSPS",e[e.kSlicePPS=8]="kSlicePPS",e[e.kSliceAUD=9]="kSliceAUD",e[e.kEndOfSequence=10]="kEndOfSequence",e[e.kEndOfStream=11]="kEndOfStream",e[e.kFiller=12]="kFiller",e[e.kSPSExt=13]="kSPSExt",e[e.kReserved0=14]="kReserved0"}(L||(L={}));var B,I,P=function(){},O=function(e){var t=e.data.byteLength;this.type=e.type,this.data=new Uint8Array(4+t),new DataView(this.data.buffer).setUint32(0,t),this.data.set(e.data,4)},M=function(){function e(e){this.TAG="H264AnnexBParser",this.current_startcode_offset_=0,this.eof_flag_=!1,this.data_=e,this.current_startcode_offset_=this.findNextStartCodeOffset(0),this.eof_flag_&&a.a.e(this.TAG,"Could not find H264 startcode until payload end!")}return e.prototype.findNextStartCodeOffset=function(e){for(var t=e,i=this.data_;;){if(t+3>=i.byteLength)return this.eof_flag_=!0,i.byteLength;var n=i[t+0]<<24|i[t+1]<<16|i[t+2]<<8|i[t+3],r=i[t+0]<<16|i[t+1]<<8|i[t+2];if(1===n||1===r)return t;t++}},e.prototype.readNextNaluPayload=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_startcode_offset_,n=31&e[i+=1===(e[i]<<24|e[i+1]<<16|e[i+2]<<8|e[i+3])?4:3],r=(128&e[i])>>>7,a=this.findNextStartCodeOffset(i);if(this.current_startcode_offset_=a,!(n>=L.kReserved0)&&0===r){var s=e.subarray(i,a);(t=new P).type=n,t.data=s}}return t},e}(),x=function(){function e(e,t,i){var n=8+e.byteLength+1+2+t.byteLength,r=!1;66!==e[3]&&77!==e[3]&&88!==e[3]&&(r=!0,n+=4);var a=this.data=new Uint8Array(n);a[0]=1,a[1]=e[1],a[2]=e[2],a[3]=e[3],a[4]=255,a[5]=225;var s=e.byteLength;a[6]=s>>>8,a[7]=255&s;var o=8;a.set(e,8),a[o+=s]=1;var d=t.byteLength;a[o+1]=d>>>8,a[o+2]=255&d,a.set(t,o+3),o+=3+d,r&&(a[o]=252|i.chroma_format_idc,a[o+1]=248|i.bit_depth_luma-8,a[o+2]=248|i.bit_depth_chroma-8,a[o+3]=0,o+=4)}return e.prototype.getData=function(){return this.data},e}();!function(e){e[e.kNull=0]="kNull",e[e.kAACMain=1]="kAACMain",e[e.kAAC_LC=2]="kAAC_LC",e[e.kAAC_SSR=3]="kAAC_SSR",e[e.kAAC_LTP=4]="kAAC_LTP",e[e.kAAC_SBR=5]="kAAC_SBR",e[e.kAAC_Scalable=6]="kAAC_Scalable",e[e.kLayer1=32]="kLayer1",e[e.kLayer2=33]="kLayer2",e[e.kLayer3=34]="kLayer3"}(B||(B={})),function(e){e[e.k96000Hz=0]="k96000Hz",e[e.k88200Hz=1]="k88200Hz",e[e.k64000Hz=2]="k64000Hz",e[e.k48000Hz=3]="k48000Hz",e[e.k44100Hz=4]="k44100Hz",e[e.k32000Hz=5]="k32000Hz",e[e.k24000Hz=6]="k24000Hz",e[e.k22050Hz=7]="k22050Hz",e[e.k16000Hz=8]="k16000Hz",e[e.k12000Hz=9]="k12000Hz",e[e.k11025Hz=10]="k11025Hz",e[e.k8000Hz=11]="k8000Hz",e[e.k7350Hz=12]="k7350Hz"}(I||(I={}));var U,N=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],G=function(){},V=function(){function e(e){this.TAG="AACADTSParser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&a.a.e(this.TAG,"Could not found ADTS syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,i=this.data_;;){if(t+7>=i.byteLength)return this.eof_flag_=!0,i.byteLength;if(4095===(i[t+0]<<8|i[t+1])>>>4)return t;t++}},e.prototype.readNextAACFrame=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_syncword_offset_,n=(8&e[i+1])>>>3,r=(6&e[i+1])>>>1,a=1&e[i+1],s=(192&e[i+2])>>>6,o=(60&e[i+2])>>>2,d=(1&e[i+2])<<2|(192&e[i+3])>>>6,h=(3&e[i+3])<<11|e[i+4]<<3|(224&e[i+5])>>>5;e[i+6];if(i+h>this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var _=1===a?7:9,u=h-_;i+=_;var l=this.findNextSyncwordOffset(i+u);if(this.current_syncword_offset_=l,(0===n||1===n)&&0===r){var c=e.subarray(i,i+u);(t=new G).audio_object_type=s+1,t.sampling_freq_index=o,t.sampling_frequency=N[o],t.channel_config=d,t.data=c}}return t},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),F=function(e){var t=null,i=e.audio_object_type,n=e.audio_object_type,r=e.sampling_freq_index,a=e.channel_config,s=0,o=navigator.userAgent.toLowerCase();-1!==o.indexOf("firefox")?r>=6?(n=5,t=new Array(4),s=r-3):(n=2,t=new Array(2),s=r):-1!==o.indexOf("android")?(n=2,t=new Array(2),s=r):(n=5,s=r,t=new Array(4),r>=6?s=r-3:1===a&&(n=2,t=new Array(2),s=r)),t[0]=n<<3,t[0]|=(15&r)>>>1,t[1]=(15&r)<<7,t[1]|=(15&a)<<3,5===n&&(t[1]|=(15&s)>>>1,t[2]=(1&s)<<7,t[2]|=8,t[3]=0),this.config=t,this.sampling_rate=N[r],this.channel_count=a,this.codec_mimetype="mp4a.40."+n,this.original_codec_mimetype="mp4a.40."+i},j=function(){},z=function(){};!function(e){e[e.kSpliceNull=0]="kSpliceNull",e[e.kSpliceSchedule=4]="kSpliceSchedule",e[e.kSpliceInsert=5]="kSpliceInsert",e[e.kTimeSignal=6]="kTimeSignal",e[e.kBandwidthReservation=7]="kBandwidthReservation",e[e.kPrivateCommand=255]="kPrivateCommand"}(U||(U={}));var H,q=function(e){var t=e.readBool();return t?(e.readBits(6),{time_specified_flag:t,pts_time:4*e.readBits(31)+e.readBits(2)}):(e.readBits(7),{time_specified_flag:t})},K=function(e){var t=e.readBool();return e.readBits(6),{auto_return:t,duration:4*e.readBits(31)+e.readBits(2)}},W=function(e,t){var i=t.readBits(8);return e?{component_tag:i}:{component_tag:i,splice_time:q(t)}},X=function(e){return{component_tag:e.readBits(8),utc_splice_time:e.readBits(32)}},Y=function(e){var t=e.readBits(32),i=e.readBool();e.readBits(7);var n={splice_event_id:t,splice_event_cancel_indicator:i};if(i)return n;if(n.out_of_network_indicator=e.readBool(),n.program_splice_flag=e.readBool(),n.duration_flag=e.readBool(),e.readBits(5),n.program_splice_flag)n.utc_splice_time=e.readBits(32);else{n.component_count=e.readBits(8),n.components=[];for(var r=0;r=i.byteLength)return this.eof_flag_=!0,i.byteLength;var n=i[t+0]<<24|i[t+1]<<16|i[t+2]<<8|i[t+3],r=i[t+0]<<16|i[t+1]<<8|i[t+2];if(1===n||1===r)return t;t++}},e.prototype.readNextNaluPayload=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_startcode_offset_,n=e[i+=1===(e[i]<<24|e[i+1]<<16|e[i+2]<<8|e[i+3])?4:3]>>1&63,r=(128&e[i])>>>7,a=this.findNextStartCodeOffset(i);if(this.current_startcode_offset_=a,0===r){var s=e.subarray(i,a);(t=new ae).type=n,t.data=s}}return t},e}(),de=function(){function e(e,t,i,n){var r=23+(5+e.byteLength)+(5+t.byteLength)+(5+i.byteLength),a=this.data=new Uint8Array(r);a[0]=1,a[1]=(3&n.general_profile_space)<<6|(n.general_tier_flag?1:0)<<5|31&n.general_profile_idc,a[2]=n.general_profile_compatibility_flags_1,a[3]=n.general_profile_compatibility_flags_2,a[4]=n.general_profile_compatibility_flags_3,a[5]=n.general_profile_compatibility_flags_4,a[6]=n.general_constraint_indicator_flags_1,a[7]=n.general_constraint_indicator_flags_2,a[8]=n.general_constraint_indicator_flags_3,a[9]=n.general_constraint_indicator_flags_4,a[10]=n.general_constraint_indicator_flags_5,a[11]=n.general_constraint_indicator_flags_6,a[12]=60,a[13]=240|(3840&n.min_spatial_segmentation_idc)>>8,a[14]=255&n.min_spatial_segmentation_idc,a[15]=252|3&n.parallelismType,a[16]=252|3&n.chroma_format_idc,a[17]=248|7&n.bit_depth_luma_minus8,a[18]=248|7&n.bit_depth_chroma_minus8,a[19]=0,a[20]=0,a[21]=(3&n.constant_frame_rate)<<6|(7&n.num_temporal_layers)<<3|(n.temporal_id_nested?1:0)<<2|3,a[22]=3,a[23]=128|H.kSliceVPS,a[24]=0,a[25]=1,a[26]=(65280&e.byteLength)>>8,a[27]=(255&e.byteLength)>>0,a.set(e,28),a[23+(5+e.byteLength)+0]=128|H.kSliceSPS,a[23+(5+e.byteLength)+1]=0,a[23+(5+e.byteLength)+2]=1,a[23+(5+e.byteLength)+3]=(65280&t.byteLength)>>8,a[23+(5+e.byteLength)+4]=(255&t.byteLength)>>0,a.set(t,23+(5+e.byteLength)+5),a[23+(5+e.byteLength+5+t.byteLength)+0]=128|H.kSlicePPS,a[23+(5+e.byteLength+5+t.byteLength)+1]=0,a[23+(5+e.byteLength+5+t.byteLength)+2]=1,a[23+(5+e.byteLength+5+t.byteLength)+3]=(65280&i.byteLength)>>8,a[23+(5+e.byteLength+5+t.byteLength)+4]=(255&i.byteLength)>>0,a.set(i,23+(5+e.byteLength+5+t.byteLength)+5)}return e.prototype.getData=function(){return this.data},e}(),he=function(){},_e=function(){},ue=(re=function(e,t){return(re=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}re(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),le=function(){return(le=Object.assign||function(e){for(var t,i=1,n=arguments.length;i=4?(a.a.v("TSDemuxer","ts_packet_size = 192, m2ts mode"),i-=4):204===n&&a.a.v("TSDemuxer","ts_packet_size = 204, RS encoded MPEG2-TS stream"),{match:!0,consumed:0,ts_packet_size:n,sync_offset:i})},t.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},t.prototype.resetMediaInfo=function(){this.media_info_=new o.a},t.prototype.parseChunks=function(e,t){if(!(this.onError&&this.onMediaInfo&&this.onTrackMetadata&&this.onDataAvailable))throw new u.a("onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var i=0;for(this.first_parse_&&(this.first_parse_=!1,i=this.sync_offset_);i+this.ts_packet_size_<=e.byteLength;){var n=t+i;192===this.ts_packet_size_&&(i+=4);var r=new Uint8Array(e,i,188),s=r[0];if(71!==s){a.a.e(this.TAG,"sync_byte = "+s+", not 0x47");break}var o=(64&r[1])>>>6,d=(r[1],(31&r[1])<<8|r[2]),h=(48&r[3])>>>4,_=15&r[3],l={},c=4;if(2==h||3==h){var f=r[4];if(5+f===188){i+=188,204===this.ts_packet_size_&&(i+=16);continue}f>0&&(l=this.parseAdaptationField(e,i+4,1+f)),c=5+f}if(1==h||3==h)if(0===d||d===this.current_pmt_pid_||null!=this.pmt_&&this.pmt_.pid_stream_type[d]===b.kSCTE35){var p=188-c;this.handleSectionSlice(e,i+c,p,{pid:d,file_position:n,payload_unit_start_indicator:o,continuity_conunter:_,random_access_indicator:l.random_access_indicator})}else if(null!=this.pmt_&&null!=this.pmt_.pid_stream_type[d]){p=188-c;var m=this.pmt_.pid_stream_type[d];d!==this.pmt_.common_pids.h264&&d!==this.pmt_.common_pids.h265&&d!==this.pmt_.common_pids.adts_aac&&d!==this.pmt_.common_pids.mp3&&!0!==this.pmt_.pes_private_data_pids[d]&&!0!==this.pmt_.timed_id3_pids[d]||this.handlePESSlice(e,i+c,p,{pid:d,stream_type:m,file_position:n,payload_unit_start_indicator:o,continuity_conunter:_,random_access_indicator:l.random_access_indicator})}i+=188,204===this.ts_packet_size_&&(i+=16)}return this.dispatchAudioVideoMediaSegment(),i},t.prototype.parseAdaptationField=function(e,t,i){var n=new Uint8Array(e,t,i),r=n[0];return r>0?r>183?(a.a.w(this.TAG,"Illegal adaptation_field_length: "+r),{}):{discontinuity_indicator:(128&n[1])>>>7,random_access_indicator:(64&n[1])>>>6,elementary_stream_priority_indicator:(32&n[1])>>>5}:{}},t.prototype.handleSectionSlice=function(e,t,i,n){var r=new Uint8Array(e,t,i),a=this.section_slice_queues_[n.pid];if(n.payload_unit_start_indicator){var s=r[0];if(null!=a&&0!==a.total_length){var o=new Uint8Array(e,t+1,Math.min(i,s));a.slices.push(o),a.total_length+=o.byteLength,a.total_length===a.expected_length?this.emitSectionSlices(a,n):this.clearSlices(a,n)}for(var d=1+s;d=a.expected_length&&this.clearSlices(a,n),d+=o.byteLength}}else if(null!=a&&0!==a.total_length){o=new Uint8Array(e,t,Math.min(i,a.expected_length-a.total_length));a.slices.push(o),a.total_length+=o.byteLength,a.total_length===a.expected_length?this.emitSectionSlices(a,n):a.total_length>=a.expected_length&&this.clearSlices(a,n)}},t.prototype.handlePESSlice=function(e,t,i,n){var r=new Uint8Array(e,t,i),s=r[0]<<16|r[1]<<8|r[2],o=(r[3],r[4]<<8|r[5]);if(n.payload_unit_start_indicator){if(1!==s)return void a.a.e(this.TAG,"handlePESSlice: packet_start_code_prefix should be 1 but with value "+s);var d=this.pes_slice_queues_[n.pid];d&&(0===d.expected_length||d.expected_length===d.total_length?this.emitPESSlices(d,n):this.clearSlices(d,n)),this.pes_slice_queues_[n.pid]=new C,this.pes_slice_queues_[n.pid].file_position=n.file_position,this.pes_slice_queues_[n.pid].random_access_indicator=n.random_access_indicator}if(null!=this.pes_slice_queues_[n.pid]){var h=this.pes_slice_queues_[n.pid];h.slices.push(r),n.payload_unit_start_indicator&&(h.expected_length=0===o?0:o+6),h.total_length+=r.byteLength,h.expected_length>0&&h.expected_length===h.total_length?this.emitPESSlices(h,n):h.expected_length>0&&h.expected_length>>6,o=t[8],d=void 0,h=void 0;2!==s&&3!==s||(d=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2,h=3===s?536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2:d);var _=9+o,u=void 0;if(0!==r){if(r<3+o)return void a.a.v(this.TAG,"Malformed PES: PES_packet_length < 3 + PES_header_data_length");u=r-3-o}else u=t.byteLength-_;var l=t.subarray(_,_+u);switch(e.stream_type){case b.kMPEG1Audio:case b.kMPEG2Audio:this.parseMP3Payload(l,d);break;case b.kPESPrivateData:this.pmt_.smpte2038_pids[e.pid]?this.parseSMPTE2038MetadataPayload(l,d,h,e.pid,n):this.parsePESPrivateDataPayload(l,d,h,e.pid,n);break;case b.kADTSAAC:this.parseAACPayload(l,d);break;case b.kID3:this.parseTimedID3MetadataPayload(l,d,h,e.pid,n);break;case b.kH264:this.parseH264Payload(l,d,h,e.file_position,e.random_access_indicator);break;case b.kH265:this.parseH265Payload(l,d,h,e.file_position,e.random_access_indicator)}}else if((188===n||191===n||240===n||241===n||255===n||242===n||248===n)&&e.stream_type===b.kPESPrivateData){_=6,u=void 0;u=0!==r?r:t.byteLength-_;l=t.subarray(_,_+u);this.parsePESPrivateDataPayload(l,void 0,void 0,e.pid,n)}}else a.a.e(this.TAG,"parsePES: packet_start_code_prefix should be 1 but with value "+i)},t.prototype.parsePAT=function(e){var t=e[0];if(0===t){var i=(15&e[1])<<8|e[2],n=(e[3],e[4],(62&e[5])>>>1),r=1&e[5],s=e[6],o=(e[7],null);if(1===r&&0===s)(o=new T).version_number=n;else if(null==(o=this.pat_))return;for(var d=i-5-4,h=-1,_=-1,u=8;u<8+d;u+=4){var l=e[u]<<8|e[u+1],c=(31&e[u+2])<<8|e[u+3];0===l?o.network_pid=c:(o.program_pmt_pid[l]=c,-1===h&&(h=l),-1===_&&(_=c))}1===r&&0===s&&(null==this.pat_&&a.a.v(this.TAG,"Parsed first PAT: "+JSON.stringify(o)),this.pat_=o,this.current_program_=h,this.current_pmt_pid_=_)}else a.a.e(this.TAG,"parsePAT: table_id "+t+" is not corresponded to PAT!")},t.prototype.parsePMT=function(e){var t=e[0];if(2===t){var i=(15&e[1])<<8|e[2],n=e[3]<<8|e[4],r=(62&e[5])>>>1,s=1&e[5],o=e[6],d=(e[7],null);if(1===s&&0===o)(d=new w).program_number=n,d.version_number=r,this.program_pmt_map_[n]=d;else if(null==(d=this.program_pmt_map_[n]))return;e[8],e[9];for(var h=(15&e[10])<<8|e[11],_=12+h,u=i-9-h-4,l=_;l<_+u;){var c=e[l],f=(31&e[l+1])<<8|e[l+2],p=(15&e[l+3])<<8|e[l+4];if(d.pid_stream_type[f]=c,c!==b.kH264||d.common_pids.h264||d.common_pids.h265)if(c!==b.kH265||d.common_pids.h264||d.common_pids.h265)if(c!==b.kADTSAAC||d.common_pids.adts_aac)if(c!==b.kMPEG1Audio&&c!==b.kMPEG2Audio||d.common_pids.mp3)if(c===b.kPESPrivateData){if(d.pes_private_data_pids[f]=!0,p>0){for(var m=l+5;m1&&(a.a.w(this.TAG,"AAC: Detected pts overlapped, expected: "+s+"ms, PES pts: "+r+"ms"),r=s)}}for(var o,d=new V(e),h=null,_=r;null!=(h=d.readNextAACFrame());){n=1024/h.sampling_frequency*1e3;var u={codec:"aac",data:h};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"aac",audio_object_type:h.audio_object_type,sampling_freq_index:h.sampling_freq_index,sampling_frequency:h.sampling_frequency,channel_config:h.channel_config},this.dispatchAudioInitSegment(u)):this.detectAudioMetadataChange(u)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(u)),o=_;var l=Math.floor(_),c={unit:h.data,length:h.data.byteLength,pts:l,dts:l};this.audio_track_.samples.push(c),this.audio_track_.length+=h.data.byteLength,_+=n}d.hasIncompleteData()&&(this.aac_last_incomplete_data_=d.getIncompleteData()),o&&(this.aac_last_sample_pts_=o)}},t.prototype.parseMP3Payload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){var i=[0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1],n=[0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1],r=[0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1],a=e[1]>>>3&3,s=(6&e[1])>>1,o=(240&e[2])>>>4,d=(12&e[2])>>>2,h=3!==(e[3]>>>6&3)?2:1,_=0,u=34;switch(a){case 0:_=[11025,12e3,8e3,0][d];break;case 2:_=[22050,24e3,16e3,0][d];break;case 3:_=[44100,48e3,32e3,0][d]}switch(s){case 1:u=34,o>>24&255,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i.set(e,4);var s=8;for(a=0;a>>24&255,t>>>16&255,t>>>8&255,255&t,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]))},e.trak=function(t){return e.box(e.types.trak,e.tkhd(t),e.mdia(t))},e.tkhd=function(t){var i=t.id,n=t.duration,r=t.presentWidth,a=t.presentHeight;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,r>>>8&255,255&r,0,0,a>>>8&255,255&a,0,0]))},e.mdia=function(t){return e.box(e.types.mdia,e.mdhd(t),e.hdlr(t),e.minf(t))},e.mdhd=function(t){var i=t.timescale,n=t.duration;return e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,n>>>24&255,n>>>16&255,n>>>8&255,255&n,85,196,0,0]))},e.hdlr=function(t){var i=null;return i="audio"===t.type?e.constants.HDLR_AUDIO:e.constants.HDLR_VIDEO,e.box(e.types.hdlr,i)},e.minf=function(t){var i=null;return i="audio"===t.type?e.box(e.types.smhd,e.constants.SMHD):e.box(e.types.vmhd,e.constants.VMHD),e.box(e.types.minf,i,e.dinf(),e.stbl(t))},e.dinf=function(){return e.box(e.types.dinf,e.box(e.types.dref,e.constants.DREF))},e.stbl=function(t){return e.box(e.types.stbl,e.stsd(t),e.box(e.types.stts,e.constants.STTS),e.box(e.types.stsc,e.constants.STSC),e.box(e.types.stsz,e.constants.STSZ),e.box(e.types.stco,e.constants.STCO))},e.stsd=function(t){return"audio"===t.type?"mp3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp3(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp4a(t)):"video"===t.type&&t.codec.startsWith("hvc1")?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.hvc1(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.avc1(t))},e.mp3=function(t){var i=t.channelCount,n=t.audioSampleRate,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types[".mp3"],r)},e.mp4a=function(t){var i=t.channelCount,n=t.audioSampleRate,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types.mp4a,r,e.esds(t))},e.esds=function(t){var i=t.config||[],n=i.length,r=new Uint8Array([0,0,0,0,3,23+n,0,1,0,4,15+n,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([n]).concat(i).concat([6,1,2]));return e.box(e.types.esds,r)},e.avc1=function(t){var i=t.avcc,n=t.codecWidth,r=t.codecHeight,a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,n>>>8&255,255&n,r>>>8&255,255&r,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.avc1,a,e.box(e.types.avcC,i))},e.hvc1=function(t){var i=t.hvcc,n=t.codecWidth,r=t.codecHeight,a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,n>>>8&255,255&n,r>>>8&255,255&r,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.hvc1,a,e.box(e.types.hvcC,i))},e.mvex=function(t){return e.box(e.types.mvex,e.trex(t))},e.trex=function(t){var i=t.id,n=new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return e.box(e.types.trex,n)},e.moof=function(t,i){return e.box(e.types.moof,e.mfhd(t.sequenceNumber),e.traf(t,i))},e.mfhd=function(t){var i=new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t]);return e.box(e.types.mfhd,i)},e.traf=function(t,i){var n=t.id,r=e.box(e.types.tfhd,new Uint8Array([0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n])),a=e.box(e.types.tfdt,new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i])),s=e.sdtp(t),o=e.trun(t,s.byteLength+16+16+8+16+8+8);return e.box(e.types.traf,r,a,o,s)},e.sdtp=function(t){for(var i=t.samples||[],n=i.length,r=new Uint8Array(4+n),a=0;a>>24&255,r>>>16&255,r>>>8&255,255&r,i>>>24&255,i>>>16&255,i>>>8&255,255&i],0);for(var o=0;o>>24&255,d>>>16&255,d>>>8&255,255&d,h>>>24&255,h>>>16&255,h>>>8&255,255&h,_.isLeading<<2|_.dependsOn,_.isDependedOn<<6|_.hasRedundancy<<4|_.isNonSync,0,0,u>>>24&255,u>>>16&255,u>>>8&255,255&u],12+16*o)}return e.box(e.types.trun,s)},e.mdat=function(t){return e.box(e.types.mdat,t)},e}();fe.init();var pe=fe,me=function(){function e(){}return e.getSilentFrame=function(e,t){if("mp4a.40.2"===e){if(1===t)return new Uint8Array([0,200,0,128,35,128]);if(2===t)return new Uint8Array([33,0,73,144,2,25,0,35,128]);if(3===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,142]);if(4===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,128,44,128,8,2,56]);if(5===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,56]);if(6===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,0,178,0,32,8,224])}else{if(1===t)return new Uint8Array([1,64,34,128,163,78,230,128,186,8,0,0,0,28,6,241,193,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(2===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(3===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94])}return null},e}(),ge=i(7),ve=function(){function e(e){this.TAG="MP4Remuxer",this._config=e,this._isLive=!0===e.isLive,this._dtsBase=-1,this._dtsBaseInited=!1,this._audioDtsBase=1/0,this._videoDtsBase=1/0,this._audioNextDts=void 0,this._videoNextDts=void 0,this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList=new ge.c("audio"),this._videoSegmentInfoList=new ge.c("video"),this._onInitSegment=null,this._onMediaSegment=null,this._forceFirstIDR=!(!s.a.chrome||!(s.a.version.major<50||50===s.a.version.major&&s.a.version.build<2661)),this._fillSilentAfterSeek=s.a.msedge||s.a.msie,this._mp3UseMpegAudio=!s.a.firefox,this._fillAudioTimestampGap=this._config.fixAudioTimestampGap}return e.prototype.destroy=function(){this._dtsBase=-1,this._dtsBaseInited=!1,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList.clear(),this._audioSegmentInfoList=null,this._videoSegmentInfoList.clear(),this._videoSegmentInfoList=null,this._onInitSegment=null,this._onMediaSegment=null},e.prototype.bindDataSource=function(e){return e.onDataAvailable=this.remux.bind(this),e.onTrackMetadata=this._onTrackMetadataReceived.bind(this),this},Object.defineProperty(e.prototype,"onInitSegment",{get:function(){return this._onInitSegment},set:function(e){this._onInitSegment=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaSegment",{get:function(){return this._onMediaSegment},set:function(e){this._onMediaSegment=e},enumerable:!1,configurable:!0}),e.prototype.insertDiscontinuity=function(){this._audioNextDts=this._videoNextDts=void 0},e.prototype.seek=function(e){this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._videoSegmentInfoList.clear(),this._audioSegmentInfoList.clear()},e.prototype.remux=function(e,t){if(!this._onMediaSegment)throw new u.a("MP4Remuxer: onMediaSegment callback must be specificed!");this._dtsBaseInited||this._calculateDtsBase(e,t),t&&this._remuxVideo(t),e&&this._remuxAudio(e)},e.prototype._onTrackMetadataReceived=function(e,t){var i=null,n="mp4",r=t.codec;if("audio"===e)this._audioMeta=t,"mp3"===t.codec&&this._mp3UseMpegAudio?(n="mpeg",r="",i=new Uint8Array):i=pe.generateInitSegment(t);else{if("video"!==e)return;this._videoMeta=t,i=pe.generateInitSegment(t)}if(!this._onInitSegment)throw new u.a("MP4Remuxer: onInitSegment callback must be specified!");this._onInitSegment(e,{type:e,data:i.buffer,codec:r,container:e+"/"+n,mediaDuration:t.duration})},e.prototype._calculateDtsBase=function(e,t){this._dtsBaseInited||(e&&e.samples&&e.samples.length&&(this._audioDtsBase=e.samples[0].dts),t&&t.samples&&t.samples.length&&(this._videoDtsBase=t.samples[0].dts),this._dtsBase=Math.min(this._audioDtsBase,this._videoDtsBase),this._dtsBaseInited=!0)},e.prototype.getTimestampBase=function(){if(this._dtsBaseInited)return this._dtsBase},e.prototype.flushStashedSamples=function(){var e=this._videoStashedLastSample,t=this._audioStashedLastSample,i={type:"video",id:1,sequenceNumber:0,samples:[],length:0};null!=e&&(i.samples.push(e),i.length=e.length);var n={type:"audio",id:2,sequenceNumber:0,samples:[],length:0};null!=t&&(n.samples.push(t),n.length=t.length),this._videoStashedLastSample=null,this._audioStashedLastSample=null,this._remuxVideo(i,!0),this._remuxAudio(n,!0)},e.prototype._remuxAudio=function(e,t){if(null!=this._audioMeta){var i,n=e,r=n.samples,o=void 0,d=-1,h=this._audioMeta.refSampleDuration,_="mp3"===this._audioMeta.codec&&this._mp3UseMpegAudio,u=this._dtsBaseInited&&void 0===this._audioNextDts,l=!1;if(r&&0!==r.length&&(1!==r.length||t)){var c=0,f=null,p=0;_?(c=0,p=n.length):(c=8,p=8+n.length);var m=null;if(r.length>1&&(p-=(m=r.pop()).length),null!=this._audioStashedLastSample){var g=this._audioStashedLastSample;this._audioStashedLastSample=null,r.unshift(g),p+=g.length}null!=m&&(this._audioStashedLastSample=m);var v=r[0].dts-this._dtsBase;if(this._audioNextDts)o=v-this._audioNextDts;else if(this._audioSegmentInfoList.isEmpty())o=0,this._fillSilentAfterSeek&&!this._videoSegmentInfoList.isEmpty()&&"mp3"!==this._audioMeta.originalCodec&&(l=!0);else{var y=this._audioSegmentInfoList.getLastSampleBefore(v);if(null!=y){var E=v-(y.originalDts+y.duration);E<=3&&(E=0),o=v-(y.dts+y.duration+E)}else o=0}if(l){var S=v-o,b=this._videoSegmentInfoList.getLastSegmentBefore(v);if(null!=b&&b.beginDts=3*h&&this._fillAudioTimestampGap&&!s.a.safari){k=!0;var P,O=Math.floor(o/h);a.a.w(this.TAG,"Large audio timestamp gap detected, may cause AV sync to drift. Silent frames will be generated to avoid unsync.\noriginalDts: "+D+" ms, curRefDts: "+I+" ms, dtsCorrection: "+Math.round(o)+" ms, generate: "+O+" frames"),A=Math.floor(I),B=Math.floor(I+h)-A,null==(P=me.getSilentFrame(this._audioMeta.originalCodec,this._audioMeta.channelCount))&&(a.a.w(this.TAG,"Unable to generate silent frame for "+this._audioMeta.originalCodec+" with "+this._audioMeta.channelCount+" channels, repeat last frame"),P=w),C=[];for(var M=0;M=1?T[T.length-1].duration:Math.floor(h);this._audioNextDts=A+B}-1===d&&(d=A),T.push({dts:A,pts:A,cts:0,unit:g.unit,size:g.unit.byteLength,duration:B,originalDts:D,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0}}),k&&T.push.apply(T,C)}}if(0===T.length)return n.samples=[],void(n.length=0);_?f=new Uint8Array(p):((f=new Uint8Array(p))[0]=p>>>24&255,f[1]=p>>>16&255,f[2]=p>>>8&255,f[3]=255&p,f.set(pe.types.mdat,4));for(L=0;L1&&(u-=(l=a.pop()).length),null!=this._videoStashedLastSample){var c=this._videoStashedLastSample;this._videoStashedLastSample=null,a.unshift(c),u+=c.length}null!=l&&(this._videoStashedLastSample=l);var f=a[0].dts-this._dtsBase;if(this._videoNextDts)s=f-this._videoNextDts;else if(this._videoSegmentInfoList.isEmpty())s=0;else{var p=this._videoSegmentInfoList.getLastSampleBefore(f);if(null!=p){var m=f-(p.originalDts+p.duration);m<=3&&(m=0),s=f-(p.dts+p.duration+m)}else s=0}for(var g=new ge.b,v=[],y=0;y=1?v[v.length-1].duration:Math.floor(this._videoMeta.refSampleDuration);if(S){var L=new ge.d(b,R,T,c.dts,!0);L.fileposition=c.fileposition,g.appendSyncPoint(L)}v.push({dts:b,pts:R,cts:A,units:c.units,size:c.length,isKeyframe:S,duration:T,originalDts:E,flags:{isLeading:0,dependsOn:S?2:1,isDependedOn:S?1:0,hasRedundancy:0,isNonSync:S?0:1}})}(_=new Uint8Array(u))[0]=u>>>24&255,_[1]=u>>>16&255,_[2]=u>>>8&255,_[3]=255&u,_.set(pe.types.mdat,4);for(y=0;y0)this._demuxer.bindDataSource(this._ioctl),this._demuxer.timestampBase=this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase,n=this._demuxer.parseChunks(e,t);else{var r=null;(r=A.probe(e)).match&&(this._setupFLVDemuxerRemuxer(r),n=this._demuxer.parseChunks(e,t)),r.match||r.needMoreData||(r=ce.probe(e)).match&&(this._setupTSDemuxerRemuxer(r),n=this._demuxer.parseChunks(e,t)),r.match||r.needMoreData||(r=null,a.a.e(this.TAG,"Non MPEG-TS/FLV, Unsupported media type!"),Promise.resolve().then((function(){i._internalAbort()})),this._emitter.emit(Ee.a.DEMUX_ERROR,m.a.FORMAT_UNSUPPORTED,"Non MPEG-TS/FLV, Unsupported media type!"))}return n},e.prototype._setupFLVDemuxerRemuxer=function(e){this._demuxer=new A(e,this._config),this._remuxer||(this._remuxer=new ve(this._config));var t=this._mediaDataSource;null==t.duration||isNaN(t.duration)||(this._demuxer.overridedDuration=t.duration),"boolean"==typeof t.hasAudio&&(this._demuxer.overridedHasAudio=t.hasAudio),"boolean"==typeof t.hasVideo&&(this._demuxer.overridedHasVideo=t.hasVideo),this._demuxer.timestampBase=t.segments[this._currentSegmentIndex].timestampBase,this._demuxer.onError=this._onDemuxException.bind(this),this._demuxer.onMediaInfo=this._onMediaInfo.bind(this),this._demuxer.onMetaDataArrived=this._onMetaDataArrived.bind(this),this._demuxer.onScriptDataArrived=this._onScriptDataArrived.bind(this),this._remuxer.bindDataSource(this._demuxer.bindDataSource(this._ioctl)),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this)},e.prototype._setupTSDemuxerRemuxer=function(e){var t=this._demuxer=new ce(e,this._config);this._remuxer||(this._remuxer=new ve(this._config)),t.onError=this._onDemuxException.bind(this),t.onMediaInfo=this._onMediaInfo.bind(this),t.onMetaDataArrived=this._onMetaDataArrived.bind(this),t.onTimedID3Metadata=this._onTimedID3Metadata.bind(this),t.onSMPTE2038Metadata=this._onSMPTE2038Metadata.bind(this),t.onSCTE35Metadata=this._onSCTE35Metadata.bind(this),t.onPESPrivateDataDescriptor=this._onPESPrivateDataDescriptor.bind(this),t.onPESPrivateData=this._onPESPrivateData.bind(this),this._remuxer.bindDataSource(this._demuxer),this._demuxer.bindDataSource(this._ioctl),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this)},e.prototype._onMediaInfo=function(e){var t=this;null==this._mediaInfo&&(this._mediaInfo=Object.assign({},e),this._mediaInfo.keyframesIndex=null,this._mediaInfo.segments=[],this._mediaInfo.segmentCount=this._mediaDataSource.segments.length,Object.setPrototypeOf(this._mediaInfo,o.a.prototype));var i=Object.assign({},e);Object.setPrototypeOf(i,o.a.prototype),this._mediaInfo.segments[this._currentSegmentIndex]=i,this._reportSegmentMediaInfo(this._currentSegmentIndex),null!=this._pendingSeekTime&&Promise.resolve().then((function(){var e=t._pendingSeekTime;t._pendingSeekTime=null,t.seek(e)}))},e.prototype._onMetaDataArrived=function(e){this._emitter.emit(Ee.a.METADATA_ARRIVED,e)},e.prototype._onScriptDataArrived=function(e){this._emitter.emit(Ee.a.SCRIPTDATA_ARRIVED,e)},e.prototype._onTimedID3Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(Ee.a.TIMED_ID3_METADATA_ARRIVED,e))},e.prototype._onSMPTE2038Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),this._emitter.emit(Ee.a.SMPTE2038_METADATA_ARRIVED,e))},e.prototype._onSCTE35Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),this._emitter.emit(Ee.a.SCTE35_METADATA_ARRIVED,e))},e.prototype._onPESPrivateDataDescriptor=function(e){this._emitter.emit(Ee.a.PES_PRIVATE_DATA_DESCRIPTOR,e)},e.prototype._onPESPrivateData=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(Ee.a.PES_PRIVATE_DATA_ARRIVED,e))},e.prototype._onIOSeeked=function(){this._remuxer.insertDiscontinuity()},e.prototype._onIOComplete=function(e){var t=e+1;t0&&i[0].originalDts===n&&(n=i[0].pts),this._emitter.emit(Ee.a.RECOMMEND_SEEKPOINT,n)}},e.prototype._enableStatisticsReporter=function(){null==this._statisticsReporter&&(this._statisticsReporter=self.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval))},e.prototype._disableStatisticsReporter=function(){this._statisticsReporter&&(self.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype._reportSegmentMediaInfo=function(e){var t=this._mediaInfo.segments[e],i=Object.assign({},t);i.duration=this._mediaInfo.duration,i.segmentCount=this._mediaInfo.segmentCount,delete i.segments,delete i.keyframesIndex,this._emitter.emit(Ee.a.MEDIA_INFO,i)},e.prototype._reportStatisticsInfo=function(){var e={};e.url=this._ioctl.currentURL,e.hasRedirect=this._ioctl.hasRedirect,e.hasRedirect&&(e.redirectedURL=this._ioctl.currentRedirectedURL),e.speed=this._ioctl.currentSpeed,e.loaderType=this._ioctl.loaderType,e.currentSegmentIndex=this._currentSegmentIndex,e.totalSegmentCount=this._mediaDataSource.segments.length,this._emitter.emit(Ee.a.STATISTICS_INFO,e)},e}();t.a=Se},function(e,t,i){"use strict";var n,r=i(0),a=function(){function e(){this._firstCheckpoint=0,this._lastCheckpoint=0,this._intervalBytes=0,this._totalBytes=0,this._lastSecondBytes=0,self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now}return e.prototype.reset=function(){this._firstCheckpoint=this._lastCheckpoint=0,this._totalBytes=this._intervalBytes=0,this._lastSecondBytes=0},e.prototype.addBytes=function(e){0===this._firstCheckpoint?(this._firstCheckpoint=this._now(),this._lastCheckpoint=this._firstCheckpoint,this._intervalBytes+=e,this._totalBytes+=e):this._now()-this._lastCheckpoint<1e3?(this._intervalBytes+=e,this._totalBytes+=e):(this._lastSecondBytes=this._intervalBytes,this._intervalBytes=e,this._totalBytes+=e,this._lastCheckpoint=this._now())},Object.defineProperty(e.prototype,"currentKBps",{get:function(){this.addBytes(0);var e=(this._now()-this._lastCheckpoint)/1e3;return 0==e&&(e=1),this._intervalBytes/e/1024},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"lastSecondKBps",{get:function(){return this.addBytes(0),0!==this._lastSecondBytes?this._lastSecondBytes/1024:this._now()-this._lastCheckpoint>=500?this.currentKBps:0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"averageKBps",{get:function(){var e=(this._now()-this._firstCheckpoint)/1e3;return this._totalBytes/e/1024},enumerable:!1,configurable:!0}),e}(),s=i(2),o=i(4),d=i(3),h=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),_=function(e){function t(t,i){var n=e.call(this,"fetch-stream-loader")||this;return n.TAG="FetchStreamLoader",n._seekHandler=t,n._config=i,n._needStash=!0,n._requestAbort=!1,n._abortController=null,n._contentLength=null,n._receivedLength=0,n}return h(t,e),t.isSupported=function(){try{var e=o.a.msedge&&o.a.version.minor>=15048,t=!o.a.msedge||e;return self.fetch&&self.ReadableStream&&t}catch(e){return!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){var i=this;this._dataSource=e,this._range=t;var n=e.url;this._config.reuseRedirectedURL&&null!=e.redirectedURL&&(n=e.redirectedURL);var r=this._seekHandler.getConfig(n,t),a=new self.Headers;if("object"==typeof r.headers){var o=r.headers;for(var h in o)o.hasOwnProperty(h)&&a.append(h,o[h])}var _={method:"GET",headers:a,mode:"cors",cache:"default",referrerPolicy:"no-referrer-when-downgrade"};if("object"==typeof this._config.headers)for(var h in this._config.headers)a.append(h,this._config.headers[h]);!1===e.cors&&(_.mode="same-origin"),e.withCredentials&&(_.credentials="include"),e.referrerPolicy&&(_.referrerPolicy=e.referrerPolicy),self.AbortController&&(this._abortController=new self.AbortController,_.signal=this._abortController.signal),this._status=s.c.kConnecting,self.fetch(r.url,_).then((function(e){if(i._requestAbort)return i._status=s.c.kIdle,void e.body.cancel();if(e.ok&&e.status>=200&&e.status<=299){if(e.url!==r.url&&i._onURLRedirect){var t=i._seekHandler.removeURLParameters(e.url);i._onURLRedirect(t)}var n=e.headers.get("Content-Length");return null!=n&&(i._contentLength=parseInt(n),0!==i._contentLength&&i._onContentLengthKnown&&i._onContentLengthKnown(i._contentLength)),i._pump.call(i,e.body.getReader())}if(i._status=s.c.kError,!i._onError)throw new d.d("FetchStreamLoader: Http code invalid, "+e.status+" "+e.statusText);i._onError(s.b.HTTP_STATUS_CODE_INVALID,{code:e.status,msg:e.statusText})})).catch((function(e){if(!i._abortController||!i._abortController.signal.aborted){if(i._status=s.c.kError,!i._onError)throw e;i._onError(s.b.EXCEPTION,{code:-1,msg:e.message})}}))},t.prototype.abort=function(){if(this._requestAbort=!0,(this._status!==s.c.kBuffering||!o.a.chrome)&&this._abortController)try{this._abortController.abort()}catch(e){}},t.prototype._pump=function(e){var t=this;return e.read().then((function(i){if(i.done)if(null!==t._contentLength&&t._receivedLength299)){if(this._status=s.c.kError,!this._onError)throw new d.d("MozChunkedLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(s.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}else this._status=s.c.kBuffering}},t.prototype._onProgress=function(e){if(this._status!==s.c.kError){null===this._contentLength&&null!==e.total&&0!==e.total&&(this._contentLength=e.total,this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength));var t=e.target.response,i=this._range.from+this._receivedLength;this._receivedLength+=t.byteLength,this._onDataArrival&&this._onDataArrival(t,i,this._receivedLength)}},t.prototype._onLoadEnd=function(e){!0!==this._requestAbort?this._status!==s.c.kError&&(this._status=s.c.kComplete,this._onComplete&&this._onComplete(this._range.from,this._range.from+this._receivedLength-1)):this._requestAbort=!1},t.prototype._onXhrError=function(e){this._status=s.c.kError;var t=0,i=null;if(this._contentLength&&e.loaded=this._contentLength&&(i=this._range.from+this._contentLength-1),this._currentRequestRange={from:t,to:i},this._internalOpen(this._dataSource,this._currentRequestRange)},t.prototype._internalOpen=function(e,t){this._lastTimeLoaded=0;var i=e.url;this._config.reuseRedirectedURL&&(null!=this._currentRedirectedURL?i=this._currentRedirectedURL:null!=e.redirectedURL&&(i=e.redirectedURL));var n=this._seekHandler.getConfig(i,t);this._currentRequestURL=n.url;var r=this._xhr=new XMLHttpRequest;if(r.open("GET",n.url,!0),r.responseType="arraybuffer",r.onreadystatechange=this._onReadyStateChange.bind(this),r.onprogress=this._onProgress.bind(this),r.onload=this._onLoad.bind(this),r.onerror=this._onXhrError.bind(this),e.withCredentials&&(r.withCredentials=!0),"object"==typeof n.headers){var a=n.headers;for(var s in a)a.hasOwnProperty(s)&&r.setRequestHeader(s,a[s])}if("object"==typeof this._config.headers){a=this._config.headers;for(var s in a)a.hasOwnProperty(s)&&r.setRequestHeader(s,a[s])}r.send()},t.prototype.abort=function(){this._requestAbort=!0,this._internalAbort(),this._status=s.c.kComplete},t.prototype._internalAbort=function(){this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onload=null,this._xhr.onerror=null,this._xhr.abort(),this._xhr=null)},t.prototype._onReadyStateChange=function(e){var t=e.target;if(2===t.readyState){if(null!=t.responseURL){var i=this._seekHandler.removeURLParameters(t.responseURL);t.responseURL!==this._currentRequestURL&&i!==this._currentRedirectedURL&&(this._currentRedirectedURL=i,this._onURLRedirect&&this._onURLRedirect(i))}if(t.status>=200&&t.status<=299){if(this._waitForTotalLength)return;this._status=s.c.kBuffering}else{if(this._status=s.c.kError,!this._onError)throw new d.d("RangeLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(s.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}}},t.prototype._onProgress=function(e){if(this._status!==s.c.kError){if(null===this._contentLength){var t=!1;if(this._waitForTotalLength){this._waitForTotalLength=!1,this._totalLengthReceived=!0,t=!0;var i=e.total;this._internalAbort(),null!=i&0!==i&&(this._totalLength=i)}if(-1===this._range.to?this._contentLength=this._totalLength-this._range.from:this._contentLength=this._range.to-this._range.from+1,t)return void this._openSubRange();this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength)}var n=e.loaded-this._lastTimeLoaded;this._lastTimeLoaded=e.loaded,this._speedSampler.addBytes(n)}},t.prototype._normalizeSpeed=function(e){var t=this._chunkSizeKBList,i=t.length-1,n=0,r=0,a=i;if(e=t[n]&&e=3&&(t=this._speedSampler.currentKBps)),0!==t){var i=this._normalizeSpeed(t);this._currentSpeedNormalized!==i&&(this._currentSpeedNormalized=i,this._currentChunkSizeKB=i)}var n=e.target.response,r=this._range.from+this._receivedLength;this._receivedLength+=n.byteLength;var a=!1;null!=this._contentLength&&this._receivedLength0&&this._receivedLength0)for(var a=i.split("&"),s=0;s0;o[0]!==this._startName&&o[0]!==this._endName&&(d&&(r+="&"),r+=a[s])}return 0===r.length?t:t+"?"+r},e}(),y=function(){function e(e,t,i){this.TAG="IOController",this._config=t,this._extraData=i,this._stashInitialSize=65536,null!=t.stashInitialSize&&t.stashInitialSize>0&&(this._stashInitialSize=t.stashInitialSize),this._stashUsed=0,this._stashSize=this._stashInitialSize,this._bufferSize=3145728,this._stashBuffer=new ArrayBuffer(this._bufferSize),this._stashByteStart=0,this._enableStash=!0,!1===t.enableStashBuffer&&(this._enableStash=!1),this._loader=null,this._loaderClass=null,this._seekHandler=null,this._dataSource=e,this._isWebSocketURL=/wss?:\/\/(.+?)/.test(e.url),this._refTotalLength=e.filesize?e.filesize:null,this._totalLength=this._refTotalLength,this._fullRequestFlag=!1,this._currentRange=null,this._redirectedURL=null,this._speedNormalized=0,this._speedSampler=new a,this._speedNormalizeList=[32,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096],this._isEarlyEofReconnecting=!1,this._paused=!1,this._resumeFrom=0,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._selectSeekHandler(),this._selectLoader(),this._createLoader()}return e.prototype.destroy=function(){this._loader.isWorking()&&this._loader.abort(),this._loader.destroy(),this._loader=null,this._loaderClass=null,this._dataSource=null,this._stashBuffer=null,this._stashUsed=this._stashSize=this._bufferSize=this._stashByteStart=0,this._currentRange=null,this._speedSampler=null,this._isEarlyEofReconnecting=!1,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._extraData=null},e.prototype.isWorking=function(){return this._loader&&this._loader.isWorking()&&!this._paused},e.prototype.isPaused=function(){return this._paused},Object.defineProperty(e.prototype,"status",{get:function(){return this._loader.status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"extraData",{get:function(){return this._extraData},set:function(e){this._extraData=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onSeeked",{get:function(){return this._onSeeked},set:function(e){this._onSeeked=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRedirect",{get:function(){return this._onRedirect},set:function(e){this._onRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRecoveredEarlyEof",{get:function(){return this._onRecoveredEarlyEof},set:function(e){this._onRecoveredEarlyEof=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentURL",{get:function(){return this._dataSource.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasRedirect",{get:function(){return null!=this._redirectedURL||null!=this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentRedirectedURL",{get:function(){return this._redirectedURL||this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentSpeed",{get:function(){return this._loaderClass===f?this._loader.currentSpeed:this._speedSampler.lastSecondKBps},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"loaderType",{get:function(){return this._loader.type},enumerable:!1,configurable:!0}),e.prototype._selectSeekHandler=function(){var e=this._config;if("range"===e.seekType)this._seekHandler=new g(this._config.rangeLoadZeroStart);else if("param"===e.seekType){var t=e.seekParamStart||"bstart",i=e.seekParamEnd||"bend";this._seekHandler=new v(t,i)}else{if("custom"!==e.seekType)throw new d.b("Invalid seekType in config: "+e.seekType);if("function"!=typeof e.customSeekHandler)throw new d.b("Custom seekType specified in config but invalid customSeekHandler!");this._seekHandler=new e.customSeekHandler}},e.prototype._selectLoader=function(){if(null!=this._config.customLoader)this._loaderClass=this._config.customLoader;else if(this._isWebSocketURL)this._loaderClass=m;else if(_.isSupported())this._loaderClass=_;else if(l.isSupported())this._loaderClass=l;else{if(!f.isSupported())throw new d.d("Your browser doesn't support xhr with arraybuffer responseType!");this._loaderClass=f}},e.prototype._createLoader=function(){this._loader=new this._loaderClass(this._seekHandler,this._config),!1===this._loader.needStashBuffer&&(this._enableStash=!1),this._loader.onContentLengthKnown=this._onContentLengthKnown.bind(this),this._loader.onURLRedirect=this._onURLRedirect.bind(this),this._loader.onDataArrival=this._onLoaderChunkArrival.bind(this),this._loader.onComplete=this._onLoaderComplete.bind(this),this._loader.onError=this._onLoaderError.bind(this)},e.prototype.open=function(e){this._currentRange={from:0,to:-1},e&&(this._currentRange.from=e),this._speedSampler.reset(),e||(this._fullRequestFlag=!0),this._loader.open(this._dataSource,Object.assign({},this._currentRange))},e.prototype.abort=function(){this._loader.abort(),this._paused&&(this._paused=!1,this._resumeFrom=0)},e.prototype.pause=function(){this.isWorking()&&(this._loader.abort(),0!==this._stashUsed?(this._resumeFrom=this._stashByteStart,this._currentRange.to=this._stashByteStart-1):this._resumeFrom=this._currentRange.to+1,this._stashUsed=0,this._stashByteStart=0,this._paused=!0)},e.prototype.resume=function(){if(this._paused){this._paused=!1;var e=this._resumeFrom;this._resumeFrom=0,this._internalSeek(e,!0)}},e.prototype.seek=function(e){this._paused=!1,this._stashUsed=0,this._stashByteStart=0,this._internalSeek(e,!0)},e.prototype._internalSeek=function(e,t){this._loader.isWorking()&&this._loader.abort(),this._flushStashBuffer(t),this._loader.destroy(),this._loader=null;var i={from:e,to:-1};this._currentRange={from:i.from,to:-1},this._speedSampler.reset(),this._stashSize=this._stashInitialSize,this._createLoader(),this._loader.open(this._dataSource,i),this._onSeeked&&this._onSeeked()},e.prototype.updateUrl=function(e){if(!e||"string"!=typeof e||0===e.length)throw new d.b("Url must be a non-empty string!");this._dataSource.url=e},e.prototype._expandBuffer=function(e){for(var t=this._stashSize;t+10485760){var n=new Uint8Array(this._stashBuffer,0,this._stashUsed);new Uint8Array(i,0,t).set(n,0)}this._stashBuffer=i,this._bufferSize=t}},e.prototype._normalizeSpeed=function(e){var t=this._speedNormalizeList,i=t.length-1,n=0,r=0,a=i;if(e=t[n]&&e=512&&e<=1024?Math.floor(1.5*e):2*e)>8192&&(t=8192);var i=1024*t+1048576;this._bufferSize0){var a=this._stashBuffer.slice(0,this._stashUsed);if((h=this._dispatchChunks(a,this._stashByteStart))0){_=new Uint8Array(a,h);o.set(_,0),this._stashUsed=_.byteLength,this._stashByteStart+=h}}else this._stashUsed=0,this._stashByteStart+=h;this._stashUsed+e.byteLength>this._bufferSize&&(this._expandBuffer(this._stashUsed+e.byteLength),o=new Uint8Array(this._stashBuffer,0,this._bufferSize)),o.set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength}else{if((h=this._dispatchChunks(e,t))this._bufferSize&&(this._expandBuffer(s),o=new Uint8Array(this._stashBuffer,0,this._bufferSize)),o.set(new Uint8Array(e,h),0),this._stashUsed+=s,this._stashByteStart=t+h}}else if(0===this._stashUsed){var s;if((h=this._dispatchChunks(e,t))this._bufferSize&&this._expandBuffer(s),(o=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e,h),0),this._stashUsed+=s,this._stashByteStart=t+h}else{var o,h;if(this._stashUsed+e.byteLength>this._bufferSize&&this._expandBuffer(this._stashUsed+e.byteLength),(o=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength,(h=this._dispatchChunks(this._stashBuffer.slice(0,this._stashUsed),this._stashByteStart))0){var _=new Uint8Array(this._stashBuffer,h);o.set(_,0)}this._stashUsed-=h,this._stashByteStart+=h}}},e.prototype._flushStashBuffer=function(e){if(this._stashUsed>0){var t=this._stashBuffer.slice(0,this._stashUsed),i=this._dispatchChunks(t,this._stashByteStart),n=t.byteLength-i;if(i0){var a=new Uint8Array(this._stashBuffer,0,this._bufferSize),s=new Uint8Array(t,i);a.set(s,0),this._stashUsed=s.byteLength,this._stashByteStart+=i}return 0}r.a.w(this.TAG,n+" bytes unconsumed data remain when flush buffer, dropped")}return this._stashUsed=0,this._stashByteStart=0,n}return 0},e.prototype._onLoaderComplete=function(e,t){this._flushStashBuffer(!0),this._onComplete&&this._onComplete(this._extraData)},e.prototype._onLoaderError=function(e,t){switch(r.a.e(this.TAG,"Loader error, code = "+t.code+", msg = "+t.msg),this._flushStashBuffer(!1),this._isEarlyEofReconnecting&&(this._isEarlyEofReconnecting=!1,e=s.b.UNRECOVERABLE_EARLY_EOF),e){case s.b.EARLY_EOF:if(!this._config.isLive&&this._totalLength){var i=this._currentRange.to+1;return void(i0}),!1)}e.exports=function(e,t){t=t||{};var r={main:i.m},o=t.all?{main:Object.keys(r.main)}:function(e,t){for(var i={main:[t]},n={main:[]},r={main:{}};s(i);)for(var o=Object.keys(i),d=0;d1)for(var i=1;i0&&(n+=";codecs="+i.codec);var r=!1;if(u.a.v(this.TAG,"Received Initialization Segment, mimeType: "+n),this._lastInitSegments[i.type]=i,n!==this._mimeTypes[i.type]){if(this._mimeTypes[i.type])u.a.v(this.TAG,"Notice: "+i.type+" mimeType changed, origin: "+this._mimeTypes[i.type]+", target: "+n);else{r=!0;try{var a=this._sourceBuffers[i.type]=this._mediaSource.addSourceBuffer(n);a.addEventListener("error",this.e.onSourceBufferError),a.addEventListener("updateend",this.e.onSourceBufferUpdateEnd)}catch(e){return u.a.e(this.TAG,e.message),void this._emitter.emit(S.ERROR,{code:e.code,msg:e.message})}}this._mimeTypes[i.type]=n}t||this._pendingSegments[i.type].push(i),r||this._sourceBuffers[i.type]&&!this._sourceBuffers[i.type].updating&&this._doAppendSegments(),l.a.safari&&"audio/mpeg"===i.container&&i.mediaDuration>0&&(this._requireSetMediaDuration=!0,this._pendingMediaDuration=i.mediaDuration/1e3,this._updateMediaSourceDuration())},e.prototype.appendMediaSegment=function(e){var t=e;this._pendingSegments[t.type].push(t),this._config.autoCleanupSourceBuffer&&this._needCleanupSourceBuffer()&&this._doCleanupSourceBuffer();var i=this._sourceBuffers[t.type];!i||i.updating||this._hasPendingRemoveRanges()||this._doAppendSegments()},e.prototype.seek=function(e){for(var t in this._sourceBuffers)if(this._sourceBuffers[t]){var i=this._sourceBuffers[t];if("open"===this._mediaSource.readyState)try{i.abort()}catch(e){u.a.e(this.TAG,e.message)}this._idrList.clear();var n=this._pendingSegments[t];if(n.splice(0,n.length),"closed"!==this._mediaSource.readyState){for(var r=0;r=1&&e-n.start(0)>=this._config.autoCleanupMaxBackwardDuration)return!0}}return!1},e.prototype._doCleanupSourceBuffer=function(){var e=this._mediaElement.currentTime;for(var t in this._sourceBuffers){var i=this._sourceBuffers[t];if(i){for(var n=i.buffered,r=!1,a=0;a=this._config.autoCleanupMaxBackwardDuration){r=!0;var d=e-this._config.autoCleanupMinBackwardDuration;this._pendingRemoveRanges[t].push({start:s,end:d})}}else o0&&(isNaN(t)||i>t)&&(u.a.v(this.TAG,"Update MediaSource duration from "+t+" to "+i),this._mediaSource.duration=i),this._requireSetMediaDuration=!1,this._pendingMediaDuration=0}},e.prototype._doRemoveRanges=function(){for(var e in this._pendingRemoveRanges)if(this._sourceBuffers[e]&&!this._sourceBuffers[e].updating)for(var t=this._sourceBuffers[e],i=this._pendingRemoveRanges[e];i.length&&!t.updating;){var n=i.shift();t.remove(n.start,n.end)}},e.prototype._doAppendSegments=function(){var e=this._pendingSegments;for(var t in e)if(this._sourceBuffers[t]&&!this._sourceBuffers[t].updating&&e[t].length>0){var i=e[t].shift();if(i.timestampOffset){var n=this._sourceBuffers[t].timestampOffset,r=i.timestampOffset/1e3;Math.abs(n-r)>.1&&(u.a.v(this.TAG,"Update MPEG audio timestampOffset from "+n+" to "+r),this._sourceBuffers[t].timestampOffset=r),delete i.timestampOffset}if(!i.data||0===i.data.byteLength)continue;try{this._sourceBuffers[t].appendBuffer(i.data),this._isBufferFull=!1,"video"===t&&i.hasOwnProperty("info")&&this._idrList.appendArray(i.info.syncPoints)}catch(e){this._pendingSegments[t].unshift(i),22===e.code?(this._isBufferFull||this._emitter.emit(S.BUFFER_FULL),this._isBufferFull=!0):(u.a.e(this.TAG,e.message),this._emitter.emit(S.ERROR,{code:e.code,msg:e.message}))}}},e.prototype._onSourceOpen=function(){if(u.a.v(this.TAG,"MediaSource onSourceOpen"),this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._pendingSourceBufferInit.length>0)for(var e=this._pendingSourceBufferInit;e.length;){var t=e.shift();this.appendInitSegment(t,!0)}this._hasPendingSegments()&&this._doAppendSegments(),this._emitter.emit(S.SOURCE_OPEN)},e.prototype._onSourceEnded=function(){u.a.v(this.TAG,"MediaSource onSourceEnded")},e.prototype._onSourceClose=function(){u.a.v(this.TAG,"MediaSource onSourceClose"),this._mediaSource&&null!=this.e&&(this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._mediaSource.removeEventListener("sourceended",this.e.onSourceEnded),this._mediaSource.removeEventListener("sourceclose",this.e.onSourceClose))},e.prototype._hasPendingSegments=function(){var e=this._pendingSegments;return e.video.length>0||e.audio.length>0},e.prototype._hasPendingRemoveRanges=function(){var e=this._pendingRemoveRanges;return e.video.length>0||e.audio.length>0},e.prototype._onSourceBufferUpdateEnd=function(){this._requireSetMediaDuration?this._updateMediaSourceDuration():this._hasPendingRemoveRanges()?this._doRemoveRanges():this._hasPendingSegments()?this._doAppendSegments():this._hasPendingEos&&this.endOfStream(),this._emitter.emit(S.UPDATE_END)},e.prototype._onSourceBufferError=function(e){u.a.e(this.TAG,"SourceBuffer Error: "+e)},e}(),T=i(5),L={NETWORK_ERROR:"NetworkError",MEDIA_ERROR:"MediaError",OTHER_ERROR:"OtherError"},w={NETWORK_EXCEPTION:d.b.EXCEPTION,NETWORK_STATUS_CODE_INVALID:d.b.HTTP_STATUS_CODE_INVALID,NETWORK_TIMEOUT:d.b.CONNECTING_TIMEOUT,NETWORK_UNRECOVERABLE_EARLY_EOF:d.b.UNRECOVERABLE_EARLY_EOF,MEDIA_MSE_ERROR:"MediaMSEError",MEDIA_FORMAT_ERROR:T.a.FORMAT_ERROR,MEDIA_FORMAT_UNSUPPORTED:T.a.FORMAT_UNSUPPORTED,MEDIA_CODEC_UNSUPPORTED:T.a.CODEC_UNSUPPORTED},D=function(){function e(e,t){this.TAG="MSEPlayer",this._type="MSEPlayer",this._emitter=new _.a,this._config=s(),"object"==typeof t&&Object.assign(this._config,t);var i=e.type.toLowerCase();if("mse"!==i&&"mpegts"!==i&&"m2ts"!==i&&"flv"!==i)throw new A.b("MSEPlayer requires an mpegts/m2ts/flv MediaDataSource input!");!0===e.isLive&&(this._config.isLive=!0),this.e={onvLoadedMetadata:this._onvLoadedMetadata.bind(this),onvSeeking:this._onvSeeking.bind(this),onvCanPlay:this._onvCanPlay.bind(this),onvStalled:this._onvStalled.bind(this),onvProgress:this._onvProgress.bind(this)},self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now,this._pendingSeekTime=null,this._requestSetTime=!1,this._seekpointRecord=null,this._progressChecker=null,this._mediaDataSource=e,this._mediaElement=null,this._msectl=null,this._transmuxer=null,this._mseSourceOpened=!1,this._hasPendingLoad=!1,this._receivedCanPlay=!1,this._mediaInfo=null,this._statisticsInfo=null;var n=l.a.chrome&&(l.a.version.major<50||50===l.a.version.major&&l.a.version.build<2661);this._alwaysSeekKeyframe=!!(n||l.a.msedge||l.a.msie),this._alwaysSeekKeyframe&&(this._config.accurateSeek=!1)}return e.prototype.destroy=function(){null!=this._progressChecker&&(window.clearInterval(this._progressChecker),this._progressChecker=null),this._transmuxer&&this.unload(),this._mediaElement&&this.detachMediaElement(),this.e=null,this._mediaDataSource=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var i=this;e===c.MEDIA_INFO?null!=this._mediaInfo&&Promise.resolve().then((function(){i._emitter.emit(c.MEDIA_INFO,i.mediaInfo)})):e===c.STATISTICS_INFO&&null!=this._statisticsInfo&&Promise.resolve().then((function(){i._emitter.emit(c.STATISTICS_INFO,i.statisticsInfo)})),this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){var t=this;if(this._mediaElement=e,e.addEventListener("loadedmetadata",this.e.onvLoadedMetadata),e.addEventListener("seeking",this.e.onvSeeking),e.addEventListener("canplay",this.e.onvCanPlay),e.addEventListener("stalled",this.e.onvStalled),e.addEventListener("progress",this.e.onvProgress),this._msectl=new R(this._config),this._msectl.on(S.UPDATE_END,this._onmseUpdateEnd.bind(this)),this._msectl.on(S.BUFFER_FULL,this._onmseBufferFull.bind(this)),this._msectl.on(S.SOURCE_OPEN,(function(){t._mseSourceOpened=!0,t._hasPendingLoad&&(t._hasPendingLoad=!1,t.load())})),this._msectl.on(S.ERROR,(function(e){t._emitter.emit(c.ERROR,L.MEDIA_ERROR,w.MEDIA_MSE_ERROR,e)})),this._msectl.attachMediaElement(e),null!=this._pendingSeekTime)try{e.currentTime=this._pendingSeekTime,this._pendingSeekTime=null}catch(e){}},e.prototype.detachMediaElement=function(){this._mediaElement&&(this._msectl.detachMediaElement(),this._mediaElement.removeEventListener("loadedmetadata",this.e.onvLoadedMetadata),this._mediaElement.removeEventListener("seeking",this.e.onvSeeking),this._mediaElement.removeEventListener("canplay",this.e.onvCanPlay),this._mediaElement.removeEventListener("stalled",this.e.onvStalled),this._mediaElement.removeEventListener("progress",this.e.onvProgress),this._mediaElement=null),this._msectl&&(this._msectl.destroy(),this._msectl=null)},e.prototype.load=function(){var e=this;if(!this._mediaElement)throw new A.a("HTMLMediaElement must be attached before load()!");if(this._transmuxer)throw new A.a("MSEPlayer.load() has been called, please call unload() first!");this._hasPendingLoad||(this._config.deferLoadAfterSourceOpen&&!1===this._mseSourceOpened?this._hasPendingLoad=!0:(this._mediaElement.readyState>0&&(this._requestSetTime=!0,this._mediaElement.currentTime=0),this._transmuxer=new E(this._mediaDataSource,this._config),this._transmuxer.on(v.a.INIT_SEGMENT,(function(t,i){e._msectl.appendInitSegment(i)})),this._transmuxer.on(v.a.MEDIA_SEGMENT,(function(t,i){if(e._msectl.appendMediaSegment(i),e._config.lazyLoad&&!e._config.isLive){var n=e._mediaElement.currentTime;i.info.endDts>=1e3*(n+e._config.lazyLoadMaxDuration)&&null==e._progressChecker&&(u.a.v(e.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),e._suspendTransmuxer())}})),this._transmuxer.on(v.a.LOADING_COMPLETE,(function(){e._msectl.endOfStream(),e._emitter.emit(c.LOADING_COMPLETE)})),this._transmuxer.on(v.a.RECOVERED_EARLY_EOF,(function(){e._emitter.emit(c.RECOVERED_EARLY_EOF)})),this._transmuxer.on(v.a.IO_ERROR,(function(t,i){e._emitter.emit(c.ERROR,L.NETWORK_ERROR,t,i)})),this._transmuxer.on(v.a.DEMUX_ERROR,(function(t,i){e._emitter.emit(c.ERROR,L.MEDIA_ERROR,t,{code:-1,msg:i})})),this._transmuxer.on(v.a.MEDIA_INFO,(function(t){e._mediaInfo=t,e._emitter.emit(c.MEDIA_INFO,Object.assign({},t))})),this._transmuxer.on(v.a.METADATA_ARRIVED,(function(t){e._emitter.emit(c.METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SCRIPTDATA_ARRIVED,(function(t){e._emitter.emit(c.SCRIPTDATA_ARRIVED,t)})),this._transmuxer.on(v.a.TIMED_ID3_METADATA_ARRIVED,(function(t){e._emitter.emit(c.TIMED_ID3_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SMPTE2038_METADATA_ARRIVED,(function(t){e._emitter.emit(c.SMPTE2038_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SCTE35_METADATA_ARRIVED,(function(t){e._emitter.emit(c.SCTE35_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.PES_PRIVATE_DATA_DESCRIPTOR,(function(t){e._emitter.emit(c.PES_PRIVATE_DATA_DESCRIPTOR,t)})),this._transmuxer.on(v.a.PES_PRIVATE_DATA_ARRIVED,(function(t){e._emitter.emit(c.PES_PRIVATE_DATA_ARRIVED,t)})),this._transmuxer.on(v.a.STATISTICS_INFO,(function(t){e._statisticsInfo=e._fillStatisticsInfo(t),e._emitter.emit(c.STATISTICS_INFO,Object.assign({},e._statisticsInfo))})),this._transmuxer.on(v.a.RECOMMEND_SEEKPOINT,(function(t){e._mediaElement&&!e._config.accurateSeek&&(e._requestSetTime=!0,e._mediaElement.currentTime=t/1e3)})),this._transmuxer.open()))},e.prototype.unload=function(){this._mediaElement&&this._mediaElement.pause(),this._msectl&&this._msectl.seek(0),this._transmuxer&&(this._transmuxer.close(),this._transmuxer.destroy(),this._transmuxer=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._internalSeek(e):this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){return Object.assign({},this._mediaInfo)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){return null==this._statisticsInfo&&(this._statisticsInfo={}),this._statisticsInfo=this._fillStatisticsInfo(this._statisticsInfo),Object.assign({},this._statisticsInfo)},enumerable:!1,configurable:!0}),e.prototype._fillStatisticsInfo=function(e){if(e.playerType=this._type,!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var r=this._mediaElement.getVideoPlaybackQuality();i=r.totalVideoFrames,n=r.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},e.prototype._onmseUpdateEnd=function(){var e=this._mediaElement.buffered,t=this._mediaElement.currentTime;if(this._config.isLive&&this._config.liveBufferLatencyChasing&&e.length>0&&!this._mediaElement.paused){var i=e.end(e.length-1);if(i>this._config.liveBufferLatencyMaxLatency&&i-t>this._config.liveBufferLatencyMaxLatency){var n=i-this._config.liveBufferLatencyMinRemain;this.currentTime=n}}if(this._config.lazyLoad&&!this._config.isLive){for(var r=0,a=0;a=t+this._config.lazyLoadMaxDuration&&null==this._progressChecker&&(u.a.v(this.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),this._suspendTransmuxer())}},e.prototype._onmseBufferFull=function(){u.a.v(this.TAG,"MSE SourceBuffer is full, suspend transmuxing task"),null==this._progressChecker&&this._suspendTransmuxer()},e.prototype._suspendTransmuxer=function(){this._transmuxer&&(this._transmuxer.pause(),null==this._progressChecker&&(this._progressChecker=window.setInterval(this._checkProgressAndResume.bind(this),1e3)))},e.prototype._checkProgressAndResume=function(){for(var e=this._mediaElement.currentTime,t=this._mediaElement.buffered,i=!1,n=0;n=r&&e=a-this._config.lazyLoadRecoverDuration&&(i=!0);break}}i&&(window.clearInterval(this._progressChecker),this._progressChecker=null,i&&(u.a.v(this.TAG,"Continue loading from paused position"),this._transmuxer.resume()))},e.prototype._isTimepointBuffered=function(e){for(var t=this._mediaElement.buffered,i=0;i=n&&e0){var r=this._mediaElement.buffered.start(0);(r<1&&e0&&t.currentTime0){var n=i.start(0);if(n<1&&t0&&(this._mediaElement.currentTime=0),this._mediaElement.preload="auto",this._mediaElement.load(),this._statisticsReporter=window.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval)},e.prototype.unload=function(){this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src")),null!=this._statisticsReporter&&(window.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._mediaElement.currentTime=e:this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){var e={mimeType:(this._mediaElement instanceof HTMLAudioElement?"audio/":"video/")+this._mediaDataSource.type};return this._mediaElement&&(e.duration=Math.floor(1e3*this._mediaElement.duration),this._mediaElement instanceof HTMLVideoElement&&(e.width=this._mediaElement.videoWidth,e.height=this._mediaElement.videoHeight)),e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){var e={playerType:this._type,url:this._mediaDataSource.url};if(!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var r=this._mediaElement.getVideoPlaybackQuality();i=r.totalVideoFrames,n=r.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},enumerable:!1,configurable:!0}),e.prototype._onvLoadedMetadata=function(e){null!=this._pendingSeekTime&&(this._mediaElement.currentTime=this._pendingSeekTime,this._pendingSeekTime=null),this._emitter.emit(c.MEDIA_INFO,this.mediaInfo)},e.prototype._reportStatisticsInfo=function(){this._emitter.emit(c.STATISTICS_INFO,this.statisticsInfo)},e}();n.a.install();var C={createPlayer:function(e,t){var i=e;if(null==i||"object"!=typeof i)throw new A.b("MediaDataSource must be an javascript object!");if(!i.hasOwnProperty("type"))throw new A.b("MediaDataSource must has type field to indicate video file type!");switch(i.type){case"mse":case"mpegts":case"m2ts":case"flv":return new D(i,t);default:return new k(i,t)}},isSupported:function(){return o.supportMSEH264Playback()},getFeatureList:function(){return o.getFeatureList()}};C.BaseLoader=d.a,C.LoaderStatus=d.c,C.LoaderErrors=d.b,C.Events=c,C.ErrorTypes=L,C.ErrorDetails=w,C.MSEPlayer=D,C.NativePlayer=k,C.LoggingControl=m.a,Object.defineProperty(C,"version",{enumerable:!0,get:function(){return"1.7.2"}});t.default=C}])})); -//# sourceMappingURL=mpegts.js.map \ No newline at end of file diff --git a/trunk/research/players/js/mpegts-1.7.3.min.js b/trunk/research/players/js/mpegts-1.7.3.min.js new file mode 100644 index 0000000000..da8af61152 --- /dev/null +++ b/trunk/research/players/js/mpegts-1.7.3.min.js @@ -0,0 +1,9 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.mpegts=t():e.mpegts=t()}(window,(function(){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,i),a.l=!0,a.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)i.d(n,a,function(t){return e[t]}.bind(null,a));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=14)}([function(e,t,i){"use strict";var n=i(6),a=i.n(n),r=function(){function e(){}return e.e=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","error",n),e.ENABLE_ERROR&&(console.error?console.error(n):console.warn?console.warn(n):console.log(n))},e.i=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","info",n),e.ENABLE_INFO&&(console.info?console.info(n):console.log(n))},e.w=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","warn",n),e.ENABLE_WARN&&(console.warn?console.warn(n):console.log(n))},e.d=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","debug",n),e.ENABLE_DEBUG&&(console.debug?console.debug(n):console.log(n))},e.v=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","verbose",n),e.ENABLE_VERBOSE&&console.log(n)},e}();r.GLOBAL_TAG="mpegts.js",r.FORCE_GLOBAL_TAG=!1,r.ENABLE_ERROR=!0,r.ENABLE_INFO=!0,r.ENABLE_WARN=!0,r.ENABLE_DEBUG=!0,r.ENABLE_VERBOSE=!0,r.ENABLE_CALLBACK=!1,r.emitter=new a.a,t.a=r},function(e,t,i){"use strict";t.a={IO_ERROR:"io_error",DEMUX_ERROR:"demux_error",INIT_SEGMENT:"init_segment",MEDIA_SEGMENT:"media_segment",LOADING_COMPLETE:"loading_complete",RECOVERED_EARLY_EOF:"recovered_early_eof",MEDIA_INFO:"media_info",METADATA_ARRIVED:"metadata_arrived",SCRIPTDATA_ARRIVED:"scriptdata_arrived",TIMED_ID3_METADATA_ARRIVED:"timed_id3_metadata_arrived",SMPTE2038_METADATA_ARRIVED:"smpte2038_metadata_arrived",SCTE35_METADATA_ARRIVED:"scte35_metadata_arrived",PES_PRIVATE_DATA_DESCRIPTOR:"pes_private_data_descriptor",PES_PRIVATE_DATA_ARRIVED:"pes_private_data_arrived",STATISTICS_INFO:"statistics_info",RECOMMEND_SEEKPOINT:"recommend_seekpoint"}},function(e,t,i){"use strict";i.d(t,"c",(function(){return a})),i.d(t,"b",(function(){return r})),i.d(t,"a",(function(){return s}));var n=i(3),a={kIdle:0,kConnecting:1,kBuffering:2,kError:3,kComplete:4},r={OK:"OK",EXCEPTION:"Exception",HTTP_STATUS_CODE_INVALID:"HttpStatusCodeInvalid",CONNECTING_TIMEOUT:"ConnectingTimeout",EARLY_EOF:"EarlyEof",UNRECOVERABLE_EARLY_EOF:"UnrecoverableEarlyEof"},s=function(){function e(e){this._type=e||"undefined",this._status=a.kIdle,this._needStash=!1,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null}return e.prototype.destroy=function(){this._status=a.kIdle,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null},e.prototype.isWorking=function(){return this._status===a.kConnecting||this._status===a.kBuffering},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"status",{get:function(){return this._status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"needStashBuffer",{get:function(){return this._needStash},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onContentLengthKnown",{get:function(){return this._onContentLengthKnown},set:function(e){this._onContentLengthKnown=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onURLRedirect",{get:function(){return this._onURLRedirect},set:function(e){this._onURLRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),e.prototype.open=function(e,t){throw new n.c("Unimplemented abstract function!")},e.prototype.abort=function(){throw new n.c("Unimplemented abstract function!")},e}()},function(e,t,i){"use strict";i.d(t,"d",(function(){return r})),i.d(t,"a",(function(){return s})),i.d(t,"b",(function(){return o})),i.d(t,"c",(function(){return d}));var n,a=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),r=function(){function e(e){this._message=e}return Object.defineProperty(e.prototype,"name",{get:function(){return"RuntimeException"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return this.name+": "+this.message},e}(),s=function(e){function t(t){return e.call(this,t)||this}return a(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"IllegalStateException"},enumerable:!1,configurable:!0}),t}(r),o=function(e){function t(t){return e.call(this,t)||this}return a(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"InvalidArgumentException"},enumerable:!1,configurable:!0}),t}(r),d=function(e){function t(t){return e.call(this,t)||this}return a(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"NotImplementedException"},enumerable:!1,configurable:!0}),t}(r)},function(e,t,i){"use strict";var n={};!function(){var e=self.navigator.userAgent.toLowerCase(),t=/(edge)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(chrome)[ \/]([\w.]+)/.exec(e)||/(iemobile)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("trident")>=0&&/(rv)(?::| )([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(firefox)[ \/]([\w.]+)/.exec(e)||[],i=/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(android)/.exec(e)||/(windows)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||[],a={browser:t[5]||t[3]||t[1]||"",version:t[2]||t[4]||"0",majorVersion:t[4]||t[2]||"0",platform:i[0]||""},r={};if(a.browser){r[a.browser]=!0;var s=a.majorVersion.split(".");r.version={major:parseInt(a.majorVersion,10),string:a.version},s.length>1&&(r.version.minor=parseInt(s[1],10)),s.length>2&&(r.version.build=parseInt(s[2],10))}if(a.platform&&(r[a.platform]=!0),(r.chrome||r.opr||r.safari)&&(r.webkit=!0),r.rv||r.iemobile){r.rv&&delete r.rv;a.browser="msie",r.msie=!0}if(r.edge){delete r.edge;a.browser="msedge",r.msedge=!0}if(r.opr){a.browser="opera",r.opera=!0}if(r.safari&&r.android){a.browser="android",r.android=!0}for(var o in r.name=a.browser,r.platform=a.platform,n)n.hasOwnProperty(o)&&delete n[o];Object.assign(n,r)}(),t.a=n},function(e,t,i){"use strict";t.a={OK:"OK",FORMAT_ERROR:"FormatError",FORMAT_UNSUPPORTED:"FormatUnsupported",CODEC_UNSUPPORTED:"CodecUnsupported"}},function(e,t,i){"use strict";var n,a="object"==typeof Reflect?Reflect:null,r=a&&"function"==typeof a.apply?a.apply:function(e,t,i){return Function.prototype.apply.call(e,t,i)};n=a&&"function"==typeof a.ownKeys?a.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function o(){o.init.call(this)}e.exports=o,e.exports.once=function(e,t){return new Promise((function(i,n){function a(i){e.removeListener(t,r),n(i)}function r(){"function"==typeof e.removeListener&&e.removeListener("error",a),i([].slice.call(arguments))}g(e,t,r,{once:!0}),"error"!==t&&function(e,t,i){"function"==typeof e.on&&g(e,"error",t,i)}(e,a,{once:!0})}))},o.EventEmitter=o,o.prototype._events=void 0,o.prototype._eventsCount=0,o.prototype._maxListeners=void 0;var d=10;function _(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function h(e){return void 0===e._maxListeners?o.defaultMaxListeners:e._maxListeners}function c(e,t,i,n){var a,r,s,o;if(_(i),void 0===(r=e._events)?(r=e._events=Object.create(null),e._eventsCount=0):(void 0!==r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),s=r[t]),void 0===s)s=r[t]=i,++e._eventsCount;else if("function"==typeof s?s=r[t]=n?[i,s]:[s,i]:n?s.unshift(i):s.push(i),(a=h(e))>0&&s.length>a&&!s.warned){s.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=s.length,o=d,console&&console.warn&&console.warn(o)}return e}function u(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(e,t,i){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:i},a=u.bind(n);return a.listener=i,n.wrapFn=a,a}function f(e,t,i){var n=e._events;if(void 0===n)return[];var a=n[t];return void 0===a?[]:"function"==typeof a?i?[a.listener||a]:[a]:i?function(e){for(var t=new Array(e.length),i=0;i0&&(s=t[0]),s instanceof Error)throw s;var o=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw o.context=s,o}var d=a[e];if(void 0===d)return!1;if("function"==typeof d)r(d,this,t);else{var _=d.length,h=m(d,_);for(i=0;i<_;++i)r(h[i],this,t)}return!0},o.prototype.addListener=function(e,t){return c(this,e,t,!1)},o.prototype.on=o.prototype.addListener,o.prototype.prependListener=function(e,t){return c(this,e,t,!0)},o.prototype.once=function(e,t){return _(t),this.on(e,l(this,e,t)),this},o.prototype.prependOnceListener=function(e,t){return _(t),this.prependListener(e,l(this,e,t)),this},o.prototype.removeListener=function(e,t){var i,n,a,r,s;if(_(t),void 0===(n=this._events))return this;if(void 0===(i=n[e]))return this;if(i===t||i.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(a=-1,r=i.length-1;r>=0;r--)if(i[r]===t||i[r].listener===t){s=i[r].listener,a=r;break}if(a<0)return this;0===a?i.shift():function(e,t){for(;t+1=0;n--)this.removeListener(e,t[n]);return this},o.prototype.listeners=function(e){return f(this,e,!0)},o.prototype.rawListeners=function(e){return f(this,e,!1)},o.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},o.prototype.listenerCount=p,o.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]}},function(e,t,i){"use strict";i.d(t,"d",(function(){return n})),i.d(t,"b",(function(){return a})),i.d(t,"a",(function(){return r})),i.d(t,"c",(function(){return s}));var n=function(e,t,i,n,a){this.dts=e,this.pts=t,this.duration=i,this.originalDts=n,this.isSyncPoint=a,this.fileposition=null},a=function(){function e(){this.beginDts=0,this.endDts=0,this.beginPts=0,this.endPts=0,this.originalBeginDts=0,this.originalEndDts=0,this.syncPoints=[],this.firstSample=null,this.lastSample=null}return e.prototype.appendSyncPoint=function(e){e.isSyncPoint=!0,this.syncPoints.push(e)},e}(),r=function(){function e(){this._list=[]}return e.prototype.clear=function(){this._list=[]},e.prototype.appendArray=function(e){var t=this._list;0!==e.length&&(t.length>0&&e[0].originalDts=t[a].dts&&et[n].lastSample.originalDts&&e=t[n].lastSample.originalDts&&(n===t.length-1||n0&&(a=this._searchNearestSegmentBefore(i.originalBeginDts)+1),this._lastAppendLocation=a,this._list.splice(a,0,i)},e.prototype.getLastSegmentBefore=function(e){var t=this._searchNearestSegmentBefore(e);return t>=0?this._list[t]:null},e.prototype.getLastSampleBefore=function(e){var t=this.getLastSegmentBefore(e);return null!=t?t.lastSample:null},e.prototype.getLastSyncPointBefore=function(e){for(var t=this._searchNearestSegmentBefore(e),i=this._list[t].syncPoints;0===i.length&&t>0;)t--,i=this._list[t].syncPoints;return i.length>0?i[i.length-1]:null},e}()},function(e,t,i){"use strict";var n=function(){function e(){this.mimeType=null,this.duration=null,this.hasAudio=null,this.hasVideo=null,this.audioCodec=null,this.videoCodec=null,this.audioDataRate=null,this.videoDataRate=null,this.audioSampleRate=null,this.audioChannelCount=null,this.width=null,this.height=null,this.fps=null,this.profile=null,this.level=null,this.refFrames=null,this.chromaFormat=null,this.sarNum=null,this.sarDen=null,this.metadata=null,this.segments=null,this.segmentCount=null,this.hasKeyframesIndex=null,this.keyframesIndex=null}return e.prototype.isComplete=function(){var e=!1===this.hasAudio||!0===this.hasAudio&&null!=this.audioCodec&&null!=this.audioSampleRate&&null!=this.audioChannelCount,t=!1===this.hasVideo||!0===this.hasVideo&&null!=this.videoCodec&&null!=this.width&&null!=this.height&&null!=this.fps&&null!=this.profile&&null!=this.level&&null!=this.refFrames&&null!=this.chromaFormat&&null!=this.sarNum&&null!=this.sarDen;return null!=this.mimeType&&e&&t},e.prototype.isSeekable=function(){return!0===this.hasKeyframesIndex},e.prototype.getNearestKeyframe=function(e){if(null==this.keyframesIndex)return null;var t=this.keyframesIndex,i=this._search(t.times,e);return{index:i,milliseconds:t.times[i],fileposition:t.filepositions[i]}},e.prototype._search=function(e,t){var i=0,n=e.length-1,a=0,r=0,s=n;for(t=e[a]&&t0){var i=e.getConfig();t.emit("change",i)}},e.registerListener=function(t){e.emitter.addListener("change",t)},e.removeListener=function(t){e.emitter.removeListener("change",t)},e.addLogListener=function(t){r.a.emitter.addListener("log",t),r.a.emitter.listenerCount("log")>0&&(r.a.ENABLE_CALLBACK=!0,e._notifyChange())},e.removeLogListener=function(t){r.a.emitter.removeListener("log",t),0===r.a.emitter.listenerCount("log")&&(r.a.ENABLE_CALLBACK=!1,e._notifyChange())},e}();s.emitter=new a.a,t.a=s},function(e,t,i){"use strict";var n=i(6),a=i.n(n),r=i(0),s=i(4),o=i(8);function d(e,t,i){var n=e;if(t+i=128){t.push(String.fromCharCode(65535&r)),n+=2;continue}}else if(i[n]<240){if(d(i,n,2))if((r=(15&i[n])<<12|(63&i[n+1])<<6|63&i[n+2])>=2048&&55296!=(63488&r)){t.push(String.fromCharCode(65535&r)),n+=3;continue}}else if(i[n]<248){var r;if(d(i,n,3))if((r=(7&i[n])<<18|(63&i[n+1])<<12|(63&i[n+2])<<6|63&i[n+3])>65536&&r<1114112){r-=65536,t.push(String.fromCharCode(r>>>10|55296)),t.push(String.fromCharCode(1023&r|56320)),n+=4;continue}}t.push(String.fromCharCode(65533)),++n}return t.join("")},c=i(3),u=(_=new ArrayBuffer(2),new DataView(_).setInt16(0,256,!0),256===new Int16Array(_)[0]),l=function(){function e(){}return e.parseScriptData=function(t,i,n){var a={};try{var s=e.parseValue(t,i,n),o=e.parseValue(t,i+s.size,n-s.size);a[s.data]=o.data}catch(e){r.a.e("AMF",e.toString())}return a},e.parseObject=function(t,i,n){if(n<3)throw new c.a("Data not enough when parse ScriptDataObject");var a=e.parseString(t,i,n),r=e.parseValue(t,i+a.size,n-a.size),s=r.objectEnd;return{data:{name:a.data,value:r.data},size:a.size+r.size,objectEnd:s}},e.parseVariable=function(t,i,n){return e.parseObject(t,i,n)},e.parseString=function(e,t,i){if(i<2)throw new c.a("Data not enough when parse String");var n=new DataView(e,t,i).getUint16(0,!u);return{data:n>0?h(new Uint8Array(e,t+2,n)):"",size:2+n}},e.parseLongString=function(e,t,i){if(i<4)throw new c.a("Data not enough when parse LongString");var n=new DataView(e,t,i).getUint32(0,!u);return{data:n>0?h(new Uint8Array(e,t+4,n)):"",size:4+n}},e.parseDate=function(e,t,i){if(i<10)throw new c.a("Data size invalid when parse Date");var n=new DataView(e,t,i),a=n.getFloat64(0,!u),r=n.getInt16(8,!u);return{data:new Date(a+=60*r*1e3),size:10}},e.parseValue=function(t,i,n){if(n<1)throw new c.a("Data not enough when parse Value");var a,s=new DataView(t,i,n),o=1,d=s.getUint8(0),_=!1;try{switch(d){case 0:a=s.getFloat64(1,!u),o+=8;break;case 1:a=!!s.getUint8(1),o+=1;break;case 2:var h=e.parseString(t,i+1,n-1);a=h.data,o+=h.size;break;case 3:a={};var l=0;for(9==(16777215&s.getUint32(n-4,!u))&&(l=3);o32)throw new c.b("ExpGolomb: readBits() bits exceeded max 32bits!");if(e<=this._current_word_bits_left){var t=this._current_word>>>32-e;return this._current_word<<=e,this._current_word_bits_left-=e,t}var i=this._current_word_bits_left?this._current_word:0;i>>>=32-this._current_word_bits_left;var n=e-this._current_word_bits_left;this._fillCurrentWord();var a=Math.min(n,this._current_word_bits_left),r=this._current_word>>>32-a;return this._current_word<<=a,this._current_word_bits_left-=a,i=i<>>e))return this._current_word<<=e,this._current_word_bits_left-=e,e;return this._fillCurrentWord(),e+this._skipLeadingZero()},e.prototype.readUEG=function(){var e=this._skipLeadingZero();return this.readBits(e+1)-1},e.prototype.readSEG=function(){var e=this.readUEG();return 1&e?e+1>>>1:-1*(e>>>1)},e}(),p=function(){function e(){}return e._ebsp2rbsp=function(e){for(var t=e,i=t.byteLength,n=new Uint8Array(i),a=0,r=0;r=2&&3===t[r]&&0===t[r-1]&&0===t[r-2]||(n[a]=t[r],a++);return new Uint8Array(n.buffer,0,a)},e.parseSPS=function(t){for(var i=t.subarray(1,4),n="avc1.",a=0;a<3;a++){var r=i[a].toString(16);r.length<2&&(r="0"+r),n+=r}var s=e._ebsp2rbsp(t),o=new f(s);o.readByte();var d=o.readByte();o.readByte();var _=o.readByte();o.readUEG();var h=e.getProfileString(d),c=e.getLevelString(_),u=1,l=420,p=8,m=8;if((100===d||110===d||122===d||244===d||44===d||83===d||86===d||118===d||128===d||138===d||144===d)&&(3===(u=o.readUEG())&&o.readBits(1),u<=3&&(l=[0,420,422,444][u]),p=o.readUEG()+8,m=o.readUEG()+8,o.readBits(1),o.readBool()))for(var g=3!==u?8:12,v=0;v0&&M<16?(D=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][M-1],C=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][M-1]):255===M&&(D=o.readByte()<<8|o.readByte(),C=o.readByte()<<8|o.readByte())}if(o.readBool()&&o.readBool(),o.readBool()&&(o.readBits(4),o.readBool()&&o.readBits(24)),o.readBool()&&(o.readUEG(),o.readUEG()),o.readBool()){var x=o.readBits(32),U=o.readBits(32);I=o.readBool(),B=(O=U)/(P=2*x)}}var N=1;1===D&&1===C||(N=D/C);var G=0,V=0;0===u?(G=1,V=2-R):(G=3===u?1:2,V=(1===u?2:1)*(2-R));var F=16*(E+1),j=16*(A+1)*(2-R);F-=(T+L)*G,j-=(w+k)*V;var z=Math.ceil(F*N);return o.destroy(),o=null,{codec_mimetype:n,profile_idc:d,level_idc:_,profile_string:h,level_string:c,chroma_format_idc:u,bit_depth:p,bit_depth_luma:p,bit_depth_chroma:m,ref_frames:S,chroma_format:l,chroma_format_string:e.getChromaFormatString(l),frame_rate:{fixed:I,fps:B,fps_den:P,fps_num:O},sar_ratio:{width:D,height:C},codec_size:{width:F,height:j},present_size:{width:z,height:j}}},e._skipScalingList=function(e,t){for(var i=8,n=8,a=0;a=2&&3===t[r]&&0===t[r-1]&&0===t[r-2]||(n[a]=t[r],a++);return new Uint8Array(n.buffer,0,a)},e.parseVPS=function(t){var i=e._ebsp2rbsp(t),n=new f(i);n.readByte(),n.readByte();n.readBits(4);n.readBits(2);n.readBits(6);return{num_temporal_layers:n.readBits(3)+1,temporal_id_nested:n.readBool()}},e.parseSPS=function(t){var i=e._ebsp2rbsp(t),n=new f(i);n.readByte(),n.readByte();for(var a=0,r=0,s=0,o=0,d=(n.readBits(4),n.readBits(3)),_=(n.readBool(),n.readBits(2)),h=n.readBool(),c=n.readBits(5),u=n.readByte(),l=n.readByte(),p=n.readByte(),m=n.readByte(),g=n.readByte(),v=n.readByte(),y=n.readByte(),b=n.readByte(),S=n.readByte(),E=n.readByte(),A=n.readByte(),R=[],T=[],L=0;L0)for(L=d;L<8;L++)n.readBits(2);for(L=0;L1&&n.readSEG();for(L=0;L0&&Q<=16?(W=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][Q-1],X=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][Q-1]):255===Q&&(W=n.readBits(16),X=n.readBits(16))}if(n.readBool()&&n.readBool(),n.readBool())n.readBits(3),n.readBool(),n.readBool()&&(n.readByte(),n.readByte(),n.readByte());n.readBool()&&(n.readUEG(),n.readUEG());n.readBool(),n.readBool(),n.readBool();if(n.readBool()&&(n.readUEG(),n.readUEG(),n.readUEG(),n.readUEG()),n.readBool())if(J=n.readBits(32),Z=n.readBits(32),n.readBool())if(n.readUEG(),n.readBool()){var $=!1,ee=!1,te=!1;if($=n.readBool(),ee=n.readBool(),$||ee){(te=n.readBool())&&(n.readByte(),n.readBits(5),n.readBool(),n.readBits(5));n.readBits(4),n.readBits(4);te&&n.readBits(4),n.readBits(5),n.readBits(5),n.readBits(5)}for(L=0;L<=d;L++){var ie=n.readBool();Y=ie;var ne=!1,ae=1;ie||(ne=n.readBool());var re=!1;if(ne?n.readSEG():re=n.readBool(),re||(ae=n.readUEG()+1),$)for(V=0;V>>2!=0,s=0!=(1&t[4]),o=(n=t)[a=5]<<24|n[a+1]<<16|n[a+2]<<8|n[a+3];return o<9?i:{match:!0,consumed:o,dataOffset:o,hasAudioTrack:r,hasVideoTrack:s}},e.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},Object.defineProperty(e.prototype,"onTrackMetadata",{get:function(){return this._onTrackMetadata},set:function(e){this._onTrackMetadata=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaInfo",{get:function(){return this._onMediaInfo},set:function(e){this._onMediaInfo=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMetaDataArrived",{get:function(){return this._onMetaDataArrived},set:function(e){this._onMetaDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onScriptDataArrived",{get:function(){return this._onScriptDataArrived},set:function(e){this._onScriptDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataAvailable",{get:function(){return this._onDataAvailable},set:function(e){this._onDataAvailable=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"timestampBase",{get:function(){return this._timestampBase},set:function(e){this._timestampBase=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedDuration",{get:function(){return this._duration},set:function(e){this._durationOverrided=!0,this._duration=e,this._mediaInfo.duration=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasAudio",{set:function(e){this._hasAudioFlagOverrided=!0,this._hasAudio=e,this._mediaInfo.hasAudio=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasVideo",{set:function(e){this._hasVideoFlagOverrided=!0,this._hasVideo=e,this._mediaInfo.hasVideo=e},enumerable:!1,configurable:!0}),e.prototype.resetMediaInfo=function(){this._mediaInfo=new o.a},e.prototype._isInitialMetadataDispatched=function(){return this._hasAudio&&this._hasVideo?this._audioInitialMetadataDispatched&&this._videoInitialMetadataDispatched:this._hasAudio&&!this._hasVideo?this._audioInitialMetadataDispatched:!(this._hasAudio||!this._hasVideo)&&this._videoInitialMetadataDispatched},e.prototype.parseChunks=function(t,i){if(!(this._onError&&this._onMediaInfo&&this._onTrackMetadata&&this._onDataAvailable))throw new c.a("Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var n=0,a=this._littleEndian;if(0===i){if(!(t.byteLength>13))return 0;n=e.probe(t).dataOffset}this._firstParse&&(this._firstParse=!1,i+n!==this._dataOffset&&r.a.w(this.TAG,"First time parsing but chunk byteStart invalid!"),0!==(s=new DataView(t,n)).getUint32(0,!a)&&r.a.w(this.TAG,"PrevTagSize0 !== 0 !!!"),n+=4);for(;nt.byteLength)break;var o=s.getUint8(0),d=16777215&s.getUint32(0,!a);if(n+11+d+4>t.byteLength)break;if(8===o||9===o||18===o){var _=s.getUint8(4),h=s.getUint8(5),u=s.getUint8(6)|h<<8|_<<16|s.getUint8(7)<<24;0!==(16777215&s.getUint32(7,!a))&&r.a.w(this.TAG,"Meet tag which has StreamID != 0!");var l=n+11;switch(o){case 8:this._parseAudioData(t,l,d,u);break;case 9:this._parseVideoData(t,l,d,u,i+n);break;case 18:this._parseScriptData(t,l,d)}var f=s.getUint32(11+d,!a);f!==11+d&&r.a.w(this.TAG,"Invalid PrevTagSize "+f),n+=11+d+4}else r.a.w(this.TAG,"Unsupported tag type "+o+", skipped"),n+=11+d+4}return this._isInitialMetadataDispatched()&&this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack),n},e.prototype._parseScriptData=function(e,t,i){var n=l.parseScriptData(e,t,i);if(n.hasOwnProperty("onMetaData")){if(null==n.onMetaData||"object"!=typeof n.onMetaData)return void r.a.w(this.TAG,"Invalid onMetaData structure!");this._metadata&&r.a.w(this.TAG,"Found another onMetaData tag!"),this._metadata=n;var a=this._metadata.onMetaData;if(this._onMetaDataArrived&&this._onMetaDataArrived(Object.assign({},a)),"boolean"==typeof a.hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=a.hasAudio,this._mediaInfo.hasAudio=this._hasAudio),"boolean"==typeof a.hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=a.hasVideo,this._mediaInfo.hasVideo=this._hasVideo),"number"==typeof a.audiodatarate&&(this._mediaInfo.audioDataRate=a.audiodatarate),"number"==typeof a.videodatarate&&(this._mediaInfo.videoDataRate=a.videodatarate),"number"==typeof a.width&&(this._mediaInfo.width=a.width),"number"==typeof a.height&&(this._mediaInfo.height=a.height),"number"==typeof a.duration){if(!this._durationOverrided){var s=Math.floor(a.duration*this._timescale);this._duration=s,this._mediaInfo.duration=s}}else this._mediaInfo.duration=0;if("number"==typeof a.framerate){var o=Math.floor(1e3*a.framerate);if(o>0){var d=o/1e3;this._referenceFrameRate.fixed=!0,this._referenceFrameRate.fps=d,this._referenceFrameRate.fps_num=o,this._referenceFrameRate.fps_den=1e3,this._mediaInfo.fps=d}}if("object"==typeof a.keyframes){this._mediaInfo.hasKeyframesIndex=!0;var _=a.keyframes;this._mediaInfo.keyframesIndex=this._parseKeyframesIndex(_),a.keyframes=null}else this._mediaInfo.hasKeyframesIndex=!1;this._dispatch=!1,this._mediaInfo.metadata=a,r.a.v(this.TAG,"Parsed onMetaData"),this._mediaInfo.isComplete()&&this._onMediaInfo(this._mediaInfo)}Object.keys(n).length>0&&this._onScriptDataArrived&&this._onScriptDataArrived(Object.assign({},n))},e.prototype._parseKeyframesIndex=function(e){for(var t=[],i=[],n=1;n>>4;if(2===s||10===s){var o=0,d=(12&a)>>>2;if(d>=0&&d<=4){o=this._flvSoundRateTable[d];var _=1&a,h=this._audioMetadata,c=this._audioTrack;if(h||(!1===this._hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=!0,this._mediaInfo.hasAudio=!0),(h=this._audioMetadata={}).type="audio",h.id=c.id,h.timescale=this._timescale,h.duration=this._duration,h.audioSampleRate=o,h.channelCount=0===_?1:2),10===s){var u=this._parseAACAudioData(e,t+1,i-1);if(null==u)return;if(0===u.packetType){if(h.config){if(S(u.data.config,h.config))return;r.a.w(this.TAG,"AudioSpecificConfig has been changed, re-generate initialization segment")}var l=u.data;h.audioSampleRate=l.samplingRate,h.channelCount=l.channelCount,h.codec=l.codec,h.originalCodec=l.originalCodec,h.config=l.config,h.refSampleDuration=1024/h.audioSampleRate*h.timescale,r.a.v(this.TAG,"Parsed AudioSpecificConfig"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._audioInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("audio",h),(g=this._mediaInfo).audioCodec=h.originalCodec,g.audioSampleRate=h.audioSampleRate,g.audioChannelCount=h.channelCount,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}else if(1===u.packetType){var f=this._timestampBase+n,p={unit:u.data,length:u.data.byteLength,dts:f,pts:f};c.samples.push(p),c.length+=u.data.length}else r.a.e(this.TAG,"Flv: Unsupported AAC data type "+u.packetType)}else if(2===s){if(!h.codec){var g;if(null==(l=this._parseMP3AudioData(e,t+1,i-1,!0)))return;h.audioSampleRate=l.samplingRate,h.channelCount=l.channelCount,h.codec=l.codec,h.originalCodec=l.originalCodec,h.refSampleDuration=1152/h.audioSampleRate*h.timescale,r.a.v(this.TAG,"Parsed MPEG Audio Frame Header"),this._audioInitialMetadataDispatched=!0,this._onTrackMetadata("audio",h),(g=this._mediaInfo).audioCodec=h.codec,g.audioSampleRate=h.audioSampleRate,g.audioChannelCount=h.channelCount,g.audioDataRate=l.bitRate,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}var v=this._parseMP3AudioData(e,t+1,i-1,!1);if(null==v)return;f=this._timestampBase+n;var y={unit:v,length:v.byteLength,dts:f,pts:f};c.samples.push(y),c.length+=v.length}}else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid audio sample rate idx: "+d)}else this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported audio codec idx: "+s)}},e.prototype._parseAACAudioData=function(e,t,i){if(!(i<=1)){var n={},a=new Uint8Array(e,t,i);return n.packetType=a[0],0===a[0]?n.data=this._parseAACAudioSpecificConfig(e,t+1,i-1):n.data=a.subarray(1),n}r.a.w(this.TAG,"Flv: Invalid AAC packet, missing AACPacketType or/and Data!")},e.prototype._parseAACAudioSpecificConfig=function(e,t,i){var n,a,r=new Uint8Array(e,t,i),s=null,o=0,d=null;if(o=n=r[0]>>>3,(a=(7&r[0])<<1|r[1]>>>7)<0||a>=this._mpegSamplingRates.length)this._onError(m.a.FORMAT_ERROR,"Flv: AAC invalid sampling frequency index!");else{var _=this._mpegSamplingRates[a],h=(120&r[1])>>>3;if(!(h<0||h>=8)){5===o&&(d=(7&r[1])<<1|r[2]>>>7,(124&r[2])>>>2);var c=self.navigator.userAgent.toLowerCase();return-1!==c.indexOf("firefox")?a>=6?(o=5,s=new Array(4),d=a-3):(o=2,s=new Array(2),d=a):-1!==c.indexOf("android")?(o=2,s=new Array(2),d=a):(o=5,d=a,s=new Array(4),a>=6?d=a-3:1===h&&(o=2,s=new Array(2),d=a)),s[0]=o<<3,s[0]|=(15&a)>>>1,s[1]=(15&a)<<7,s[1]|=(15&h)<<3,5===o&&(s[1]|=(15&d)>>>1,s[2]=(1&d)<<7,s[2]|=8,s[3]=0),{config:s,samplingRate:_,channelCount:h,codec:"mp4a.40."+o,originalCodec:"mp4a.40."+n}}this._onError(m.a.FORMAT_ERROR,"Flv: AAC invalid channel configuration")}},e.prototype._parseMP3AudioData=function(e,t,i,n){if(!(i<4)){this._littleEndian;var a=new Uint8Array(e,t,i),s=null;if(n){if(255!==a[0])return;var o=a[1]>>>3&3,d=(6&a[1])>>1,_=(240&a[2])>>>4,h=(12&a[2])>>>2,c=3!==(a[3]>>>6&3)?2:1,u=0,l=0;switch(o){case 0:u=this._mpegAudioV25SampleRateTable[h];break;case 2:u=this._mpegAudioV20SampleRateTable[h];break;case 3:u=this._mpegAudioV10SampleRateTable[h]}switch(d){case 1:34,_>>4;if(0!=(128&s)){var d=15&s,_=String.fromCharCode.apply(String,new Uint8Array(e,t,i).slice(1,5));if("hvc1"!==_)return void this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported codec in video frame: "+_);this._parseEnhancedHEVCVideoPacket(e,t+5,i-5,n,a,o,d)}else{var h=15&s;if(7===h)this._parseAVCVideoPacket(e,t+1,i-1,n,a,o);else{if(12!==h)return void this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported codec in video frame: "+h);this._parseHEVCVideoPacket(e,t+1,i-1,n,a,o)}}}},e.prototype._parseAVCVideoPacket=function(e,t,i,n,a,s){if(i<4)r.a.w(this.TAG,"Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime");else{var o=this._littleEndian,d=new DataView(e,t,i),_=d.getUint8(0),h=(16777215&d.getUint32(0,!o))<<8>>8;if(0===_)this._parseAVCDecoderConfigurationRecord(e,t+4,i-4);else if(1===_)this._parseAVCVideoData(e,t+4,i-4,n,a,s,h);else if(2!==_)return void this._onError(m.a.FORMAT_ERROR,"Flv: Invalid video packet type "+_)}},e.prototype._parseHEVCVideoPacket=function(e,t,i,n,a,s){if(i<4)r.a.w(this.TAG,"Flv: Invalid HEVC packet, missing HEVCPacketType or/and CompositionTime");else{var o=this._littleEndian,d=new DataView(e,t,i),_=d.getUint8(0),h=(16777215&d.getUint32(0,!o))<<8>>8;if(0===_)this._parseHEVCDecoderConfigurationRecord(e,t+4,i-4);else if(1===_)this._parseHEVCVideoData(e,t+4,i-4,n,a,s,h);else if(2!==_)return void this._onError(m.a.FORMAT_ERROR,"Flv: Invalid video packet type "+_)}},e.prototype._parseEnhancedHEVCVideoPacket=function(e,t,i,n,a,s,o){if(i<4)r.a.w(this.TAG,"Flv: Invalid HEVC packet, missing HEVCPacketType or/and CompositionTime");else{var d=this._littleEndian,_=new DataView(e,t,i);if(0===o)this._parseHEVCDecoderConfigurationRecord(e,t,i);else if(1===o){var h=(4294967040&_.getUint32(0,!d))>>8;this._parseHEVCVideoData(e,t+3,i-3,n,a,s,h)}else if(3===o)this._parseHEVCVideoData(e,t,i,n,a,s,0);else if(2!==o)return void this._onError(m.a.FORMAT_ERROR,"Flv: Invalid video packet type "+o)}},e.prototype._parseAVCDecoderConfigurationRecord=function(e,t,i){if(i<7)r.a.w(this.TAG,"Flv: Invalid AVCDecoderConfigurationRecord, lack of data!");else{var n=this._videoMetadata,a=this._videoTrack,s=this._littleEndian,o=new DataView(e,t,i);if(n){if(void 0!==n.avcc){var d=new Uint8Array(e,t,i);if(S(d,n.avcc))return;r.a.w(this.TAG,"AVCDecoderConfigurationRecord has been changed, re-generate initialization segment")}}else!1===this._hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=!0,this._mediaInfo.hasVideo=!0),(n=this._videoMetadata={}).type="video",n.id=a.id,n.timescale=this._timescale,n.duration=this._duration;var _=o.getUint8(0),h=o.getUint8(1);o.getUint8(2),o.getUint8(3);if(1===_&&0!==h)if(this._naluLengthSize=1+(3&o.getUint8(4)),3===this._naluLengthSize||4===this._naluLengthSize){var c=31&o.getUint8(5);if(0!==c){c>1&&r.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: SPS Count = "+c);for(var u=6,l=0;l1&&r.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: PPS Count = "+w),u++;for(l=0;l=i){r.a.w(this.TAG,"Malformed Nalu near timestamp "+f+", offset = "+u+", dataSize = "+i);break}var m=_.getUint32(u,!d);if(3===l&&(m>>>=8),m>i-l)return void r.a.w(this.TAG,"Malformed Nalus near timestamp "+f+", NaluSize > DataSize!");var g=31&_.getUint8(u+l);5===g&&(p=!0);var v=new Uint8Array(e,t+u,l+m),y={type:g,data:v};h.push(y),c+=v.byteLength,u+=l+m}if(h.length){var b=this._videoTrack,S={units:h,length:c,isKeyframe:p,dts:f,cts:o,pts:f+o};p&&(S.fileposition=a),b.samples.push(S),b.length+=c}},e.prototype._parseHEVCVideoData=function(e,t,i,n,a,s,o){for(var d=this._littleEndian,_=new DataView(e,t,i),h=[],c=0,u=0,l=this._naluLengthSize,f=this._timestampBase+n,p=1===s;u=i){r.a.w(this.TAG,"Malformed Nalu near timestamp "+f+", offset = "+u+", dataSize = "+i);break}var m=_.getUint32(u,!d);if(3===l&&(m>>>=8),m>i-l)return void r.a.w(this.TAG,"Malformed Nalus near timestamp "+f+", NaluSize > DataSize!");var g=31&_.getUint8(u+l);19!==g&&20!==g||(p=!0);var v=new Uint8Array(e,t+u,l+m),y={type:g,data:v};h.push(y),c+=v.byteLength,u+=l+m}if(h.length){var b=this._videoTrack,S={units:h,length:c,isKeyframe:p,dts:f,cts:o,pts:f+o};p&&(S.fileposition=a),b.samples.push(S),b.length+=c}},e}(),R=function(){function e(){}return e.prototype.destroy=function(){this.onError=null,this.onMediaInfo=null,this.onMetaDataArrived=null,this.onTrackMetadata=null,this.onDataAvailable=null,this.onTimedID3Metadata=null,this.onSMPTE2038Metadata=null,this.onSCTE35Metadata=null,this.onPESPrivateData=null,this.onPESPrivateDataDescriptor=null},e}(),T=function(){this.program_pmt_pid={}};!function(e){e[e.kMPEG1Audio=3]="kMPEG1Audio",e[e.kMPEG2Audio=4]="kMPEG2Audio",e[e.kPESPrivateData=6]="kPESPrivateData",e[e.kADTSAAC=15]="kADTSAAC",e[e.kLOASAAC=17]="kLOASAAC",e[e.kAC3=129]="kAC3",e[e.kID3=21]="kID3",e[e.kSCTE35=134]="kSCTE35",e[e.kH264=27]="kH264",e[e.kH265=36]="kH265"}(E||(E={}));var L,w=function(){this.pid_stream_type={},this.common_pids={h264:void 0,h265:void 0,adts_aac:void 0,loas_aac:void 0,opus:void 0,ac3:void 0,mp3:void 0},this.pes_private_data_pids={},this.timed_id3_pids={},this.scte_35_pids={},this.smpte2038_pids={}},k=function(){},D=function(){},C=function(){this.slices=[],this.total_length=0,this.expected_length=0,this.file_position=0};!function(e){e[e.kUnspecified=0]="kUnspecified",e[e.kSliceNonIDR=1]="kSliceNonIDR",e[e.kSliceDPA=2]="kSliceDPA",e[e.kSliceDPB=3]="kSliceDPB",e[e.kSliceDPC=4]="kSliceDPC",e[e.kSliceIDR=5]="kSliceIDR",e[e.kSliceSEI=6]="kSliceSEI",e[e.kSliceSPS=7]="kSliceSPS",e[e.kSlicePPS=8]="kSlicePPS",e[e.kSliceAUD=9]="kSliceAUD",e[e.kEndOfSequence=10]="kEndOfSequence",e[e.kEndOfStream=11]="kEndOfStream",e[e.kFiller=12]="kFiller",e[e.kSPSExt=13]="kSPSExt",e[e.kReserved0=14]="kReserved0"}(L||(L={}));var B,I,O=function(){},P=function(e){var t=e.data.byteLength;this.type=e.type,this.data=new Uint8Array(4+t),new DataView(this.data.buffer).setUint32(0,t),this.data.set(e.data,4)},M=function(){function e(e){this.TAG="H264AnnexBParser",this.current_startcode_offset_=0,this.eof_flag_=!1,this.data_=e,this.current_startcode_offset_=this.findNextStartCodeOffset(0),this.eof_flag_&&r.a.e(this.TAG,"Could not find H264 startcode until payload end!")}return e.prototype.findNextStartCodeOffset=function(e){for(var t=e,i=this.data_;;){if(t+3>=i.byteLength)return this.eof_flag_=!0,i.byteLength;var n=i[t+0]<<24|i[t+1]<<16|i[t+2]<<8|i[t+3],a=i[t+0]<<16|i[t+1]<<8|i[t+2];if(1===n||1===a)return t;t++}},e.prototype.readNextNaluPayload=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_startcode_offset_,n=31&e[i+=1===(e[i]<<24|e[i+1]<<16|e[i+2]<<8|e[i+3])?4:3],a=(128&e[i])>>>7,r=this.findNextStartCodeOffset(i);if(this.current_startcode_offset_=r,!(n>=L.kReserved0)&&0===a){var s=e.subarray(i,r);(t=new O).type=n,t.data=s}}return t},e}(),x=function(){function e(e,t,i){var n=8+e.byteLength+1+2+t.byteLength,a=!1;66!==e[3]&&77!==e[3]&&88!==e[3]&&(a=!0,n+=4);var r=this.data=new Uint8Array(n);r[0]=1,r[1]=e[1],r[2]=e[2],r[3]=e[3],r[4]=255,r[5]=225;var s=e.byteLength;r[6]=s>>>8,r[7]=255&s;var o=8;r.set(e,8),r[o+=s]=1;var d=t.byteLength;r[o+1]=d>>>8,r[o+2]=255&d,r.set(t,o+3),o+=3+d,a&&(r[o]=252|i.chroma_format_idc,r[o+1]=248|i.bit_depth_luma-8,r[o+2]=248|i.bit_depth_chroma-8,r[o+3]=0,o+=4)}return e.prototype.getData=function(){return this.data},e}();!function(e){e[e.kNull=0]="kNull",e[e.kAACMain=1]="kAACMain",e[e.kAAC_LC=2]="kAAC_LC",e[e.kAAC_SSR=3]="kAAC_SSR",e[e.kAAC_LTP=4]="kAAC_LTP",e[e.kAAC_SBR=5]="kAAC_SBR",e[e.kAAC_Scalable=6]="kAAC_Scalable",e[e.kLayer1=32]="kLayer1",e[e.kLayer2=33]="kLayer2",e[e.kLayer3=34]="kLayer3"}(B||(B={})),function(e){e[e.k96000Hz=0]="k96000Hz",e[e.k88200Hz=1]="k88200Hz",e[e.k64000Hz=2]="k64000Hz",e[e.k48000Hz=3]="k48000Hz",e[e.k44100Hz=4]="k44100Hz",e[e.k32000Hz=5]="k32000Hz",e[e.k24000Hz=6]="k24000Hz",e[e.k22050Hz=7]="k22050Hz",e[e.k16000Hz=8]="k16000Hz",e[e.k12000Hz=9]="k12000Hz",e[e.k11025Hz=10]="k11025Hz",e[e.k8000Hz=11]="k8000Hz",e[e.k7350Hz=12]="k7350Hz"}(I||(I={}));var U,N,G=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],V=(U=function(e,t){return(U=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}U(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),F=function(){},j=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return V(t,e),t}(F),z=function(){function e(e){this.TAG="AACADTSParser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&r.a.e(this.TAG,"Could not found ADTS syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,i=this.data_;;){if(t+7>=i.byteLength)return this.eof_flag_=!0,i.byteLength;if(4095===(i[t+0]<<8|i[t+1])>>>4)return t;t++}},e.prototype.readNextAACFrame=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_syncword_offset_,n=(8&e[i+1])>>>3,a=(6&e[i+1])>>>1,r=1&e[i+1],s=(192&e[i+2])>>>6,o=(60&e[i+2])>>>2,d=(1&e[i+2])<<2|(192&e[i+3])>>>6,_=(3&e[i+3])<<11|e[i+4]<<3|(224&e[i+5])>>>5;e[i+6];if(i+_>this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var h=1===r?7:9,c=_-h;i+=h;var u=this.findNextSyncwordOffset(i+c);if(this.current_syncword_offset_=u,(0===n||1===n)&&0===a){var l=e.subarray(i,i+c);(t=new F).audio_object_type=s+1,t.sampling_freq_index=o,t.sampling_frequency=G[o],t.channel_config=d,t.data=l}}return t},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),H=function(){function e(e){this.TAG="AACLOASParser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&r.a.e(this.TAG,"Could not found LOAS syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,i=this.data_;;){if(t+1>=i.byteLength)return this.eof_flag_=!0,i.byteLength;if(695===(i[t+0]<<3|i[t+1]>>>5))return t;t++}},e.prototype.getLATMValue=function(e){for(var t=e.readBits(2),i=0,n=0;n<=t;n++)i<<=8,i|=e.readByte();return i},e.prototype.readNextAACFrame=function(e){for(var t=this.data_,i=null;null==i&&!this.eof_flag_;){var n=this.current_syncword_offset_,a=(31&t[n+1])<<8|t[n+2];if(n+3+a>=this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var s=new f(t.subarray(n+3,n+3+a)),o=null;if(s.readBool()){if(null==e){r.a.w(this.TAG,"StreamMuxConfig Missing"),this.current_syncword_offset_=this.findNextSyncwordOffset(n+3+a),s.destroy();continue}o=e}else{var d=s.readBool();if(d&&s.readBool()){r.a.e(this.TAG,"audioMuxVersionA is Not Supported"),s.destroy();break}if(d&&this.getLATMValue(s),!s.readBool()){r.a.e(this.TAG,"allStreamsSameTimeFraming zero is Not Supported"),s.destroy();break}if(0!==s.readBits(6)){r.a.e(this.TAG,"more than 2 numSubFrames Not Supported"),s.destroy();break}if(0!==s.readBits(4)){r.a.e(this.TAG,"more than 2 numProgram Not Supported"),s.destroy();break}if(0!==s.readBits(3)){r.a.e(this.TAG,"more than 2 numLayer Not Supported"),s.destroy();break}var _=d?this.getLATMValue(s):0,h=s.readBits(5);_-=5;var c=s.readBits(4);_-=4;var u=s.readBits(4);_-=4,s.readBits(3),(_-=3)>0&&s.readBits(_);var l=s.readBits(3);if(0!==l){r.a.e(this.TAG,"frameLengthType = "+l+". Only frameLengthType = 0 Supported"),s.destroy();break}s.readByte();var p=s.readBool();if(p)if(d)this.getLATMValue(s);else{for(var m=0;;){m<<=8;var g=s.readBool();if(m+=s.readByte(),!g)break}console.log(m)}s.readBool()&&s.readByte(),(o=new j).audio_object_type=h,o.sampling_freq_index=c,o.sampling_frequency=G[o.sampling_freq_index],o.channel_config=u,o.other_data_present=p}for(var v=0;;){var y=s.readByte();if(v+=y,255!==y)break}for(var b=new Uint8Array(v),S=0;S=6?(n=5,t=new Array(4),s=a-3):(n=2,t=new Array(2),s=a):-1!==o.indexOf("android")?(n=2,t=new Array(2),s=a):(n=5,s=a,t=new Array(4),a>=6?s=a-3:1===r&&(n=2,t=new Array(2),s=a)),t[0]=n<<3,t[0]|=(15&a)>>>1,t[1]=(15&a)<<7,t[1]|=(15&r)<<3,5===n&&(t[1]|=(15&s)>>>1,t[2]=(1&s)<<7,t[2]|=8,t[3]=0),this.config=t,this.sampling_rate=G[a],this.channel_count=r,this.codec_mimetype="mp4a.40."+n,this.original_codec_mimetype="mp4a.40."+i},K=function(){},W=function(){};!function(e){e[e.kSpliceNull=0]="kSpliceNull",e[e.kSpliceSchedule=4]="kSpliceSchedule",e[e.kSpliceInsert=5]="kSpliceInsert",e[e.kTimeSignal=6]="kTimeSignal",e[e.kBandwidthReservation=7]="kBandwidthReservation",e[e.kPrivateCommand=255]="kPrivateCommand"}(N||(N={}));var X,Y=function(e){var t=e.readBool();return t?(e.readBits(6),{time_specified_flag:t,pts_time:4*e.readBits(31)+e.readBits(2)}):(e.readBits(7),{time_specified_flag:t})},J=function(e){var t=e.readBool();return e.readBits(6),{auto_return:t,duration:4*e.readBits(31)+e.readBits(2)}},Z=function(e,t){var i=t.readBits(8);return e?{component_tag:i}:{component_tag:i,splice_time:Y(t)}},Q=function(e){return{component_tag:e.readBits(8),utc_splice_time:e.readBits(32)}},$=function(e){var t=e.readBits(32),i=e.readBool();e.readBits(7);var n={splice_event_id:t,splice_event_cancel_indicator:i};if(i)return n;if(n.out_of_network_indicator=e.readBool(),n.program_splice_flag=e.readBool(),n.duration_flag=e.readBool(),e.readBits(5),n.program_splice_flag)n.utc_splice_time=e.readBits(32);else{n.component_count=e.readBits(8),n.components=[];for(var a=0;a=i.byteLength)return this.eof_flag_=!0,i.byteLength;var n=i[t+0]<<24|i[t+1]<<16|i[t+2]<<8|i[t+3],a=i[t+0]<<16|i[t+1]<<8|i[t+2];if(1===n||1===a)return t;t++}},e.prototype.readNextNaluPayload=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_startcode_offset_,n=e[i+=1===(e[i]<<24|e[i+1]<<16|e[i+2]<<8|e[i+3])?4:3]>>1&63,a=(128&e[i])>>>7,r=this.findNextStartCodeOffset(i);if(this.current_startcode_offset_=r,0===a){var s=e.subarray(i,r);(t=new de).type=n,t.data=s}}return t},e}(),ce=function(){function e(e,t,i,n){var a=23+(5+e.byteLength)+(5+t.byteLength)+(5+i.byteLength),r=this.data=new Uint8Array(a);r[0]=1,r[1]=(3&n.general_profile_space)<<6|(n.general_tier_flag?1:0)<<5|31&n.general_profile_idc,r[2]=n.general_profile_compatibility_flags_1,r[3]=n.general_profile_compatibility_flags_2,r[4]=n.general_profile_compatibility_flags_3,r[5]=n.general_profile_compatibility_flags_4,r[6]=n.general_constraint_indicator_flags_1,r[7]=n.general_constraint_indicator_flags_2,r[8]=n.general_constraint_indicator_flags_3,r[9]=n.general_constraint_indicator_flags_4,r[10]=n.general_constraint_indicator_flags_5,r[11]=n.general_constraint_indicator_flags_6,r[12]=n.general_level_idc,r[13]=240|(3840&n.min_spatial_segmentation_idc)>>8,r[14]=255&n.min_spatial_segmentation_idc,r[15]=252|3&n.parallelismType,r[16]=252|3&n.chroma_format_idc,r[17]=248|7&n.bit_depth_luma_minus8,r[18]=248|7&n.bit_depth_chroma_minus8,r[19]=0,r[20]=0,r[21]=(3&n.constant_frame_rate)<<6|(7&n.num_temporal_layers)<<3|(n.temporal_id_nested?1:0)<<2|3,r[22]=3,r[23]=128|X.kSliceVPS,r[24]=0,r[25]=1,r[26]=(65280&e.byteLength)>>8,r[27]=(255&e.byteLength)>>0,r.set(e,28),r[23+(5+e.byteLength)+0]=128|X.kSliceSPS,r[23+(5+e.byteLength)+1]=0,r[23+(5+e.byteLength)+2]=1,r[23+(5+e.byteLength)+3]=(65280&t.byteLength)>>8,r[23+(5+e.byteLength)+4]=(255&t.byteLength)>>0,r.set(t,23+(5+e.byteLength)+5),r[23+(5+e.byteLength+5+t.byteLength)+0]=128|X.kSlicePPS,r[23+(5+e.byteLength+5+t.byteLength)+1]=0,r[23+(5+e.byteLength+5+t.byteLength)+2]=1,r[23+(5+e.byteLength+5+t.byteLength)+3]=(65280&i.byteLength)>>8,r[23+(5+e.byteLength+5+t.byteLength)+4]=(255&i.byteLength)>>0,r.set(i,23+(5+e.byteLength+5+t.byteLength)+5)}return e.prototype.getData=function(){return this.data},e}(),ue=function(){},le=function(){},fe=function(){},pe=[[64,64,80,80,96,96,112,112,128,128,160,160,192,192,224,224,256,256,320,320,384,384,448,448,512,512,640,640,768,768,896,896,1024,1024,1152,1152,1280,1280],[69,70,87,88,104,105,121,122,139,140,174,175,208,209,243,244,278,279,348,349,417,418,487,488,557,558,696,697,835,836,975,976,1114,1115,1253,1254,1393,1394],[96,96,120,120,144,144,168,168,192,192,240,240,288,288,336,336,384,384,480,480,576,576,672,672,768,768,960,960,1152,1152,1344,1344,1536,1536,1728,1728,1920,1920]],me=function(){function e(e){this.TAG="AC3Parser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&r.a.e(this.TAG,"Could not found AC3 syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,i=this.data_;;){if(t+7>=i.byteLength)return this.eof_flag_=!0,i.byteLength;if(2935===(i[t+0]<<8|i[t+1]<<0))return t;t++}},e.prototype.readNextAC3Frame=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_syncword_offset_,n=e[i+4]>>6,a=[48e3,44200,33e3][n],r=63&e[i+4],s=2*pe[n][r];if(i+s>this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var o=this.findNextSyncwordOffset(i+s);this.current_syncword_offset_=o;var d=e[i+5]>>3,_=7&e[i+5],h=e[i+6]>>5,c=0;0!=(1&h)&&1!==h&&(c+=2),0!=(4&h)&&(c+=2),2===h&&(c+=2);var u=(e[i+6]<<8|e[i+7]<<0)>>12-c&1,l=[2,1,2,3,3,4,4,5][h]+u;(t=new fe).sampling_frequency=a,t.channel_count=l,t.channel_mode=h,t.bit_stream_identification=d,t.low_frequency_effects_channel_on=u,t.bit_stream_mode=_,t.frame_size_code=r,t.data=e.subarray(i,i+s)}return t},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),ge=function(e){var t;t=[e.sampling_rate_code<<6|e.bit_stream_identification<<1|e.bit_stream_mode>>2,(3&e.bit_stream_mode)<<6|e.channel_mode<<3|e.low_frequency_effects_channel_on<<2|e.frame_size_code>>4,e.frame_size_code<<4&224],this.config=t,this.sampling_rate=e.sampling_frequency,this.bit_stream_identification=e.bit_stream_identification,this.bit_stream_mode=e.bit_stream_mode,this.low_frequency_effects_channel_on=e.low_frequency_effects_channel_on,this.channel_count=e.channel_count,this.channel_mode=e.channel_mode,this.codec_mimetype="ac-3",this.original_codec_mimetype="ac-3"},ve=function(){var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(t,i)};return function(t,i){function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}}(),ye=function(){return(ye=Object.assign||function(e){for(var t,i=1,n=arguments.length;i=4?(r.a.v("TSDemuxer","ts_packet_size = 192, m2ts mode"),i-=4):204===n&&r.a.v("TSDemuxer","ts_packet_size = 204, RS encoded MPEG2-TS stream"),{match:!0,consumed:0,ts_packet_size:n,sync_offset:i})},t.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},t.prototype.resetMediaInfo=function(){this.media_info_=new o.a},t.prototype.parseChunks=function(e,t){if(!(this.onError&&this.onMediaInfo&&this.onTrackMetadata&&this.onDataAvailable))throw new c.a("onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var i=0;for(this.first_parse_&&(this.first_parse_=!1,i=this.sync_offset_);i+this.ts_packet_size_<=e.byteLength;){var n=t+i;192===this.ts_packet_size_&&(i+=4);var a=new Uint8Array(e,i,188),s=a[0];if(71!==s){r.a.e(this.TAG,"sync_byte = "+s+", not 0x47");break}var o=(64&a[1])>>>6,d=(a[1],(31&a[1])<<8|a[2]),_=(48&a[3])>>>4,h=15&a[3],u={},l=4;if(2==_||3==_){var f=a[4];if(5+f===188){i+=188,204===this.ts_packet_size_&&(i+=16);continue}f>0&&(u=this.parseAdaptationField(e,i+4,1+f)),l=5+f}if(1==_||3==_)if(0===d||d===this.current_pmt_pid_||null!=this.pmt_&&this.pmt_.pid_stream_type[d]===E.kSCTE35){var p=188-l;this.handleSectionSlice(e,i+l,p,{pid:d,file_position:n,payload_unit_start_indicator:o,continuity_conunter:h,random_access_indicator:u.random_access_indicator})}else if(null!=this.pmt_&&null!=this.pmt_.pid_stream_type[d]){p=188-l;var m=this.pmt_.pid_stream_type[d];d!==this.pmt_.common_pids.h264&&d!==this.pmt_.common_pids.h265&&d!==this.pmt_.common_pids.adts_aac&&d!==this.pmt_.common_pids.loas_aac&&d!==this.pmt_.common_pids.ac3&&d!==this.pmt_.common_pids.opus&&d!==this.pmt_.common_pids.mp3&&!0!==this.pmt_.pes_private_data_pids[d]&&!0!==this.pmt_.timed_id3_pids[d]||this.handlePESSlice(e,i+l,p,{pid:d,stream_type:m,file_position:n,payload_unit_start_indicator:o,continuity_conunter:h,random_access_indicator:u.random_access_indicator})}i+=188,204===this.ts_packet_size_&&(i+=16)}return this.dispatchAudioVideoMediaSegment(),i},t.prototype.parseAdaptationField=function(e,t,i){var n=new Uint8Array(e,t,i),a=n[0];return a>0?a>183?(r.a.w(this.TAG,"Illegal adaptation_field_length: "+a),{}):{discontinuity_indicator:(128&n[1])>>>7,random_access_indicator:(64&n[1])>>>6,elementary_stream_priority_indicator:(32&n[1])>>>5}:{}},t.prototype.handleSectionSlice=function(e,t,i,n){var a=new Uint8Array(e,t,i),r=this.section_slice_queues_[n.pid];if(n.payload_unit_start_indicator){var s=a[0];if(null!=r&&0!==r.total_length){var o=new Uint8Array(e,t+1,Math.min(i,s));r.slices.push(o),r.total_length+=o.byteLength,r.total_length===r.expected_length?this.emitSectionSlices(r,n):this.clearSlices(r,n)}for(var d=1+s;d=r.expected_length&&this.clearSlices(r,n),d+=o.byteLength}}else if(null!=r&&0!==r.total_length){o=new Uint8Array(e,t,Math.min(i,r.expected_length-r.total_length));r.slices.push(o),r.total_length+=o.byteLength,r.total_length===r.expected_length?this.emitSectionSlices(r,n):r.total_length>=r.expected_length&&this.clearSlices(r,n)}},t.prototype.handlePESSlice=function(e,t,i,n){var a=new Uint8Array(e,t,i),s=a[0]<<16|a[1]<<8|a[2],o=(a[3],a[4]<<8|a[5]);if(n.payload_unit_start_indicator){if(1!==s)return void r.a.e(this.TAG,"handlePESSlice: packet_start_code_prefix should be 1 but with value "+s);var d=this.pes_slice_queues_[n.pid];d&&(0===d.expected_length||d.expected_length===d.total_length?this.emitPESSlices(d,n):this.clearSlices(d,n)),this.pes_slice_queues_[n.pid]=new C,this.pes_slice_queues_[n.pid].file_position=n.file_position,this.pes_slice_queues_[n.pid].random_access_indicator=n.random_access_indicator}if(null!=this.pes_slice_queues_[n.pid]){var _=this.pes_slice_queues_[n.pid];_.slices.push(a),n.payload_unit_start_indicator&&(_.expected_length=0===o?0:o+6),_.total_length+=a.byteLength,_.expected_length>0&&_.expected_length===_.total_length?this.emitPESSlices(_,n):_.expected_length>0&&_.expected_length<_.total_length&&this.clearSlices(_,n)}},t.prototype.emitSectionSlices=function(e,t){for(var i=new Uint8Array(e.total_length),n=0,a=0;n>>6,o=t[8],d=void 0,_=void 0;2!==s&&3!==s||(d=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2,_=3===s?536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2:d);var h=9+o,c=void 0;if(0!==a){if(a<3+o)return void r.a.v(this.TAG,"Malformed PES: PES_packet_length < 3 + PES_header_data_length");c=a-3-o}else c=t.byteLength-h;var u=t.subarray(h,h+c);switch(e.stream_type){case E.kMPEG1Audio:case E.kMPEG2Audio:this.parseMP3Payload(u,d);break;case E.kPESPrivateData:this.pmt_.common_pids.opus===e.pid?this.parseOpusPayload(u,d):this.pmt_.common_pids.ac3===e.pid?this.parseAC3Payload(u,d):this.pmt_.smpte2038_pids[e.pid]?this.parseSMPTE2038MetadataPayload(u,d,_,e.pid,n):this.parsePESPrivateDataPayload(u,d,_,e.pid,n);break;case E.kADTSAAC:this.parseADTSAACPayload(u,d);break;case E.kLOASAAC:this.parseLOASAACPayload(u,d);break;case E.kAC3:this.parseAC3Payload(u,d);break;case E.kID3:this.parseTimedID3MetadataPayload(u,d,_,e.pid,n);break;case E.kH264:this.parseH264Payload(u,d,_,e.file_position,e.random_access_indicator);break;case E.kH265:this.parseH265Payload(u,d,_,e.file_position,e.random_access_indicator)}}else if((188===n||191===n||240===n||241===n||255===n||242===n||248===n)&&e.stream_type===E.kPESPrivateData){h=6,c=void 0;c=0!==a?a:t.byteLength-h;u=t.subarray(h,h+c);this.parsePESPrivateDataPayload(u,void 0,void 0,e.pid,n)}}else r.a.e(this.TAG,"parsePES: packet_start_code_prefix should be 1 but with value "+i)},t.prototype.parsePAT=function(e){var t=e[0];if(0===t){var i=(15&e[1])<<8|e[2],n=(e[3],e[4],(62&e[5])>>>1),a=1&e[5],s=e[6],o=(e[7],null);if(1===a&&0===s)(o=new T).version_number=n;else if(null==(o=this.pat_))return;for(var d=i-5-4,_=-1,h=-1,c=8;c<8+d;c+=4){var u=e[c]<<8|e[c+1],l=(31&e[c+2])<<8|e[c+3];0===u?o.network_pid=l:(o.program_pmt_pid[u]=l,-1===_&&(_=u),-1===h&&(h=l))}1===a&&0===s&&(null==this.pat_&&r.a.v(this.TAG,"Parsed first PAT: "+JSON.stringify(o)),this.pat_=o,this.current_program_=_,this.current_pmt_pid_=h)}else r.a.e(this.TAG,"parsePAT: table_id "+t+" is not corresponded to PAT!")},t.prototype.parsePMT=function(e){var t=e[0];if(2===t){var i=(15&e[1])<<8|e[2],n=e[3]<<8|e[4],a=(62&e[5])>>>1,s=1&e[5],o=e[6],d=(e[7],null);if(1===s&&0===o)(d=new w).program_number=n,d.version_number=a,this.program_pmt_map_[n]=d;else if(null==(d=this.program_pmt_map_[n]))return;e[8],e[9];for(var _=(15&e[10])<<8|e[11],h=12+_,c=i-9-_-4,u=h;u0){for(var v=u+5;v1&&(r.a.w(this.TAG,"AAC: Detected pts overlapped, expected: "+s+"ms, PES pts: "+a+"ms"),a=s)}}for(var o,d=new z(e),_=null,h=a;null!=(_=d.readNextAACFrame());){n=1024/_.sampling_frequency*1e3;var c={codec:"aac",data:_};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"aac",audio_object_type:_.audio_object_type,sampling_freq_index:_.sampling_freq_index,sampling_frequency:_.sampling_frequency,channel_config:_.channel_config},this.dispatchAudioInitSegment(c)):this.detectAudioMetadataChange(c)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(c)),o=h;var u=Math.floor(h),l={unit:_.data,length:_.data.byteLength,pts:u,dts:u};this.audio_track_.samples.push(l),this.audio_track_.length+=_.data.byteLength,h+=n}d.hasIncompleteData()&&(this.aac_last_incomplete_data_=d.getIncompleteData()),o&&(this.aac_last_sample_pts_=o)}},t.prototype.parseLOASAACPayload=function(e,t){var i;if(!this.has_video_||this.video_init_segment_dispatched_){if(this.aac_last_incomplete_data_){var n=new Uint8Array(e.byteLength+this.aac_last_incomplete_data_.byteLength);n.set(this.aac_last_incomplete_data_,0),n.set(e,this.aac_last_incomplete_data_.byteLength),e=n}var a,s;if(null!=t&&(s=t/this.timescale_),"aac"===this.audio_metadata_.codec){if(null==t&&null!=this.aac_last_sample_pts_)a=1024/this.audio_metadata_.sampling_frequency*1e3,s=this.aac_last_sample_pts_+a;else if(null==t)return void r.a.w(this.TAG,"AAC: Unknown pts");if(this.aac_last_incomplete_data_&&this.aac_last_sample_pts_){a=1024/this.audio_metadata_.sampling_frequency*1e3;var o=this.aac_last_sample_pts_+a;Math.abs(o-s)>1&&(r.a.w(this.TAG,"AAC: Detected pts overlapped, expected: "+o+"ms, PES pts: "+s+"ms"),s=o)}}for(var d,_=new H(e),h=null,c=s;null!=(h=_.readNextAACFrame(null!==(i=this.loas_previous_frame)&&void 0!==i?i:void 0));){this.loas_previous_frame=h,a=1024/h.sampling_frequency*1e3;var u={codec:"aac",data:h};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"aac",audio_object_type:h.audio_object_type,sampling_freq_index:h.sampling_freq_index,sampling_frequency:h.sampling_frequency,channel_config:h.channel_config},this.dispatchAudioInitSegment(u)):this.detectAudioMetadataChange(u)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(u)),d=c;var l=Math.floor(c),f={unit:h.data,length:h.data.byteLength,pts:l,dts:l};this.audio_track_.samples.push(f),this.audio_track_.length+=h.data.byteLength,c+=a}_.hasIncompleteData()&&(this.aac_last_incomplete_data_=_.getIncompleteData()),d&&(this.aac_last_sample_pts_=d)}},t.prototype.parseAC3Payload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){var i,n;if(null!=t&&(n=t/this.timescale_),"ac-3"===this.audio_metadata_.codec)if(null==t&&null!=this.aac_last_sample_pts_)i=1536/this.audio_metadata_.sampling_frequency*1e3,n=this.aac_last_sample_pts_+i;else if(null==t)return void r.a.w(this.TAG,"Opus: Unknown pts");for(var a,s=new me(e),o=null,d=n;null!=(o=s.readNextAC3Frame());){i=1536/o.sampling_frequency*1e3;var _={codec:"ac-3",data:o};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"ac-3",sampling_frequency:o.sampling_frequency,bit_stream_identification:o.bit_stream_identification,bit_stream_mode:o.bit_stream_mode,low_frequency_effects_channel_on:o.low_frequency_effects_channel_on,channel_mode:o.channel_mode},console.log(JSON.stringify(this.audio_metadata_)),this.dispatchAudioInitSegment(_)):this.detectAudioMetadataChange(_)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(_)),a=d;var h=Math.floor(d),c={unit:o.data,length:o.data.byteLength,pts:h,dts:h};this.audio_track_.samples.push(c),this.audio_track_.length+=o.data.byteLength,d+=i}a&&(this.aac_last_sample_pts_=a)}},t.prototype.parseOpusPayload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){var i,n;if(null!=t&&(n=t/this.timescale_),"opus"===this.audio_metadata_.codec)if(null==t&&null!=this.aac_last_sample_pts_)i=20,n=this.aac_last_sample_pts_+i;else if(null==t)return void r.a.w(this.TAG,"Opus: Unknown pts");for(var a,s=n,o=0;o>>3&3,s=(6&e[1])>>1,o=(240&e[2])>>>4,d=(12&e[2])>>>2,_=3!==(e[3]>>>6&3)?2:1,h=0,c=34;switch(r){case 0:h=[11025,12e3,8e3,0][d];break;case 2:h=[22050,24e3,16e3,0][d];break;case 3:h=[44100,48e3,32e3,0][d]}switch(s){case 1:c=34,o>>24&255,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i.set(e,4);var s=8;for(r=0;r>>24&255,t>>>16&255,t>>>8&255,255&t,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]))},e.trak=function(t){return e.box(e.types.trak,e.tkhd(t),e.mdia(t))},e.tkhd=function(t){var i=t.id,n=t.duration,a=t.presentWidth,r=t.presentHeight;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,a>>>8&255,255&a,0,0,r>>>8&255,255&r,0,0]))},e.mdia=function(t){return e.box(e.types.mdia,e.mdhd(t),e.hdlr(t),e.minf(t))},e.mdhd=function(t){var i=t.timescale,n=t.duration;return e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,n>>>24&255,n>>>16&255,n>>>8&255,255&n,85,196,0,0]))},e.hdlr=function(t){var i=null;return i="audio"===t.type?e.constants.HDLR_AUDIO:e.constants.HDLR_VIDEO,e.box(e.types.hdlr,i)},e.minf=function(t){var i=null;return i="audio"===t.type?e.box(e.types.smhd,e.constants.SMHD):e.box(e.types.vmhd,e.constants.VMHD),e.box(e.types.minf,i,e.dinf(),e.stbl(t))},e.dinf=function(){return e.box(e.types.dinf,e.box(e.types.dref,e.constants.DREF))},e.stbl=function(t){return e.box(e.types.stbl,e.stsd(t),e.box(e.types.stts,e.constants.STTS),e.box(e.types.stsc,e.constants.STSC),e.box(e.types.stsz,e.constants.STSZ),e.box(e.types.stco,e.constants.STCO))},e.stsd=function(t){return"audio"===t.type?"mp3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp3(t)):"ac-3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.ac3(t)):"opus"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.Opus(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp4a(t)):"video"===t.type&&t.codec.startsWith("hvc1")?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.hvc1(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.avc1(t))},e.mp3=function(t){var i=t.channelCount,n=t.audioSampleRate,a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types[".mp3"],a)},e.mp4a=function(t){var i=t.channelCount,n=t.audioSampleRate,a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types.mp4a,a,e.esds(t))},e.ac3=function(t){var i=t.channelCount,n=t.audioSampleRate,a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types["ac-3"],a,e.box(e.types.dac3,new Uint8Array(t.config)))},e.esds=function(t){var i=t.config||[],n=i.length,a=new Uint8Array([0,0,0,0,3,23+n,0,1,0,4,15+n,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([n]).concat(i).concat([6,1,2]));return e.box(e.types.esds,a)},e.Opus=function(t){var i=t.channelCount,n=t.audioSampleRate,a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types.Opus,a,e.dOps(t))},e.dOps=function(t){var i=t.channelCount,n=t.channelConfigCode,a=t.audioSampleRate;if(t.config)return e.box(e.types.dOps,s);var r=[];switch(n){case 1:case 2:r=[0];break;case 0:r=[255,1,1,0,1];break;case 128:r=[255,2,0,0,1];break;case 3:r=[1,2,1,0,2,1];break;case 4:r=[1,2,2,0,1,2,3];break;case 5:r=[1,3,2,0,4,1,2,3];break;case 6:r=[1,4,2,0,4,1,2,3,5];break;case 7:r=[1,4,2,0,4,1,2,3,5,6];break;case 8:r=[1,5,3,0,6,1,2,3,4,5,7];break;case 130:r=[1,1,2,0,1];break;case 131:r=[1,1,3,0,1,2];break;case 132:r=[1,1,4,0,1,2,3];break;case 133:r=[1,1,5,0,1,2,3,4];break;case 134:r=[1,1,6,0,1,2,3,4,5];break;case 135:r=[1,1,7,0,1,2,3,4,5,6];break;case 136:r=[1,1,8,0,1,2,3,4,5,6,7]}var s=new Uint8Array(Se([0,i,0,0,a>>>24&255,a>>>17&255,a>>>8&255,a>>>0&255,0,0],r));return e.box(e.types.dOps,s)},e.avc1=function(t){var i=t.avcc,n=t.codecWidth,a=t.codecHeight,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,n>>>8&255,255&n,a>>>8&255,255&a,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.avc1,r,e.box(e.types.avcC,i))},e.hvc1=function(t){var i=t.hvcc,n=t.codecWidth,a=t.codecHeight,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,n>>>8&255,255&n,a>>>8&255,255&a,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.hvc1,r,e.box(e.types.hvcC,i))},e.mvex=function(t){return e.box(e.types.mvex,e.trex(t))},e.trex=function(t){var i=t.id,n=new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return e.box(e.types.trex,n)},e.moof=function(t,i){return e.box(e.types.moof,e.mfhd(t.sequenceNumber),e.traf(t,i))},e.mfhd=function(t){var i=new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t]);return e.box(e.types.mfhd,i)},e.traf=function(t,i){var n=t.id,a=e.box(e.types.tfhd,new Uint8Array([0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n])),r=e.box(e.types.tfdt,new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i])),s=e.sdtp(t),o=e.trun(t,s.byteLength+16+16+8+16+8+8);return e.box(e.types.traf,a,r,o,s)},e.sdtp=function(t){for(var i=t.samples||[],n=i.length,a=new Uint8Array(4+n),r=0;r>>24&255,a>>>16&255,a>>>8&255,255&a,i>>>24&255,i>>>16&255,i>>>8&255,255&i],0);for(var o=0;o>>24&255,d>>>16&255,d>>>8&255,255&d,_>>>24&255,_>>>16&255,_>>>8&255,255&_,h.isLeading<<2|h.dependsOn,h.isDependedOn<<6|h.hasRedundancy<<4|h.isNonSync,0,0,c>>>24&255,c>>>16&255,c>>>8&255,255&c],12+16*o)}return e.box(e.types.trun,s)},e.mdat=function(t){return e.box(e.types.mdat,t)},e}();Ee.init();var Ae=Ee,Re=function(){function e(){}return e.getSilentFrame=function(e,t){if("mp4a.40.2"===e){if(1===t)return new Uint8Array([0,200,0,128,35,128]);if(2===t)return new Uint8Array([33,0,73,144,2,25,0,35,128]);if(3===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,142]);if(4===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,128,44,128,8,2,56]);if(5===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,56]);if(6===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,0,178,0,32,8,224])}else{if(1===t)return new Uint8Array([1,64,34,128,163,78,230,128,186,8,0,0,0,28,6,241,193,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(2===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(3===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94])}return null},e}(),Te=i(7),Le=function(){function e(e){this.TAG="MP4Remuxer",this._config=e,this._isLive=!0===e.isLive,this._dtsBase=-1,this._dtsBaseInited=!1,this._audioDtsBase=1/0,this._videoDtsBase=1/0,this._audioNextDts=void 0,this._videoNextDts=void 0,this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList=new Te.c("audio"),this._videoSegmentInfoList=new Te.c("video"),this._onInitSegment=null,this._onMediaSegment=null,this._forceFirstIDR=!(!s.a.chrome||!(s.a.version.major<50||50===s.a.version.major&&s.a.version.build<2661)),this._fillSilentAfterSeek=s.a.msedge||s.a.msie,this._mp3UseMpegAudio=!s.a.firefox,this._fillAudioTimestampGap=this._config.fixAudioTimestampGap}return e.prototype.destroy=function(){this._dtsBase=-1,this._dtsBaseInited=!1,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList.clear(),this._audioSegmentInfoList=null,this._videoSegmentInfoList.clear(),this._videoSegmentInfoList=null,this._onInitSegment=null,this._onMediaSegment=null},e.prototype.bindDataSource=function(e){return e.onDataAvailable=this.remux.bind(this),e.onTrackMetadata=this._onTrackMetadataReceived.bind(this),this},Object.defineProperty(e.prototype,"onInitSegment",{get:function(){return this._onInitSegment},set:function(e){this._onInitSegment=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaSegment",{get:function(){return this._onMediaSegment},set:function(e){this._onMediaSegment=e},enumerable:!1,configurable:!0}),e.prototype.insertDiscontinuity=function(){this._audioNextDts=this._videoNextDts=void 0},e.prototype.seek=function(e){this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._videoSegmentInfoList.clear(),this._audioSegmentInfoList.clear()},e.prototype.remux=function(e,t){if(!this._onMediaSegment)throw new c.a("MP4Remuxer: onMediaSegment callback must be specificed!");this._dtsBaseInited||this._calculateDtsBase(e,t),t&&this._remuxVideo(t),e&&this._remuxAudio(e)},e.prototype._onTrackMetadataReceived=function(e,t){var i=null,n="mp4",a=t.codec;if("audio"===e)this._audioMeta=t,"mp3"===t.codec&&this._mp3UseMpegAudio?(n="mpeg",a="",i=new Uint8Array):i=Ae.generateInitSegment(t);else{if("video"!==e)return;this._videoMeta=t,i=Ae.generateInitSegment(t)}if(!this._onInitSegment)throw new c.a("MP4Remuxer: onInitSegment callback must be specified!");this._onInitSegment(e,{type:e,data:i.buffer,codec:a,container:e+"/"+n,mediaDuration:t.duration})},e.prototype._calculateDtsBase=function(e,t){this._dtsBaseInited||(e&&e.samples&&e.samples.length&&(this._audioDtsBase=e.samples[0].dts),t&&t.samples&&t.samples.length&&(this._videoDtsBase=t.samples[0].dts),this._dtsBase=Math.min(this._audioDtsBase,this._videoDtsBase),this._dtsBaseInited=!0)},e.prototype.getTimestampBase=function(){if(this._dtsBaseInited)return this._dtsBase},e.prototype.flushStashedSamples=function(){var e=this._videoStashedLastSample,t=this._audioStashedLastSample,i={type:"video",id:1,sequenceNumber:0,samples:[],length:0};null!=e&&(i.samples.push(e),i.length=e.length);var n={type:"audio",id:2,sequenceNumber:0,samples:[],length:0};null!=t&&(n.samples.push(t),n.length=t.length),this._videoStashedLastSample=null,this._audioStashedLastSample=null,this._remuxVideo(i,!0),this._remuxAudio(n,!0)},e.prototype._remuxAudio=function(e,t){if(null!=this._audioMeta){var i,n=e,a=n.samples,o=void 0,d=-1,_=this._audioMeta.refSampleDuration,h="mp3"===this._audioMeta.codec&&this._mp3UseMpegAudio,c=this._dtsBaseInited&&void 0===this._audioNextDts,u=!1;if(a&&0!==a.length&&(1!==a.length||t)){var l=0,f=null,p=0;h?(l=0,p=n.length):(l=8,p=8+n.length);var m=null;if(a.length>1&&(p-=(m=a.pop()).length),null!=this._audioStashedLastSample){var g=this._audioStashedLastSample;this._audioStashedLastSample=null,a.unshift(g),p+=g.length}null!=m&&(this._audioStashedLastSample=m);var v=a[0].dts-this._dtsBase;if(this._audioNextDts)o=v-this._audioNextDts;else if(this._audioSegmentInfoList.isEmpty())o=0,this._fillSilentAfterSeek&&!this._videoSegmentInfoList.isEmpty()&&"mp3"!==this._audioMeta.originalCodec&&(u=!0);else{var y=this._audioSegmentInfoList.getLastSampleBefore(v);if(null!=y){var b=v-(y.originalDts+y.duration);b<=3&&(b=0),o=v-(y.dts+y.duration+b)}else o=0}if(u){var S=v-o,E=this._videoSegmentInfoList.getLastSegmentBefore(v);if(null!=E&&E.beginDts=3*_&&this._fillAudioTimestampGap&&!s.a.safari){D=!0;var O,P=Math.floor(o/_);r.a.w(this.TAG,"Large audio timestamp gap detected, may cause AV sync to drift. Silent frames will be generated to avoid unsync.\noriginalDts: "+k+" ms, curRefDts: "+I+" ms, dtsCorrection: "+Math.round(o)+" ms, generate: "+P+" frames"),A=Math.floor(I),B=Math.floor(I+_)-A,null==(O=Re.getSilentFrame(this._audioMeta.originalCodec,this._audioMeta.channelCount))&&(r.a.w(this.TAG,"Unable to generate silent frame for "+this._audioMeta.originalCodec+" with "+this._audioMeta.channelCount+" channels, repeat last frame"),O=w),C=[];for(var M=0;M=1?T[T.length-1].duration:Math.floor(_);this._audioNextDts=A+B}-1===d&&(d=A),T.push({dts:A,pts:A,cts:0,unit:g.unit,size:g.unit.byteLength,duration:B,originalDts:k,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0}}),D&&T.push.apply(T,C)}}if(0===T.length)return n.samples=[],void(n.length=0);h?f=new Uint8Array(p):((f=new Uint8Array(p))[0]=p>>>24&255,f[1]=p>>>16&255,f[2]=p>>>8&255,f[3]=255&p,f.set(Ae.types.mdat,4));for(L=0;L1&&(c-=(u=r.pop()).length),null!=this._videoStashedLastSample){var l=this._videoStashedLastSample;this._videoStashedLastSample=null,r.unshift(l),c+=l.length}null!=u&&(this._videoStashedLastSample=u);var f=r[0].dts-this._dtsBase;if(this._videoNextDts)s=f-this._videoNextDts;else if(this._videoSegmentInfoList.isEmpty())s=0;else{var p=this._videoSegmentInfoList.getLastSampleBefore(f);if(null!=p){var m=f-(p.originalDts+p.duration);m<=3&&(m=0),s=f-(p.dts+p.duration+m)}else s=0}for(var g=new Te.b,v=[],y=0;y=1?v[v.length-1].duration:Math.floor(this._videoMeta.refSampleDuration);if(S){var L=new Te.d(E,R,T,l.dts,!0);L.fileposition=l.fileposition,g.appendSyncPoint(L)}v.push({dts:E,pts:R,cts:A,units:l.units,size:l.length,isKeyframe:S,duration:T,originalDts:b,flags:{isLeading:0,dependsOn:S?2:1,isDependedOn:S?1:0,hasRedundancy:0,isNonSync:S?0:1}})}(h=new Uint8Array(c))[0]=c>>>24&255,h[1]=c>>>16&255,h[2]=c>>>8&255,h[3]=255&c,h.set(Ae.types.mdat,4);for(y=0;y0)this._demuxer.bindDataSource(this._ioctl),this._demuxer.timestampBase=this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase,n=this._demuxer.parseChunks(e,t);else{var a=null;(a=A.probe(e)).match&&(this._setupFLVDemuxerRemuxer(a),n=this._demuxer.parseChunks(e,t)),a.match||a.needMoreData||(a=be.probe(e)).match&&(this._setupTSDemuxerRemuxer(a),n=this._demuxer.parseChunks(e,t)),a.match||a.needMoreData||(a=null,r.a.e(this.TAG,"Non MPEG-TS/FLV, Unsupported media type!"),Promise.resolve().then((function(){i._internalAbort()})),this._emitter.emit(ke.a.DEMUX_ERROR,m.a.FORMAT_UNSUPPORTED,"Non MPEG-TS/FLV, Unsupported media type!"))}return n},e.prototype._setupFLVDemuxerRemuxer=function(e){this._demuxer=new A(e,this._config),this._remuxer||(this._remuxer=new Le(this._config));var t=this._mediaDataSource;null==t.duration||isNaN(t.duration)||(this._demuxer.overridedDuration=t.duration),"boolean"==typeof t.hasAudio&&(this._demuxer.overridedHasAudio=t.hasAudio),"boolean"==typeof t.hasVideo&&(this._demuxer.overridedHasVideo=t.hasVideo),this._demuxer.timestampBase=t.segments[this._currentSegmentIndex].timestampBase,this._demuxer.onError=this._onDemuxException.bind(this),this._demuxer.onMediaInfo=this._onMediaInfo.bind(this),this._demuxer.onMetaDataArrived=this._onMetaDataArrived.bind(this),this._demuxer.onScriptDataArrived=this._onScriptDataArrived.bind(this),this._remuxer.bindDataSource(this._demuxer.bindDataSource(this._ioctl)),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this)},e.prototype._setupTSDemuxerRemuxer=function(e){var t=this._demuxer=new be(e,this._config);this._remuxer||(this._remuxer=new Le(this._config)),t.onError=this._onDemuxException.bind(this),t.onMediaInfo=this._onMediaInfo.bind(this),t.onMetaDataArrived=this._onMetaDataArrived.bind(this),t.onTimedID3Metadata=this._onTimedID3Metadata.bind(this),t.onSMPTE2038Metadata=this._onSMPTE2038Metadata.bind(this),t.onSCTE35Metadata=this._onSCTE35Metadata.bind(this),t.onPESPrivateDataDescriptor=this._onPESPrivateDataDescriptor.bind(this),t.onPESPrivateData=this._onPESPrivateData.bind(this),this._remuxer.bindDataSource(this._demuxer),this._demuxer.bindDataSource(this._ioctl),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this)},e.prototype._onMediaInfo=function(e){var t=this;null==this._mediaInfo&&(this._mediaInfo=Object.assign({},e),this._mediaInfo.keyframesIndex=null,this._mediaInfo.segments=[],this._mediaInfo.segmentCount=this._mediaDataSource.segments.length,Object.setPrototypeOf(this._mediaInfo,o.a.prototype));var i=Object.assign({},e);Object.setPrototypeOf(i,o.a.prototype),this._mediaInfo.segments[this._currentSegmentIndex]=i,this._reportSegmentMediaInfo(this._currentSegmentIndex),null!=this._pendingSeekTime&&Promise.resolve().then((function(){var e=t._pendingSeekTime;t._pendingSeekTime=null,t.seek(e)}))},e.prototype._onMetaDataArrived=function(e){this._emitter.emit(ke.a.METADATA_ARRIVED,e)},e.prototype._onScriptDataArrived=function(e){this._emitter.emit(ke.a.SCRIPTDATA_ARRIVED,e)},e.prototype._onTimedID3Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(ke.a.TIMED_ID3_METADATA_ARRIVED,e))},e.prototype._onSMPTE2038Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),this._emitter.emit(ke.a.SMPTE2038_METADATA_ARRIVED,e))},e.prototype._onSCTE35Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),this._emitter.emit(ke.a.SCTE35_METADATA_ARRIVED,e))},e.prototype._onPESPrivateDataDescriptor=function(e){this._emitter.emit(ke.a.PES_PRIVATE_DATA_DESCRIPTOR,e)},e.prototype._onPESPrivateData=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(ke.a.PES_PRIVATE_DATA_ARRIVED,e))},e.prototype._onIOSeeked=function(){this._remuxer.insertDiscontinuity()},e.prototype._onIOComplete=function(e){var t=e+1;t0&&i[0].originalDts===n&&(n=i[0].pts),this._emitter.emit(ke.a.RECOMMEND_SEEKPOINT,n)}},e.prototype._enableStatisticsReporter=function(){null==this._statisticsReporter&&(this._statisticsReporter=self.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval))},e.prototype._disableStatisticsReporter=function(){this._statisticsReporter&&(self.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype._reportSegmentMediaInfo=function(e){var t=this._mediaInfo.segments[e],i=Object.assign({},t);i.duration=this._mediaInfo.duration,i.segmentCount=this._mediaInfo.segmentCount,delete i.segments,delete i.keyframesIndex,this._emitter.emit(ke.a.MEDIA_INFO,i)},e.prototype._reportStatisticsInfo=function(){var e={};e.url=this._ioctl.currentURL,e.hasRedirect=this._ioctl.hasRedirect,e.hasRedirect&&(e.redirectedURL=this._ioctl.currentRedirectedURL),e.speed=this._ioctl.currentSpeed,e.loaderType=this._ioctl.loaderType,e.currentSegmentIndex=this._currentSegmentIndex,e.totalSegmentCount=this._mediaDataSource.segments.length,this._emitter.emit(ke.a.STATISTICS_INFO,e)},e}();t.a=De},function(e,t,i){"use strict";var n,a=i(0),r=function(){function e(){this._firstCheckpoint=0,this._lastCheckpoint=0,this._intervalBytes=0,this._totalBytes=0,this._lastSecondBytes=0,self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now}return e.prototype.reset=function(){this._firstCheckpoint=this._lastCheckpoint=0,this._totalBytes=this._intervalBytes=0,this._lastSecondBytes=0},e.prototype.addBytes=function(e){0===this._firstCheckpoint?(this._firstCheckpoint=this._now(),this._lastCheckpoint=this._firstCheckpoint,this._intervalBytes+=e,this._totalBytes+=e):this._now()-this._lastCheckpoint<1e3?(this._intervalBytes+=e,this._totalBytes+=e):(this._lastSecondBytes=this._intervalBytes,this._intervalBytes=e,this._totalBytes+=e,this._lastCheckpoint=this._now())},Object.defineProperty(e.prototype,"currentKBps",{get:function(){this.addBytes(0);var e=(this._now()-this._lastCheckpoint)/1e3;return 0==e&&(e=1),this._intervalBytes/e/1024},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"lastSecondKBps",{get:function(){return this.addBytes(0),0!==this._lastSecondBytes?this._lastSecondBytes/1024:this._now()-this._lastCheckpoint>=500?this.currentKBps:0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"averageKBps",{get:function(){var e=(this._now()-this._firstCheckpoint)/1e3;return this._totalBytes/e/1024},enumerable:!1,configurable:!0}),e}(),s=i(2),o=i(4),d=i(3),_=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),h=function(e){function t(t,i){var n=e.call(this,"fetch-stream-loader")||this;return n.TAG="FetchStreamLoader",n._seekHandler=t,n._config=i,n._needStash=!0,n._requestAbort=!1,n._abortController=null,n._contentLength=null,n._receivedLength=0,n}return _(t,e),t.isSupported=function(){try{var e=o.a.msedge&&o.a.version.minor>=15048,t=!o.a.msedge||e;return self.fetch&&self.ReadableStream&&t}catch(e){return!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){var i=this;this._dataSource=e,this._range=t;var n=e.url;this._config.reuseRedirectedURL&&null!=e.redirectedURL&&(n=e.redirectedURL);var a=this._seekHandler.getConfig(n,t),r=new self.Headers;if("object"==typeof a.headers){var o=a.headers;for(var _ in o)o.hasOwnProperty(_)&&r.append(_,o[_])}var h={method:"GET",headers:r,mode:"cors",cache:"default",referrerPolicy:"no-referrer-when-downgrade"};if("object"==typeof this._config.headers)for(var _ in this._config.headers)r.append(_,this._config.headers[_]);!1===e.cors&&(h.mode="same-origin"),e.withCredentials&&(h.credentials="include"),e.referrerPolicy&&(h.referrerPolicy=e.referrerPolicy),self.AbortController&&(this._abortController=new self.AbortController,h.signal=this._abortController.signal),this._status=s.c.kConnecting,self.fetch(a.url,h).then((function(e){if(i._requestAbort)return i._status=s.c.kIdle,void e.body.cancel();if(e.ok&&e.status>=200&&e.status<=299){if(e.url!==a.url&&i._onURLRedirect){var t=i._seekHandler.removeURLParameters(e.url);i._onURLRedirect(t)}var n=e.headers.get("Content-Length");return null!=n&&(i._contentLength=parseInt(n),0!==i._contentLength&&i._onContentLengthKnown&&i._onContentLengthKnown(i._contentLength)),i._pump.call(i,e.body.getReader())}if(i._status=s.c.kError,!i._onError)throw new d.d("FetchStreamLoader: Http code invalid, "+e.status+" "+e.statusText);i._onError(s.b.HTTP_STATUS_CODE_INVALID,{code:e.status,msg:e.statusText})})).catch((function(e){if(!i._abortController||!i._abortController.signal.aborted){if(i._status=s.c.kError,!i._onError)throw e;i._onError(s.b.EXCEPTION,{code:-1,msg:e.message})}}))},t.prototype.abort=function(){if(this._requestAbort=!0,(this._status!==s.c.kBuffering||!o.a.chrome)&&this._abortController)try{this._abortController.abort()}catch(e){}},t.prototype._pump=function(e){var t=this;return e.read().then((function(i){if(i.done)if(null!==t._contentLength&&t._receivedLength299)){if(this._status=s.c.kError,!this._onError)throw new d.d("MozChunkedLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(s.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}else this._status=s.c.kBuffering}},t.prototype._onProgress=function(e){if(this._status!==s.c.kError){null===this._contentLength&&null!==e.total&&0!==e.total&&(this._contentLength=e.total,this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength));var t=e.target.response,i=this._range.from+this._receivedLength;this._receivedLength+=t.byteLength,this._onDataArrival&&this._onDataArrival(t,i,this._receivedLength)}},t.prototype._onLoadEnd=function(e){!0!==this._requestAbort?this._status!==s.c.kError&&(this._status=s.c.kComplete,this._onComplete&&this._onComplete(this._range.from,this._range.from+this._receivedLength-1)):this._requestAbort=!1},t.prototype._onXhrError=function(e){this._status=s.c.kError;var t=0,i=null;if(this._contentLength&&e.loaded=this._contentLength&&(i=this._range.from+this._contentLength-1),this._currentRequestRange={from:t,to:i},this._internalOpen(this._dataSource,this._currentRequestRange)},t.prototype._internalOpen=function(e,t){this._lastTimeLoaded=0;var i=e.url;this._config.reuseRedirectedURL&&(null!=this._currentRedirectedURL?i=this._currentRedirectedURL:null!=e.redirectedURL&&(i=e.redirectedURL));var n=this._seekHandler.getConfig(i,t);this._currentRequestURL=n.url;var a=this._xhr=new XMLHttpRequest;if(a.open("GET",n.url,!0),a.responseType="arraybuffer",a.onreadystatechange=this._onReadyStateChange.bind(this),a.onprogress=this._onProgress.bind(this),a.onload=this._onLoad.bind(this),a.onerror=this._onXhrError.bind(this),e.withCredentials&&(a.withCredentials=!0),"object"==typeof n.headers){var r=n.headers;for(var s in r)r.hasOwnProperty(s)&&a.setRequestHeader(s,r[s])}if("object"==typeof this._config.headers){r=this._config.headers;for(var s in r)r.hasOwnProperty(s)&&a.setRequestHeader(s,r[s])}a.send()},t.prototype.abort=function(){this._requestAbort=!0,this._internalAbort(),this._status=s.c.kComplete},t.prototype._internalAbort=function(){this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onload=null,this._xhr.onerror=null,this._xhr.abort(),this._xhr=null)},t.prototype._onReadyStateChange=function(e){var t=e.target;if(2===t.readyState){if(null!=t.responseURL){var i=this._seekHandler.removeURLParameters(t.responseURL);t.responseURL!==this._currentRequestURL&&i!==this._currentRedirectedURL&&(this._currentRedirectedURL=i,this._onURLRedirect&&this._onURLRedirect(i))}if(t.status>=200&&t.status<=299){if(this._waitForTotalLength)return;this._status=s.c.kBuffering}else{if(this._status=s.c.kError,!this._onError)throw new d.d("RangeLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(s.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}}},t.prototype._onProgress=function(e){if(this._status!==s.c.kError){if(null===this._contentLength){var t=!1;if(this._waitForTotalLength){this._waitForTotalLength=!1,this._totalLengthReceived=!0,t=!0;var i=e.total;this._internalAbort(),null!=i&0!==i&&(this._totalLength=i)}if(-1===this._range.to?this._contentLength=this._totalLength-this._range.from:this._contentLength=this._range.to-this._range.from+1,t)return void this._openSubRange();this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength)}var n=e.loaded-this._lastTimeLoaded;this._lastTimeLoaded=e.loaded,this._speedSampler.addBytes(n)}},t.prototype._normalizeSpeed=function(e){var t=this._chunkSizeKBList,i=t.length-1,n=0,a=0,r=i;if(e=t[n]&&e=3&&(t=this._speedSampler.currentKBps)),0!==t){var i=this._normalizeSpeed(t);this._currentSpeedNormalized!==i&&(this._currentSpeedNormalized=i,this._currentChunkSizeKB=i)}var n=e.target.response,a=this._range.from+this._receivedLength;this._receivedLength+=n.byteLength;var r=!1;null!=this._contentLength&&this._receivedLength0&&this._receivedLength0)for(var r=i.split("&"),s=0;s0;o[0]!==this._startName&&o[0]!==this._endName&&(d&&(a+="&"),a+=r[s])}return 0===a.length?t:t+"?"+a},e}(),y=function(){function e(e,t,i){this.TAG="IOController",this._config=t,this._extraData=i,this._stashInitialSize=65536,null!=t.stashInitialSize&&t.stashInitialSize>0&&(this._stashInitialSize=t.stashInitialSize),this._stashUsed=0,this._stashSize=this._stashInitialSize,this._bufferSize=3145728,this._stashBuffer=new ArrayBuffer(this._bufferSize),this._stashByteStart=0,this._enableStash=!0,!1===t.enableStashBuffer&&(this._enableStash=!1),this._loader=null,this._loaderClass=null,this._seekHandler=null,this._dataSource=e,this._isWebSocketURL=/wss?:\/\/(.+?)/.test(e.url),this._refTotalLength=e.filesize?e.filesize:null,this._totalLength=this._refTotalLength,this._fullRequestFlag=!1,this._currentRange=null,this._redirectedURL=null,this._speedNormalized=0,this._speedSampler=new r,this._speedNormalizeList=[32,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096],this._isEarlyEofReconnecting=!1,this._paused=!1,this._resumeFrom=0,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._selectSeekHandler(),this._selectLoader(),this._createLoader()}return e.prototype.destroy=function(){this._loader.isWorking()&&this._loader.abort(),this._loader.destroy(),this._loader=null,this._loaderClass=null,this._dataSource=null,this._stashBuffer=null,this._stashUsed=this._stashSize=this._bufferSize=this._stashByteStart=0,this._currentRange=null,this._speedSampler=null,this._isEarlyEofReconnecting=!1,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._extraData=null},e.prototype.isWorking=function(){return this._loader&&this._loader.isWorking()&&!this._paused},e.prototype.isPaused=function(){return this._paused},Object.defineProperty(e.prototype,"status",{get:function(){return this._loader.status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"extraData",{get:function(){return this._extraData},set:function(e){this._extraData=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onSeeked",{get:function(){return this._onSeeked},set:function(e){this._onSeeked=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRedirect",{get:function(){return this._onRedirect},set:function(e){this._onRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRecoveredEarlyEof",{get:function(){return this._onRecoveredEarlyEof},set:function(e){this._onRecoveredEarlyEof=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentURL",{get:function(){return this._dataSource.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasRedirect",{get:function(){return null!=this._redirectedURL||null!=this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentRedirectedURL",{get:function(){return this._redirectedURL||this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentSpeed",{get:function(){return this._loaderClass===f?this._loader.currentSpeed:this._speedSampler.lastSecondKBps},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"loaderType",{get:function(){return this._loader.type},enumerable:!1,configurable:!0}),e.prototype._selectSeekHandler=function(){var e=this._config;if("range"===e.seekType)this._seekHandler=new g(this._config.rangeLoadZeroStart);else if("param"===e.seekType){var t=e.seekParamStart||"bstart",i=e.seekParamEnd||"bend";this._seekHandler=new v(t,i)}else{if("custom"!==e.seekType)throw new d.b("Invalid seekType in config: "+e.seekType);if("function"!=typeof e.customSeekHandler)throw new d.b("Custom seekType specified in config but invalid customSeekHandler!");this._seekHandler=new e.customSeekHandler}},e.prototype._selectLoader=function(){if(null!=this._config.customLoader)this._loaderClass=this._config.customLoader;else if(this._isWebSocketURL)this._loaderClass=m;else if(h.isSupported())this._loaderClass=h;else if(u.isSupported())this._loaderClass=u;else{if(!f.isSupported())throw new d.d("Your browser doesn't support xhr with arraybuffer responseType!");this._loaderClass=f}},e.prototype._createLoader=function(){this._loader=new this._loaderClass(this._seekHandler,this._config),!1===this._loader.needStashBuffer&&(this._enableStash=!1),this._loader.onContentLengthKnown=this._onContentLengthKnown.bind(this),this._loader.onURLRedirect=this._onURLRedirect.bind(this),this._loader.onDataArrival=this._onLoaderChunkArrival.bind(this),this._loader.onComplete=this._onLoaderComplete.bind(this),this._loader.onError=this._onLoaderError.bind(this)},e.prototype.open=function(e){this._currentRange={from:0,to:-1},e&&(this._currentRange.from=e),this._speedSampler.reset(),e||(this._fullRequestFlag=!0),this._loader.open(this._dataSource,Object.assign({},this._currentRange))},e.prototype.abort=function(){this._loader.abort(),this._paused&&(this._paused=!1,this._resumeFrom=0)},e.prototype.pause=function(){this.isWorking()&&(this._loader.abort(),0!==this._stashUsed?(this._resumeFrom=this._stashByteStart,this._currentRange.to=this._stashByteStart-1):this._resumeFrom=this._currentRange.to+1,this._stashUsed=0,this._stashByteStart=0,this._paused=!0)},e.prototype.resume=function(){if(this._paused){this._paused=!1;var e=this._resumeFrom;this._resumeFrom=0,this._internalSeek(e,!0)}},e.prototype.seek=function(e){this._paused=!1,this._stashUsed=0,this._stashByteStart=0,this._internalSeek(e,!0)},e.prototype._internalSeek=function(e,t){this._loader.isWorking()&&this._loader.abort(),this._flushStashBuffer(t),this._loader.destroy(),this._loader=null;var i={from:e,to:-1};this._currentRange={from:i.from,to:-1},this._speedSampler.reset(),this._stashSize=this._stashInitialSize,this._createLoader(),this._loader.open(this._dataSource,i),this._onSeeked&&this._onSeeked()},e.prototype.updateUrl=function(e){if(!e||"string"!=typeof e||0===e.length)throw new d.b("Url must be a non-empty string!");this._dataSource.url=e},e.prototype._expandBuffer=function(e){for(var t=this._stashSize;t+10485760){var n=new Uint8Array(this._stashBuffer,0,this._stashUsed);new Uint8Array(i,0,t).set(n,0)}this._stashBuffer=i,this._bufferSize=t}},e.prototype._normalizeSpeed=function(e){var t=this._speedNormalizeList,i=t.length-1,n=0,a=0,r=i;if(e=t[n]&&e=512&&e<=1024?Math.floor(1.5*e):2*e)>8192&&(t=8192);var i=1024*t+1048576;this._bufferSize0){var r=this._stashBuffer.slice(0,this._stashUsed);if((_=this._dispatchChunks(r,this._stashByteStart))0){h=new Uint8Array(r,_);o.set(h,0),this._stashUsed=h.byteLength,this._stashByteStart+=_}}else this._stashUsed=0,this._stashByteStart+=_;this._stashUsed+e.byteLength>this._bufferSize&&(this._expandBuffer(this._stashUsed+e.byteLength),o=new Uint8Array(this._stashBuffer,0,this._bufferSize)),o.set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength}else{if((_=this._dispatchChunks(e,t))this._bufferSize&&(this._expandBuffer(s),o=new Uint8Array(this._stashBuffer,0,this._bufferSize)),o.set(new Uint8Array(e,_),0),this._stashUsed+=s,this._stashByteStart=t+_}}else if(0===this._stashUsed){var s;if((_=this._dispatchChunks(e,t))this._bufferSize&&this._expandBuffer(s),(o=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e,_),0),this._stashUsed+=s,this._stashByteStart=t+_}else{var o,_;if(this._stashUsed+e.byteLength>this._bufferSize&&this._expandBuffer(this._stashUsed+e.byteLength),(o=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength,(_=this._dispatchChunks(this._stashBuffer.slice(0,this._stashUsed),this._stashByteStart))0){var h=new Uint8Array(this._stashBuffer,_);o.set(h,0)}this._stashUsed-=_,this._stashByteStart+=_}}},e.prototype._flushStashBuffer=function(e){if(this._stashUsed>0){var t=this._stashBuffer.slice(0,this._stashUsed),i=this._dispatchChunks(t,this._stashByteStart),n=t.byteLength-i;if(i0){var r=new Uint8Array(this._stashBuffer,0,this._bufferSize),s=new Uint8Array(t,i);r.set(s,0),this._stashUsed=s.byteLength,this._stashByteStart+=i}return 0}a.a.w(this.TAG,n+" bytes unconsumed data remain when flush buffer, dropped")}return this._stashUsed=0,this._stashByteStart=0,n}return 0},e.prototype._onLoaderComplete=function(e,t){this._flushStashBuffer(!0),this._onComplete&&this._onComplete(this._extraData)},e.prototype._onLoaderError=function(e,t){switch(a.a.e(this.TAG,"Loader error, code = "+t.code+", msg = "+t.msg),this._flushStashBuffer(!1),this._isEarlyEofReconnecting&&(this._isEarlyEofReconnecting=!1,e=s.b.UNRECOVERABLE_EARLY_EOF),e){case s.b.EARLY_EOF:if(!this._config.isLive&&this._totalLength){var i=this._currentRange.to+1;return void(i0}),!1)}e.exports=function(e,t){t=t||{};var a={main:i.m},o=t.all?{main:Object.keys(a.main)}:function(e,t){for(var i={main:[t]},n={main:[]},a={main:{}};s(i);)for(var o=Object.keys(i),d=0;d1)for(var i=1;i0&&(n+=";codecs="+i.codec);var a=!1;if(c.a.v(this.TAG,"Received Initialization Segment, mimeType: "+n),this._lastInitSegments[i.type]=i,n!==this._mimeTypes[i.type]){if(this._mimeTypes[i.type])c.a.v(this.TAG,"Notice: "+i.type+" mimeType changed, origin: "+this._mimeTypes[i.type]+", target: "+n);else{a=!0;try{var r=this._sourceBuffers[i.type]=this._mediaSource.addSourceBuffer(n);r.addEventListener("error",this.e.onSourceBufferError),r.addEventListener("updateend",this.e.onSourceBufferUpdateEnd)}catch(e){return c.a.e(this.TAG,e.message),void this._emitter.emit(S.ERROR,{code:e.code,msg:e.message})}}this._mimeTypes[i.type]=n}t||this._pendingSegments[i.type].push(i),a||this._sourceBuffers[i.type]&&!this._sourceBuffers[i.type].updating&&this._doAppendSegments(),u.a.safari&&"audio/mpeg"===i.container&&i.mediaDuration>0&&(this._requireSetMediaDuration=!0,this._pendingMediaDuration=i.mediaDuration/1e3,this._updateMediaSourceDuration())},e.prototype.appendMediaSegment=function(e){var t=e;this._pendingSegments[t.type].push(t),this._config.autoCleanupSourceBuffer&&this._needCleanupSourceBuffer()&&this._doCleanupSourceBuffer();var i=this._sourceBuffers[t.type];!i||i.updating||this._hasPendingRemoveRanges()||this._doAppendSegments()},e.prototype.seek=function(e){for(var t in this._sourceBuffers)if(this._sourceBuffers[t]){var i=this._sourceBuffers[t];if("open"===this._mediaSource.readyState)try{i.abort()}catch(e){c.a.e(this.TAG,e.message)}this._idrList.clear();var n=this._pendingSegments[t];if(n.splice(0,n.length),"closed"!==this._mediaSource.readyState){for(var a=0;a=1&&e-n.start(0)>=this._config.autoCleanupMaxBackwardDuration)return!0}}return!1},e.prototype._doCleanupSourceBuffer=function(){var e=this._mediaElement.currentTime;for(var t in this._sourceBuffers){var i=this._sourceBuffers[t];if(i){for(var n=i.buffered,a=!1,r=0;r=this._config.autoCleanupMaxBackwardDuration){a=!0;var d=e-this._config.autoCleanupMinBackwardDuration;this._pendingRemoveRanges[t].push({start:s,end:d})}}else o0&&(isNaN(t)||i>t)&&(c.a.v(this.TAG,"Update MediaSource duration from "+t+" to "+i),this._mediaSource.duration=i),this._requireSetMediaDuration=!1,this._pendingMediaDuration=0}},e.prototype._doRemoveRanges=function(){for(var e in this._pendingRemoveRanges)if(this._sourceBuffers[e]&&!this._sourceBuffers[e].updating)for(var t=this._sourceBuffers[e],i=this._pendingRemoveRanges[e];i.length&&!t.updating;){var n=i.shift();t.remove(n.start,n.end)}},e.prototype._doAppendSegments=function(){var e=this._pendingSegments;for(var t in e)if(this._sourceBuffers[t]&&!this._sourceBuffers[t].updating&&e[t].length>0){var i=e[t].shift();if(i.timestampOffset){var n=this._sourceBuffers[t].timestampOffset,a=i.timestampOffset/1e3;Math.abs(n-a)>.1&&(c.a.v(this.TAG,"Update MPEG audio timestampOffset from "+n+" to "+a),this._sourceBuffers[t].timestampOffset=a),delete i.timestampOffset}if(!i.data||0===i.data.byteLength)continue;try{this._sourceBuffers[t].appendBuffer(i.data),this._isBufferFull=!1,"video"===t&&i.hasOwnProperty("info")&&this._idrList.appendArray(i.info.syncPoints)}catch(e){this._pendingSegments[t].unshift(i),22===e.code?(this._isBufferFull||this._emitter.emit(S.BUFFER_FULL),this._isBufferFull=!0):(c.a.e(this.TAG,e.message),this._emitter.emit(S.ERROR,{code:e.code,msg:e.message}))}}},e.prototype._onSourceOpen=function(){if(c.a.v(this.TAG,"MediaSource onSourceOpen"),this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._pendingSourceBufferInit.length>0)for(var e=this._pendingSourceBufferInit;e.length;){var t=e.shift();this.appendInitSegment(t,!0)}this._hasPendingSegments()&&this._doAppendSegments(),this._emitter.emit(S.SOURCE_OPEN)},e.prototype._onSourceEnded=function(){c.a.v(this.TAG,"MediaSource onSourceEnded")},e.prototype._onSourceClose=function(){c.a.v(this.TAG,"MediaSource onSourceClose"),this._mediaSource&&null!=this.e&&(this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._mediaSource.removeEventListener("sourceended",this.e.onSourceEnded),this._mediaSource.removeEventListener("sourceclose",this.e.onSourceClose))},e.prototype._hasPendingSegments=function(){var e=this._pendingSegments;return e.video.length>0||e.audio.length>0},e.prototype._hasPendingRemoveRanges=function(){var e=this._pendingRemoveRanges;return e.video.length>0||e.audio.length>0},e.prototype._onSourceBufferUpdateEnd=function(){this._requireSetMediaDuration?this._updateMediaSourceDuration():this._hasPendingRemoveRanges()?this._doRemoveRanges():this._hasPendingSegments()?this._doAppendSegments():this._hasPendingEos&&this.endOfStream(),this._emitter.emit(S.UPDATE_END)},e.prototype._onSourceBufferError=function(e){c.a.e(this.TAG,"SourceBuffer Error: "+e)},e}(),T=i(5),L={NETWORK_ERROR:"NetworkError",MEDIA_ERROR:"MediaError",OTHER_ERROR:"OtherError"},w={NETWORK_EXCEPTION:d.b.EXCEPTION,NETWORK_STATUS_CODE_INVALID:d.b.HTTP_STATUS_CODE_INVALID,NETWORK_TIMEOUT:d.b.CONNECTING_TIMEOUT,NETWORK_UNRECOVERABLE_EARLY_EOF:d.b.UNRECOVERABLE_EARLY_EOF,MEDIA_MSE_ERROR:"MediaMSEError",MEDIA_FORMAT_ERROR:T.a.FORMAT_ERROR,MEDIA_FORMAT_UNSUPPORTED:T.a.FORMAT_UNSUPPORTED,MEDIA_CODEC_UNSUPPORTED:T.a.CODEC_UNSUPPORTED},k=function(){function e(e,t){this.TAG="MSEPlayer",this._type="MSEPlayer",this._emitter=new h.a,this._config=s(),"object"==typeof t&&Object.assign(this._config,t);var i=e.type.toLowerCase();if("mse"!==i&&"mpegts"!==i&&"m2ts"!==i&&"flv"!==i)throw new A.b("MSEPlayer requires an mpegts/m2ts/flv MediaDataSource input!");!0===e.isLive&&(this._config.isLive=!0),this.e={onvLoadedMetadata:this._onvLoadedMetadata.bind(this),onvSeeking:this._onvSeeking.bind(this),onvCanPlay:this._onvCanPlay.bind(this),onvStalled:this._onvStalled.bind(this),onvProgress:this._onvProgress.bind(this)},self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now,this._pendingSeekTime=null,this._requestSetTime=!1,this._seekpointRecord=null,this._progressChecker=null,this._mediaDataSource=e,this._mediaElement=null,this._msectl=null,this._transmuxer=null,this._mseSourceOpened=!1,this._hasPendingLoad=!1,this._receivedCanPlay=!1,this._mediaInfo=null,this._statisticsInfo=null;var n=u.a.chrome&&(u.a.version.major<50||50===u.a.version.major&&u.a.version.build<2661);this._alwaysSeekKeyframe=!!(n||u.a.msedge||u.a.msie),this._alwaysSeekKeyframe&&(this._config.accurateSeek=!1)}return e.prototype.destroy=function(){null!=this._progressChecker&&(window.clearInterval(this._progressChecker),this._progressChecker=null),this._transmuxer&&this.unload(),this._mediaElement&&this.detachMediaElement(),this.e=null,this._mediaDataSource=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var i=this;e===l.MEDIA_INFO?null!=this._mediaInfo&&Promise.resolve().then((function(){i._emitter.emit(l.MEDIA_INFO,i.mediaInfo)})):e===l.STATISTICS_INFO&&null!=this._statisticsInfo&&Promise.resolve().then((function(){i._emitter.emit(l.STATISTICS_INFO,i.statisticsInfo)})),this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){var t=this;if(this._mediaElement=e,e.addEventListener("loadedmetadata",this.e.onvLoadedMetadata),e.addEventListener("seeking",this.e.onvSeeking),e.addEventListener("canplay",this.e.onvCanPlay),e.addEventListener("stalled",this.e.onvStalled),e.addEventListener("progress",this.e.onvProgress),this._msectl=new R(this._config),this._msectl.on(S.UPDATE_END,this._onmseUpdateEnd.bind(this)),this._msectl.on(S.BUFFER_FULL,this._onmseBufferFull.bind(this)),this._msectl.on(S.SOURCE_OPEN,(function(){t._mseSourceOpened=!0,t._hasPendingLoad&&(t._hasPendingLoad=!1,t.load())})),this._msectl.on(S.ERROR,(function(e){t._emitter.emit(l.ERROR,L.MEDIA_ERROR,w.MEDIA_MSE_ERROR,e)})),this._msectl.attachMediaElement(e),null!=this._pendingSeekTime)try{e.currentTime=this._pendingSeekTime,this._pendingSeekTime=null}catch(e){}},e.prototype.detachMediaElement=function(){this._mediaElement&&(this._msectl.detachMediaElement(),this._mediaElement.removeEventListener("loadedmetadata",this.e.onvLoadedMetadata),this._mediaElement.removeEventListener("seeking",this.e.onvSeeking),this._mediaElement.removeEventListener("canplay",this.e.onvCanPlay),this._mediaElement.removeEventListener("stalled",this.e.onvStalled),this._mediaElement.removeEventListener("progress",this.e.onvProgress),this._mediaElement=null),this._msectl&&(this._msectl.destroy(),this._msectl=null)},e.prototype.load=function(){var e=this;if(!this._mediaElement)throw new A.a("HTMLMediaElement must be attached before load()!");if(this._transmuxer)throw new A.a("MSEPlayer.load() has been called, please call unload() first!");this._hasPendingLoad||(this._config.deferLoadAfterSourceOpen&&!1===this._mseSourceOpened?this._hasPendingLoad=!0:(this._mediaElement.readyState>0&&(this._requestSetTime=!0,this._mediaElement.currentTime=0),this._transmuxer=new b(this._mediaDataSource,this._config),this._transmuxer.on(v.a.INIT_SEGMENT,(function(t,i){e._msectl.appendInitSegment(i)})),this._transmuxer.on(v.a.MEDIA_SEGMENT,(function(t,i){if(e._msectl.appendMediaSegment(i),e._config.lazyLoad&&!e._config.isLive){var n=e._mediaElement.currentTime;i.info.endDts>=1e3*(n+e._config.lazyLoadMaxDuration)&&null==e._progressChecker&&(c.a.v(e.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),e._suspendTransmuxer())}})),this._transmuxer.on(v.a.LOADING_COMPLETE,(function(){e._msectl.endOfStream(),e._emitter.emit(l.LOADING_COMPLETE)})),this._transmuxer.on(v.a.RECOVERED_EARLY_EOF,(function(){e._emitter.emit(l.RECOVERED_EARLY_EOF)})),this._transmuxer.on(v.a.IO_ERROR,(function(t,i){e._emitter.emit(l.ERROR,L.NETWORK_ERROR,t,i)})),this._transmuxer.on(v.a.DEMUX_ERROR,(function(t,i){e._emitter.emit(l.ERROR,L.MEDIA_ERROR,t,{code:-1,msg:i})})),this._transmuxer.on(v.a.MEDIA_INFO,(function(t){e._mediaInfo=t,e._emitter.emit(l.MEDIA_INFO,Object.assign({},t))})),this._transmuxer.on(v.a.METADATA_ARRIVED,(function(t){e._emitter.emit(l.METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SCRIPTDATA_ARRIVED,(function(t){e._emitter.emit(l.SCRIPTDATA_ARRIVED,t)})),this._transmuxer.on(v.a.TIMED_ID3_METADATA_ARRIVED,(function(t){e._emitter.emit(l.TIMED_ID3_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SMPTE2038_METADATA_ARRIVED,(function(t){e._emitter.emit(l.SMPTE2038_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SCTE35_METADATA_ARRIVED,(function(t){e._emitter.emit(l.SCTE35_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.PES_PRIVATE_DATA_DESCRIPTOR,(function(t){e._emitter.emit(l.PES_PRIVATE_DATA_DESCRIPTOR,t)})),this._transmuxer.on(v.a.PES_PRIVATE_DATA_ARRIVED,(function(t){e._emitter.emit(l.PES_PRIVATE_DATA_ARRIVED,t)})),this._transmuxer.on(v.a.STATISTICS_INFO,(function(t){e._statisticsInfo=e._fillStatisticsInfo(t),e._emitter.emit(l.STATISTICS_INFO,Object.assign({},e._statisticsInfo))})),this._transmuxer.on(v.a.RECOMMEND_SEEKPOINT,(function(t){e._mediaElement&&!e._config.accurateSeek&&(e._requestSetTime=!0,e._mediaElement.currentTime=t/1e3)})),this._transmuxer.open()))},e.prototype.unload=function(){this._mediaElement&&this._mediaElement.pause(),this._msectl&&this._msectl.seek(0),this._transmuxer&&(this._transmuxer.close(),this._transmuxer.destroy(),this._transmuxer=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._internalSeek(e):this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){return Object.assign({},this._mediaInfo)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){return null==this._statisticsInfo&&(this._statisticsInfo={}),this._statisticsInfo=this._fillStatisticsInfo(this._statisticsInfo),Object.assign({},this._statisticsInfo)},enumerable:!1,configurable:!0}),e.prototype._fillStatisticsInfo=function(e){if(e.playerType=this._type,!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var a=this._mediaElement.getVideoPlaybackQuality();i=a.totalVideoFrames,n=a.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},e.prototype._onmseUpdateEnd=function(){var e=this._mediaElement.buffered,t=this._mediaElement.currentTime;if(this._config.isLive&&this._config.liveBufferLatencyChasing&&e.length>0&&!this._mediaElement.paused){var i=e.end(e.length-1);if(i>this._config.liveBufferLatencyMaxLatency&&i-t>this._config.liveBufferLatencyMaxLatency){var n=i-this._config.liveBufferLatencyMinRemain;this.currentTime=n}}if(this._config.lazyLoad&&!this._config.isLive){for(var a=0,r=0;r=t+this._config.lazyLoadMaxDuration&&null==this._progressChecker&&(c.a.v(this.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),this._suspendTransmuxer())}},e.prototype._onmseBufferFull=function(){c.a.v(this.TAG,"MSE SourceBuffer is full, suspend transmuxing task"),null==this._progressChecker&&this._suspendTransmuxer()},e.prototype._suspendTransmuxer=function(){this._transmuxer&&(this._transmuxer.pause(),null==this._progressChecker&&(this._progressChecker=window.setInterval(this._checkProgressAndResume.bind(this),1e3)))},e.prototype._checkProgressAndResume=function(){for(var e=this._mediaElement.currentTime,t=this._mediaElement.buffered,i=!1,n=0;n=a&&e=r-this._config.lazyLoadRecoverDuration&&(i=!0);break}}i&&(window.clearInterval(this._progressChecker),this._progressChecker=null,i&&(c.a.v(this.TAG,"Continue loading from paused position"),this._transmuxer.resume()))},e.prototype._isTimepointBuffered=function(e){for(var t=this._mediaElement.buffered,i=0;i=n&&e0){var a=this._mediaElement.buffered.start(0);(a<1&&e0&&t.currentTime0){var n=i.start(0);if(n<1&&t0&&(this._mediaElement.currentTime=0),this._mediaElement.preload="auto",this._mediaElement.load(),this._statisticsReporter=window.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval)},e.prototype.unload=function(){this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src")),null!=this._statisticsReporter&&(window.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._mediaElement.currentTime=e:this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){var e={mimeType:(this._mediaElement instanceof HTMLAudioElement?"audio/":"video/")+this._mediaDataSource.type};return this._mediaElement&&(e.duration=Math.floor(1e3*this._mediaElement.duration),this._mediaElement instanceof HTMLVideoElement&&(e.width=this._mediaElement.videoWidth,e.height=this._mediaElement.videoHeight)),e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){var e={playerType:this._type,url:this._mediaDataSource.url};if(!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var a=this._mediaElement.getVideoPlaybackQuality();i=a.totalVideoFrames,n=a.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},enumerable:!1,configurable:!0}),e.prototype._onvLoadedMetadata=function(e){null!=this._pendingSeekTime&&(this._mediaElement.currentTime=this._pendingSeekTime,this._pendingSeekTime=null),this._emitter.emit(l.MEDIA_INFO,this.mediaInfo)},e.prototype._reportStatisticsInfo=function(){this._emitter.emit(l.STATISTICS_INFO,this.statisticsInfo)},e}();n.a.install();var C={createPlayer:function(e,t){var i=e;if(null==i||"object"!=typeof i)throw new A.b("MediaDataSource must be an javascript object!");if(!i.hasOwnProperty("type"))throw new A.b("MediaDataSource must has type field to indicate video file type!");switch(i.type){case"mse":case"mpegts":case"m2ts":case"flv":return new k(i,t);default:return new D(i,t)}},isSupported:function(){return o.supportMSEH264Playback()},getFeatureList:function(){return o.getFeatureList()}};C.BaseLoader=d.a,C.LoaderStatus=d.c,C.LoaderErrors=d.b,C.Events=l,C.ErrorTypes=L,C.ErrorDetails=w,C.MSEPlayer=k,C.NativePlayer=D,C.LoggingControl=m.a,Object.defineProperty(C,"version",{enumerable:!0,get:function(){return"1.7.3"}});t.default=C}])})); +//# sourceMappingURL=mpegts.js.map \ No newline at end of file diff --git a/trunk/research/players/js/mpegts.js.map b/trunk/research/players/js/mpegts.js.map index e9f04af034..e9a14f398b 100644 --- a/trunk/research/players/js/mpegts.js.map +++ b/trunk/research/players/js/mpegts.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://mpegts/webpack/universalModuleDefinition","webpack://mpegts/webpack/bootstrap","webpack://mpegts/./src/utils/logger.js","webpack://mpegts/./src/core/transmuxing-events.js","webpack://mpegts/./src/io/loader.js","webpack://mpegts/./src/utils/exception.js","webpack://mpegts/./src/utils/browser.js","webpack://mpegts/./src/demux/demux-errors.js","webpack://mpegts/./node_modules/events/events.js","webpack://mpegts/./src/core/media-segment-info.js","webpack://mpegts/./src/core/media-info.js","webpack://mpegts/./src/utils/logging-control.js","webpack://mpegts/./src/utils/utf8-conv.js","webpack://mpegts/./src/demux/amf-parser.js","webpack://mpegts/./src/demux/exp-golomb.js","webpack://mpegts/./src/demux/sps-parser.js","webpack://mpegts/./src/demux/h265-parser.js","webpack://mpegts/./src/utils/typedarray-equality.ts","webpack://mpegts/./src/demux/flv-demuxer.js","webpack://mpegts/./src/demux/pat-pmt-pes.ts","webpack://mpegts/./src/demux/base-demuxer.ts","webpack://mpegts/./src/demux/h264.ts","webpack://mpegts/./src/demux/mpeg4-audio.ts","webpack://mpegts/./src/demux/scte35.ts","webpack://mpegts/./src/demux/aac.ts","webpack://mpegts/./src/demux/pes-private-data.ts","webpack://mpegts/./src/demux/h265.ts","webpack://mpegts/./src/demux/smpte2038.ts","webpack://mpegts/./src/demux/mp3.ts","webpack://mpegts/./src/demux/ts-demuxer.ts","webpack://mpegts/./src/remux/mp4-generator.js","webpack://mpegts/./src/remux/aac-silent.js","webpack://mpegts/./src/remux/mp4-remuxer.js","webpack://mpegts/./src/core/transmuxing-controller.js","webpack://mpegts/./src/io/speed-sampler.js","webpack://mpegts/./src/io/fetch-stream-loader.js","webpack://mpegts/./src/io/xhr-moz-chunked-loader.js","webpack://mpegts/./src/io/xhr-range-loader.js","webpack://mpegts/./src/io/websocket-loader.js","webpack://mpegts/./src/io/range-seek-handler.js","webpack://mpegts/./src/io/param-seek-handler.js","webpack://mpegts/./src/io/io-controller.js","webpack://mpegts/./src/utils/polyfill.js","webpack://mpegts/./node_modules/webworkify-webpack/index.js","webpack://mpegts/./src/index.js","webpack://mpegts/./node_modules/es6-promise/dist/es6-promise.js","webpack://mpegts/./node_modules/process/browser.js","webpack://mpegts/(webpack)/buildin/global.js","webpack://mpegts/./src/core/transmuxing-worker.js","webpack://mpegts/./src/config.js","webpack://mpegts/./src/core/features.js","webpack://mpegts/./src/player/player-events.js","webpack://mpegts/./src/core/transmuxer.js","webpack://mpegts/./src/core/mse-events.js","webpack://mpegts/./src/core/mse-controller.js","webpack://mpegts/./src/player/player-errors.js","webpack://mpegts/./src/player/mse-player.js","webpack://mpegts/./src/player/native-player.js","webpack://mpegts/./src/mpegts.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","e","tag","msg","Log","FORCE_GLOBAL_TAG","GLOBAL_TAG","str","ENABLE_CALLBACK","emitter","emit","ENABLE_ERROR","console","error","warn","log","ENABLE_INFO","info","w","ENABLE_WARN","ENABLE_DEBUG","debug","v","ENABLE_VERBOSE","IO_ERROR","DEMUX_ERROR","INIT_SEGMENT","MEDIA_SEGMENT","LOADING_COMPLETE","RECOVERED_EARLY_EOF","MEDIA_INFO","METADATA_ARRIVED","SCRIPTDATA_ARRIVED","TIMED_ID3_METADATA_ARRIVED","SMPTE2038_METADATA_ARRIVED","SCTE35_METADATA_ARRIVED","PES_PRIVATE_DATA_DESCRIPTOR","PES_PRIVATE_DATA_ARRIVED","STATISTICS_INFO","RECOMMEND_SEEKPOINT","LoaderStatus","kIdle","kConnecting","kBuffering","kError","kComplete","LoaderErrors","OK","EXCEPTION","HTTP_STATUS_CODE_INVALID","CONNECTING_TIMEOUT","EARLY_EOF","UNRECOVERABLE_EARLY_EOF","typeName","this","_type","_status","_needStash","_onContentLengthKnown","_onURLRedirect","_onDataArrival","_onError","_onComplete","destroy","isWorking","callback","open","dataSource","range","abort","message","_message","toString","RuntimeException","Browser","ua","self","navigator","userAgent","toLowerCase","match","exec","indexOf","platform_match","matched","browser","version","majorVersion","platform","versionArray","split","major","parseInt","string","length","minor","build","chrome","opr","safari","webkit","rv","iemobile","edge","android","assign","detect","FORMAT_ERROR","FORMAT_UNSUPPORTED","CODEC_UNSUPPORTED","ReflectOwnKeys","R","Reflect","ReflectApply","apply","target","receiver","args","Function","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","concat","NumberIsNaN","Number","isNaN","EventEmitter","init","once","Promise","resolve","reject","errorListener","err","removeListener","resolver","slice","arguments","eventTargetAgnosticAddListener","handler","flags","on","addErrorHandlerIfEventEmitter","_events","undefined","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","TypeError","_getMaxListeners","that","_addListener","type","prepend","events","existing","warning","newListener","unshift","push","warned","Error","String","count","onceWrapper","fired","wrapFn","_onceWrap","state","wrapped","_listeners","unwrap","evlistener","arr","ret","Array","unwrapListeners","arrayClone","listenerCount","copy","addEventListener","wrapListener","arg","removeEventListener","set","RangeError","getPrototypeOf","setMaxListeners","getMaxListeners","doError","er","context","len","listeners","addListener","prependListener","prependOnceListener","list","position","originalListener","shift","index","pop","spliceOne","off","removeAllListeners","keys","rawListeners","eventNames","dts","pts","duration","originalDts","isSync","isSyncPoint","fileposition","beginDts","endDts","beginPts","endPts","originalBeginDts","originalEndDts","syncPoints","firstSample","lastSample","appendSyncPoint","sampleInfo","_list","clear","appendArray","getLastSyncPointBeforeDts","idx","last","mid","lbound","ubound","Math","floor","_lastAppendLocation","isEmpty","_searchNearestSegmentBefore","_searchNearestSegmentAfter","append","mediaSegmentInfo","msi","lastAppendIdx","insertIdx","splice","getLastSegmentBefore","getLastSampleBefore","segment","getLastSyncPointBefore","segmentIdx","mimeType","hasAudio","hasVideo","audioCodec","videoCodec","audioDataRate","videoDataRate","audioSampleRate","audioChannelCount","width","height","fps","profile","level","refFrames","chromaFormat","sarNum","sarDen","metadata","segments","segmentCount","hasKeyframesIndex","keyframesIndex","isComplete","audioInfoComplete","videoInfoComplete","isSeekable","getNearestKeyframe","milliseconds","table","keyframeIdx","_search","times","filepositions","enable","LoggingControl","_notifyChange","getConfig","globalTag","forceGlobalTag","enableVerbose","enableDebug","enableInfo","enableWarn","enableError","enableCallback","applyConfig","config","registerListener","addLogListener","removeLogListener","checkContinuation","uint8array","start","checkLength","array","buf","out","input","fromCharCode","ucs4","join","ArrayBuffer","DataView","setInt16","Int16Array","parseScriptData","arrayBuffer","dataOffset","dataSize","data","AMF","parseValue","size","parseObject","parseString","isObjectEnd","objectEnd","parseVariable","getUint16","Uint8Array","parseLongString","getUint32","parseDate","timestamp","getFloat64","localTimeOffset","getInt16","Date","offset","getUint8","amfstr","terminal","amfobj","amfvar","strictArrayLength","val","date","amfLongStr","TAG","_buffer","_buffer_index","_total_bytes","byteLength","_total_bits","_current_word","_current_word_bits_left","_fillCurrentWord","buffer_bytes_left","bytes_read","min","word","subarray","buffer","readBits","bits","result","bits_need_left","bits_read_next","result2","readBool","readByte","_skipLeadingZero","zero_count","readUEG","leading_zeros","readSEG","_ebsp2rbsp","src","src_length","dst","dst_idx","parseSPS","codec_array","codec_mimetype","j","h","rbsp","SPSParser","gb","profile_idc","level_idc","profile_string","getProfileString","level_string","getLevelString","chroma_format_idc","chroma_format","bit_depth_luma","bit_depth_chroma","scaling_list_count","_skipScalingList","pic_order_cnt_type","num_ref_frames_in_pic_order_cnt_cycle","ref_frames","pic_width_in_mbs_minus1","pic_height_in_map_units_minus1","frame_mbs_only_flag","frame_crop_left_offset","frame_crop_right_offset","frame_crop_top_offset","frame_crop_bottom_offset","sar_width","sar_height","fps_fixed","fps_num","fps_den","aspect_ratio_idc","num_units_in_tick","time_scale","sarScale","crop_unit_x","crop_unit_y","codec_width","codec_height","present_width","ceil","bit_depth","chroma_format_string","getChromaFormatString","frame_rate","fixed","sar_ratio","codec_size","present_size","last_scale","next_scale","toFixed","chroma","parseVPS","H265NaluParser","num_temporal_layers","temporal_id_nested","max_sub_layers_minus1","general_profile_space","general_tier_flag","general_profile_idc","general_profile_compatibility_flags_1","general_profile_compatibility_flags_2","general_profile_compatibility_flags_3","general_profile_compatibility_flags_4","general_constraint_indicator_flags_1","general_constraint_indicator_flags_2","general_constraint_indicator_flags_3","general_constraint_indicator_flags_4","general_constraint_indicator_flags_5","general_constraint_indicator_flags_6","general_level_idc","sub_layer_profile_present_flag","sub_layer_level_present_flag","pic_width_in_luma_samples","pic_height_in_luma_samples","bit_depth_luma_minus8","bit_depth_chroma_minus8","log2_max_pic_order_cnt_lsb_minus4","sizeId","matrixId","coefNum","num_short_term_ref_pic_sets","num_delta_pocs","inter_ref_pic_set_prediction_flag","next_num_delta_pocs","used_by_curr_pic_flag","use_delta_flag","num_negative_pics","num_positive_pics","num_long_term_ref_pics_sps","min_spatial_segmentation_idc","nal_hrd_parameters_present_flag","vcl_hrd_parameters_present_flag","sub_pic_hrd_params_present_flag","fixed_pic_rate_general_flag","fixed_pic_rate_within_cvs_flag","cpbCnt","low_delay_hrd_flag","sar_scale","constant_frame_rate","parsePPS","tiles_enabled_flag","entropy_coding_sync_enabled_flag","parallelismType","chroma_idc","isAligned16","a","byteOffset","isAligned32","compareArray","b","Uint32Array","equal32","Uint16Array","equal16","equal8","StreamType","probeData","_config","_onMediaInfo","_onMetaDataArrived","_onScriptDataArrived","_onTrackMetadata","_onDataAvailable","_dataOffset","_firstParse","_dispatch","_hasAudio","hasAudioTrack","_hasVideo","hasVideoTrack","_hasAudioFlagOverrided","_hasVideoFlagOverrided","_audioInitialMetadataDispatched","_videoInitialMetadataDispatched","_mediaInfo","_metadata","_audioMetadata","_videoMetadata","_naluLengthSize","_timestampBase","_timescale","_duration","_durationOverrided","_referenceFrameRate","_flvSoundRateTable","_mpegSamplingRates","_mpegAudioV10SampleRateTable","_mpegAudioV20SampleRateTable","_mpegAudioV25SampleRateTable","_mpegAudioL1BitRateTable","_mpegAudioL2BitRateTable","_mpegAudioL3BitRateTable","_videoTrack","id","sequenceNumber","samples","_audioTrack","_littleEndian","probe","needMoreData","mismatch","consumed","bindDataSource","loader","onDataArrival","parseChunks","base","resetMediaInfo","_isInitialMetadataDispatched","chunk","byteStart","le","FLVDemuxer","tagType","ts2","ts1","_parseAudioData","_parseVideoData","_parseScriptData","prevTagSize","scriptData","onMetaData","audiodatarate","videodatarate","framerate","keyframes","_parseKeyframesIndex","time","tagTimestamp","soundSpec","soundFormat","soundRate","soundRateIndex","soundType","meta","track","timescale","channelCount","aacData","_parseAACAudioData","packetType","misc","samplingRate","codec","originalCodec","refSampleDuration","mi","aacSample","unit","_parseMP3AudioData","bitRate","mp3Sample","_parseAACAudioSpecificConfig","originalAudioObjectType","samplingIndex","audioObjectType","extensionSamplingIndex","samplingFrequence","channelConfig","requestHeader","ver","layer","bitrate_index","sampling_freq_index","channel_count","sample_rate","bit_rate","tagPosition","spec","frameType","codecId","_parseAVCVideoPacket","_parseHEVCVideoPacket","cts","_parseAVCDecoderConfigurationRecord","_parseAVCVideoData","_parseHEVCDecoderConfigurationRecord","_parseHEVCVideoData","avcc","new_avcc","avcProfile","spsCount","sps","codecWidth","codecHeight","presentWidth","presentHeight","bitDepth","sarRatio","frameRate","codecArray","codecString","ppsCount","hvcc","new_hvcc","hevcProfile","numOfArrays","nalUnitType","numNalus","units","lengthSize","keyframe","naluSize","unitType","avcSample","isKeyframe","hevcSample","onError","onMediaInfo","onMetaDataArrived","onTrackMetadata","onDataAvailable","onTimedID3Metadata","onSMPTE2038Metadata","onSCTE35Metadata","onPESPrivateData","onPESPrivateDataDescriptor","program_pmt_pid","H264NaluType","pid_stream_type","common_pids","h264","h265","adts_aac","mp3","pes_private_data_pids","timed_id3_pids","scte_35_pids","smpte2038_pids","slices","total_length","expected_length","file_position","MPEG4AudioObjectTypes","MPEG4SamplingFrequencyIndex","nalu","nalu_size","setUint32","current_startcode_offset_","eof_flag_","data_","findNextStartCodeOffset","start_offset","uint32","uint24","readNextNaluPayload","nalu_payload","nalu_type","forbidden_bit","next_startcode_offset","kReserved0","payload_data","H264NaluPayload","pps","sps_details","need_extra_fields","sps_length","pps_length","getData","SCTE35CommandType","MPEG4SamplingFrequencies","current_syncword_offset_","findNextSyncwordOffset","syncword_offset","readNextAACFrame","aac_frame","ID","protection_absent","sampling_frequency_index","channel_configuration","aac_frame_length","has_last_incomplete_data","adts_header_length","adts_frame_payload_length","next_syncword_offset","frame_data","AACFrame","audio_object_type","sampling_frequency","channel_config","hasIncompleteData","getIncompleteData","frame","original_audio_object_type","sampling_index","extension_sampling_index","sampling_rate","original_codec_mimetype","H265NaluType","parseSpliceTime","reader","time_specified_flag","pts_time","parseBreakDuration","auto_return","parseSpliceInsertComponent","splice_immediate_flag","component_tag","splice_time","parseSpliceScheduleEventComponent","utc_splice_time","parseSpliceScheduleEvent","splice_event_id","splice_event_cancel_indicator","spliceScheduleEvent","out_of_network_indicator","program_splice_flag","duration_flag","component_count","components","break_duration","unique_program_id","avail_num","avails_expected","parseAvailDescriptor","descriptor_tag","descriptor_length","identifier","provider_avail_id","parseDTMFDescriptor","preroll","dtmf_count","DTMF_char","parseSegmentationDescriptorComponent","pts_offset","parseSegmentationDescriptor","segmentation_event_id","segmentation_event_cancel_indicator","segmentationDescriptor","program_segmentation_flag","segmentation_duration_flag","delivery_not_restricted_flag","web_delivery_allowed_flag","no_regional_blackout_flag","archive_allowed_flag","device_restrictions","segmentation_duration","segmentation_upid_type","segmentation_upid_length","upid","segmentation_upid","segmentation_type_id","segment_num","segments_expected","sub_segment_num","sub_segments_expected","parseTimeDescriptor","TAI_seconds","TAI_ns","UTC_offset","parseAudioDescriptorComponent","ISO_code","Bit_Stream_Mode","Num_Channels","Full_Srvc_Audio","parseAudioDescriptor","audio_count","readSCTE35","table_id","section_syntax_indicator","private_indicator","section_length","protocol_version","encrypted_packet","encryption_algorithm","pts_adjustment","cw_index","tier","splice_command_length","splice_command_type","splice_command","kSpliceNull","kSpliceSchedule","splice_count","parseSpliceSchedule","kSpliceInsert","spliceInsert","parseSpliceInsert","kTimeSignal","parseTimeSignal","kBandwidthReservation","kPrivateCommand","private_data","parsePrivateCommand","splice_descriptors","descriptor_loop_length","detail","E_CRC32","CRC32","duraiton","timeSignal","H265NaluPayload","vps","kSliceVPS","kSliceSPS","kSlicePPS","probe_data","first_parse_","media_info_","timescale_","duration_","current_pmt_pid_","program_pmt_map_","pes_slice_queues_","section_slice_queues_","video_metadata_","details","audio_metadata_","aac_last_sample_pts_","aac_last_incomplete_data_","has_video_","has_audio_","video_init_segment_dispatched_","audio_init_segment_dispatched_","video_metadata_changed_","audio_metadata_changed_","video_track_","audio_track_","ts_packet_size_","ts_packet_size","sync_offset_","sync_offset","config_","scan_window","byte_start","sync_byte","payload_unit_start_indicator","pid","adaptation_field_control","continuity_conunter","adaptation_field_info","ts_payload_start_index","adaptation_field_length","parseAdaptationField","pmt_","kSCTE35","ts_payload_length","handleSectionSlice","random_access_indicator","stream_type","handlePESSlice","dispatchAudioVideoMediaSegment","discontinuity_indicator","elementary_stream_priority_indicator","slice_queue","pointer_field","remain_section","emitSectionSlices","clearSlices","SliceQueue","packet_start_code_prefix","PES_packet_length","emitPESSlices","section_data","SectionData","parseSection","pes_data","PESData","parsePES","parsePAT","parsePMT","parseSCTE35","stream_id","PTS_DTS_flags","PES_header_data_length","payload_start_index","payload_length","payload","kMPEG1Audio","kMPEG2Audio","parseMP3Payload","kPESPrivateData","parseSMPTE2038MetadataPayload","parsePESPrivateDataPayload","kADTSAAC","parseAACPayload","kID3","parseTimedID3MetadataPayload","kH264","parseH264Payload","kH265","parseH265Payload","version_number","current_next_indicator","section_number","pat","PAT","pat_","program_bytes","first_program_number","first_pmt_pid","program_number","network_pid","JSON","stringify","current_program_","pmt","PMT","program_info_length","info_start_index","info_bytes","elementary_PID","ES_info_length","from","descriptors","dispatchPESPrivateDataDescriptor","scte35","pts_ms","nearest_pts","annexb_parser","nalu_avc1","H264NaluAVC1","detectVideoMetadataChange","dispatchVideoMediaSegment","dispatchVideoInitSegment","kSliceIDR","kSliceNonIDR","dts_ms","avc_sample","nalu_hvc1","H265NaluHVC1","kSliceIDR_W_RADL","kSliceIDR_N_LP","kSliceCRA_NUT","hvc_sample","new_sps","new_details","old_size","new_size","isInitSegmentDispatched","vps_without_header","sps_without_header","pps_without_header","HEVCDecoderConfigurationRecord","AVCDecoderConfigurationRecord","dispatchAudioMediaSegment","ref_sample_duration","base_pts_ms","new_pts_ms","abs","last_sample_pts_ms","adts_parser","sample_pts_ms","audio_sample","dispatchAudioInitSegment","detectAudioMetadataChange","sample_pts_ms_int","aac_sample","object_type","sample","MP3Data","mp3_sample","audio_specific_config","descriptor","desc","PESPrivateDataDescriptor","PESPrivateData","timed_id3_metadata","smpte2038_data","SMPTE2038Data","ancillaries","YC_indicator","line_number","horizontal_offset","data_ID","data_SDID","data_count","user_data","user_data_word","description","yc_indicator","did","sdid","information","smpte2038parse","MP4","types","avc1","avcC","btrt","dinf","dref","esds","ftyp","hdlr","hvc1","hvcC","mdat","mdhd","mdia","mfhd","minf","moof","moov","mp4a","mvex","mvhd","sdtp","stbl","stco","stsc","stsd","stsz","stts","tfdt","tfhd","traf","trak","trun","trex","tkhd","vmhd","smhd","charCodeAt","constants","FTYP","STSD_PREFIX","STTS","STSC","STCO","STSZ","HDLR_VIDEO","HDLR_AUDIO","DREF","SMHD","VMHD","box","datas","arrayCount","generateInitSegment","trackId","xmhd","startsWith","sampleRate","configSize","baseMediaDecodeTime","sampleCount","isLeading","dependsOn","isDependedOn","hasRedundancy","isNonSync","getSilentFrame","_isLive","isLive","_dtsBase","_dtsBaseInited","_audioDtsBase","Infinity","_videoDtsBase","_audioNextDts","_videoNextDts","_audioStashedLastSample","_videoStashedLastSample","_audioMeta","_videoMeta","_audioSegmentInfoList","_videoSegmentInfoList","_onInitSegment","_onMediaSegment","_forceFirstIDR","_fillSilentAfterSeek","msedge","msie","_mp3UseMpegAudio","firefox","_fillAudioTimestampGap","fixAudioTimestampGap","producer","remux","_onTrackMetadataReceived","insertDiscontinuity","seek","audioTrack","videoTrack","_calculateDtsBase","_remuxVideo","_remuxAudio","metabox","container","mediaDuration","getTimestampBase","flushStashedSamples","videoSample","audioSample","force","lastDts","dtsCorrection","firstDts","mpegRawTrack","firstSegmentAfterSeek","insertPrefixSilentFrame","mdatbox","mdatBytes","firstSampleOriginalDts","distance","firstSampleDts","videoSegment","silentUnit","silentFrameDuration","mp4Samples","needFillSilentFrames","silentFrames","sampleDuration","curRefDts","frameCount","round","intDts","intDuration","latest","moofbox","_mergeBoxes","timestampOffset","lastPts","firstPts","syncPoint","mediaDataSource","_emitter","filesize","url","cors","withCredentials","_mediaDataSource","_currentSegmentIndex","totalDuration","forEach","timestampBase","referrerPolicy","_demuxer","_remuxer","_ioctl","_pendingSeekTime","_pendingResolveSeekPoint","_statisticsReporter","_disableStatisticsReporter","event","_loadSegment","_enableStatisticsReporter","segmentIndex","optionalFrom","ioctl","_onIOException","onSeeked","_onIOSeeked","onComplete","_onIOComplete","onRedirect","_onIORedirect","onRecoveredEarlyEof","_onIORecoveredEarlyEof","_onInitChunkArrival","stop","_internalAbort","pause","resume","isPaused","targetSegmentIndex","_searchSegmentIndexContains","segmentInfo","targetSegmentInfo","_reportSegmentMediaInfo","_setupFLVDemuxerRemuxer","_setupTSDemuxerRemuxer","then","mds","overridedDuration","overridedHasAudio","overridedHasVideo","_onDemuxException","onScriptDataArrived","onInitSegment","_onRemuxerInitSegmentArrival","onMediaSegment","_onRemuxerMediaSegmentArrival","demuxer","_onTimedID3Metadata","_onSMPTE2038Metadata","_onSCTE35Metadata","_onPESPrivateDataDescriptor","_onPESPrivateData","mediaInfo","setPrototypeOf","timestamp_base","smpte2038_metadata","extraData","nextSegmentIndex","redirectedURL","code","initSegment","mediaSegment","seekpoint","setInterval","_reportStatisticsInfo","statisticsInfoReportInterval","clearInterval","exportInfo","currentURL","hasRedirect","currentRedirectedURL","speed","currentSpeed","loaderType","currentSegmentIndex","totalSegmentCount","_firstCheckpoint","_lastCheckpoint","_intervalBytes","_totalBytes","_lastSecondBytes","performance","now","_now","reset","addBytes","bytes","durationSeconds","currentKBps","seekHandler","_seekHandler","_requestAbort","_abortController","_contentLength","_receivedLength","isSupported","isWorkWellEdge","browserNotBlacklisted","fetch","ReadableStream","_dataSource","_range","sourceURL","reuseRedirectedURL","seekConfig","headers","Headers","configHeaders","params","method","cache","credentials","AbortController","signal","res","body","cancel","ok","status","removeURLParameters","lengthHeader","_pump","getReader","statusText","catch","aborted","read","done","_xhr","xhr","XMLHttpRequest","responseType","onreadystatechange","onprogress","onloadend","onerror","_requestURL","_onReadyStateChange","_onProgress","_onLoadEnd","_onXhrError","setRequestHeader","send","readyState","responseURL","total","response","loaded","constructor","_chunkSizeKBList","_currentChunkSizeKB","_currentSpeedNormalized","_zeroSpeedChunkCount","_speedSampler","_waitForTotalLength","_totalLengthReceived","_currentRequestURL","_currentRedirectedURL","_currentRequestRange","_totalLength","_lastTimeLoaded","onload","lastSecondKBps","useRefTotalLength","_openSubRange","_internalOpen","to","chunkSize","_onLoad","openNextRange","delta","_normalizeSpeed","KBps","normalized","reportComplete","_ws","WebSocket","ws","binaryType","onopen","_onWebSocketOpen","onclose","_onWebSocketClose","onmessage","_onWebSocketMessage","_onWebSocketError","close","_dispatchArrayBuffer","Blob","FileReader","readAsArrayBuffer","arraybuffer","zeroStart","_zeroStart","param","seekedURL","paramStart","paramEnd","_startName","_endName","baseUrl","needAnd","baseURL","queryIndex","substring","resultParams","pairs","pair","requireAnd","_extraData","_stashInitialSize","stashInitialSize","_stashUsed","_stashSize","_bufferSize","_stashBuffer","_stashByteStart","_enableStash","enableStashBuffer","_loader","_loaderClass","_isWebSocketURL","test","_refTotalLength","_fullRequestFlag","_currentRange","_redirectedURL","_speedNormalized","_speedNormalizeList","_isEarlyEofReconnecting","_paused","_resumeFrom","_onSeeked","_onRedirect","_onRecoveredEarlyEof","_selectSeekHandler","_selectLoader","_createLoader","seekType","rangeLoadZeroStart","seekParamStart","seekParamEnd","customSeekHandler","customLoader","needStashBuffer","onContentLengthKnown","onURLRedirect","_onLoaderChunkArrival","_onLoaderComplete","_onLoaderError","_internalSeek","dropUnconsumed","_flushStashBuffer","requestRange","updateUrl","_expandBuffer","expectedBytes","bufferNewSize","newBuffer","stashOldArray","_adjustStashSize","stashSizeKB","bufferSize","_dispatchChunks","chunks","contentLength","receivedLength","stashArray","remainArray","remain","nextFrom","install","obj","proto","__proto__","output","source","polyfill","Polyfill","webpackBootstrapFunc","configurable","oe","f","ENTRY_MODULE","default","quoteRegExp","replace","getModuleDependencies","sources","queueName","retval","fnString","wrapperSignature","webpackRequireName","re","RegExp","hasValuesInQueues","queues","reduce","hasValues","options","main","requiredModules","all","modulesQueue","seenModules","moduleToCheck","newModules","newModulesKeys","getRequiredModules","filter","entryModule","map","blob","bare","workerUrl","URL","webkitURL","mozURL","msURL","createObjectURL","worker","Worker","objectURL","isFunction","x","isArray","vertxNext","customSchedulerFn","asap","queue","flush","scheduleFlush","browserWindow","browserGlobal","BrowserMutationObserver","MutationObserver","WebKitMutationObserver","isNode","process","isWorker","Uint8ClampedArray","importScripts","MessageChannel","useSetTimeout","globalSetTimeout","setTimeout","channel","iterations","observer","node","onFulfillment","onRejection","parent","child","noop","PROMISE_ID","makePromise","_state","invokeCallback","_result","subscribe","resolve$1","promise","nextTick","document","createTextNode","observe","characterData","port1","port2","postMessage","vertx","require","runOnLoop","runOnContext","attemptVertx","random","handleMaybeThenable","maybeThenable","then$$1","thenable","fulfill","reason","handleOwnThenable","sealed","fulfillmentHandler","rejectionHandler","tryThen","_label","handleForeignThenable","publishRejection","_onerror","publish","_subscribers","subscribers","settled","hasCallback","succeeded","Enumerator","Constructor","_instanceConstructor","_remaining","_enumerate","_eachEntry","entry","resolve$$1","_then","didError","_settledAt","Promise$1","_willSettleAt","enumerator","needsResolver","initializePromise","needsNew","finally","entries","race","_","_setScheduler","scheduleFn","_setAsap","asapFn","_asap","local","global","P","promiseToString","cast","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","marker","runClearTimeout","Item","title","env","argv","versions","binding","cwd","chdir","dir","umask","g","controller","logcatListener","logcat","onLoadingComplete","onTimedID3MetadataArrived","onSMPTE2038MetadataArrived","onSCTE35MetadataArrived","onPESPrivateDataArrived","onStatisticsInfo","statInfo","onIOError","onDemuxError","onRecommendSeekpoint","cmd","defaultConfig","enableWorker","liveBufferLatencyChasing","liveBufferLatencyMaxLatency","liveBufferLatencyMinRemain","lazyLoad","lazyLoadMaxDuration","lazyLoadRecoverDuration","deferLoadAfterSourceOpen","autoCleanupMaxBackwardDuration","autoCleanupMinBackwardDuration","accurateSeek","createDefaultConfig","supportMSEH264Playback","MediaSource","isTypeSupported","supportMSEH265Playback","supportNetworkStreamIO","getNetworkLoaderTypeName","supportNativeMediaPlayback","Features","videoElement","createElement","canPlay","canPlayType","getFeatureList","features","msePlayback","mseLivePlayback","mseH265Playback","networkStreamIO","networkLoaderName","nativeMP4H264Playback","nativeMP4H265Playback","nativeWebmVP8Playback","nativeWebmVP9Playback","ERROR","_worker","_workerDestroying","_onWorkerMessage","onLoggingConfigChanged","_onLoggingConfigChanged","_controller","ctl","_onIOError","_onDemuxError","_onLoadingComplete","_onTimedID3MetadataArrived","_onSMPTE2038MetadataArrived","_onSCTE35MetadataArrived","_onPESPrivateDataArrived","_onStatisticsInfo","_onRecommendSeekpoint","hasWorker","statisticsInfo","terminate","SOURCE_OPEN","UPDATE_END","BUFFER_FULL","autoCleanupSourceBuffer","onSourceOpen","_onSourceOpen","onSourceEnded","_onSourceEnded","onSourceClose","_onSourceClose","onSourceBufferError","_onSourceBufferError","onSourceBufferUpdateEnd","_onSourceBufferUpdateEnd","_mediaSource","_mediaSourceObjectURL","_mediaElement","_isBufferFull","_hasPendingEos","_requireSetMediaDuration","_pendingMediaDuration","_pendingSourceBufferInit","_mimeTypes","video","audio","_sourceBuffers","_lastInitSegments","_pendingSegments","_pendingRemoveRanges","_idrList","detachMediaElement","attachMediaElement","mediaElement","ms","ps","sb","removeSourceBuffer","endOfStream","removeAttribute","revokeObjectURL","appendInitSegment","deferred","is","firstInitSegment","addSourceBuffer","updating","_doAppendSegments","_updateMediaSourceDuration","appendMediaSegment","_needCleanupSourceBuffer","_doCleanupSourceBuffer","_hasPendingRemoveRanges","seconds","buffered","end","_doRemoveRanges","lastInitSegment","_hasPendingSegments","currentTime","doRemove","removeEnd","current","ranges","remove","pendingSegments","currentOffset","targetOffset","appendBuffer","pendings","prr","ErrorTypes","NETWORK_ERROR","MEDIA_ERROR","OTHER_ERROR","ErrorDetails","NETWORK_EXCEPTION","NETWORK_STATUS_CODE_INVALID","NETWORK_TIMEOUT","NETWORK_UNRECOVERABLE_EARLY_EOF","MEDIA_MSE_ERROR","MEDIA_FORMAT_ERROR","MEDIA_FORMAT_UNSUPPORTED","MEDIA_CODEC_UNSUPPORTED","typeLowerCase","onvLoadedMetadata","_onvLoadedMetadata","onvSeeking","_onvSeeking","onvCanPlay","_onvCanPlay","onvStalled","_onvStalled","onvProgress","_onvProgress","_requestSetTime","_seekpointRecord","_progressChecker","_msectl","_transmuxer","_mseSourceOpened","_hasPendingLoad","_receivedCanPlay","_statisticsInfo","chromeNeedIDRFix","_alwaysSeekKeyframe","unload","_onmseUpdateEnd","_onmseBufferFull","load","_suspendTransmuxer","scte35_metadata","_fillStatisticsInfo","play","volume","muted","playerType","HTMLVideoElement","hasQualityInfo","decoded","dropped","getVideoPlaybackQuality","quality","totalVideoFrames","droppedVideoFrames","webkitDecodedFrameCount","webkitDroppedFrameCount","decodedFrames","droppedFrames","paused","buffered_end","target_time","currentRangeEnd","_checkProgressAndResume","needResume","_isTimepointBuffered","directSeek","directSeekBegin","directSeekBeginTime","videoBeginTime","idr","_checkAndApplyUnbufferedSeekpoint","recordTime","_checkAndResumeStuckPlayback","stalled","media","seekPoint","preload","HTMLAudioElement","videoWidth","videoHeight","mpegts","optionalConfig","BaseLoader","Events","MSEPlayer","NativePlayer"],"mappings":"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","file":"mpegts.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"mpegts\"] = factory();\n\telse\n\t\troot[\"mpegts\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 14);\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\n\nclass Log {\n\n static e(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'error', str);\n }\n\n if (!Log.ENABLE_ERROR) {\n return;\n }\n\n if (console.error) {\n console.error(str);\n } else if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static i(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'info', str);\n }\n\n if (!Log.ENABLE_INFO) {\n return;\n }\n\n if (console.info) {\n console.info(str);\n } else {\n console.log(str);\n }\n }\n\n static w(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'warn', str);\n }\n\n if (!Log.ENABLE_WARN) {\n return;\n }\n\n if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static d(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'debug', str);\n }\n\n if (!Log.ENABLE_DEBUG) {\n return;\n }\n\n if (console.debug) {\n console.debug(str);\n } else {\n console.log(str);\n }\n }\n\n static v(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'verbose', str);\n }\n\n if (!Log.ENABLE_VERBOSE) {\n return;\n }\n\n console.log(str);\n }\n\n}\n\nLog.GLOBAL_TAG = 'mpegts.js';\nLog.FORCE_GLOBAL_TAG = false;\nLog.ENABLE_ERROR = true;\nLog.ENABLE_INFO = true;\nLog.ENABLE_WARN = true;\nLog.ENABLE_DEBUG = true;\nLog.ENABLE_VERBOSE = true;\n\nLog.ENABLE_CALLBACK = false;\n\nLog.emitter = new EventEmitter();\n\nexport default Log;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst TransmuxingEvents = {\n IO_ERROR: 'io_error',\n DEMUX_ERROR: 'demux_error',\n INIT_SEGMENT: 'init_segment',\n MEDIA_SEGMENT: 'media_segment',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n METADATA_ARRIVED: 'metadata_arrived',\n SCRIPTDATA_ARRIVED: 'scriptdata_arrived',\n TIMED_ID3_METADATA_ARRIVED: 'timed_id3_metadata_arrived',\n SMPTE2038_METADATA_ARRIVED: 'smpte2038_metadata_arrived',\n SCTE35_METADATA_ARRIVED: 'scte35_metadata_arrived',\n PES_PRIVATE_DATA_DESCRIPTOR: 'pes_private_data_descriptor',\n PES_PRIVATE_DATA_ARRIVED: 'pes_private_data_arrived',\n STATISTICS_INFO: 'statistics_info',\n RECOMMEND_SEEKPOINT: 'recommend_seekpoint'\n};\n\nexport default TransmuxingEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {NotImplementedException} from '../utils/exception.js';\n\nexport const LoaderStatus = {\n kIdle: 0,\n kConnecting: 1,\n kBuffering: 2,\n kError: 3,\n kComplete: 4\n};\n\nexport const LoaderErrors = {\n OK: 'OK',\n EXCEPTION: 'Exception',\n HTTP_STATUS_CODE_INVALID: 'HttpStatusCodeInvalid',\n CONNECTING_TIMEOUT: 'ConnectingTimeout',\n EARLY_EOF: 'EarlyEof',\n UNRECOVERABLE_EARLY_EOF: 'UnrecoverableEarlyEof'\n};\n\n/* Loader has callbacks which have following prototypes:\n * function onContentLengthKnown(contentLength: number): void\n * function onURLRedirect(url: string): void\n * function onDataArrival(chunk: ArrayBuffer, byteStart: number, receivedLength: number): void\n * function onError(errorType: number, errorInfo: {code: number, msg: string}): void\n * function onComplete(rangeFrom: number, rangeTo: number): void\n */\nexport class BaseLoader {\n\n constructor(typeName) {\n this._type = typeName || 'undefined';\n this._status = LoaderStatus.kIdle;\n this._needStash = false;\n // callbacks\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n destroy() {\n this._status = LoaderStatus.kIdle;\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n isWorking() {\n return this._status === LoaderStatus.kConnecting || this._status === LoaderStatus.kBuffering;\n }\n\n get type() {\n return this._type;\n }\n\n get status() {\n return this._status;\n }\n\n get needStashBuffer() {\n return this._needStash;\n }\n\n get onContentLengthKnown() {\n return this._onContentLengthKnown;\n }\n\n set onContentLengthKnown(callback) {\n this._onContentLengthKnown = callback;\n }\n\n get onURLRedirect() {\n return this._onURLRedirect;\n }\n\n set onURLRedirect(callback) {\n this._onURLRedirect = callback;\n }\n\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n // pure virtual\n open(dataSource, range) {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n abort() {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class RuntimeException {\n\n constructor(message) {\n this._message = message;\n }\n\n get name() {\n return 'RuntimeException';\n }\n\n get message() {\n return this._message;\n }\n\n toString() {\n return this.name + ': ' + this.message;\n }\n\n}\n\nexport class IllegalStateException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'IllegalStateException';\n }\n\n}\n\nexport class InvalidArgumentException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'InvalidArgumentException';\n }\n\n}\n\nexport class NotImplementedException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'NotImplementedException';\n }\n\n}\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nlet Browser = {};\n\nfunction detect() {\n // modified from jquery-browser-plugin\n\n let ua = self.navigator.userAgent.toLowerCase();\n\n let match = /(edge)\\/([\\w.]+)/.exec(ua) ||\n /(opr)[\\/]([\\w.]+)/.exec(ua) ||\n /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\n /(iemobile)[\\/]([\\w.]+)/.exec(ua) ||\n /(version)(applewebkit)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+).*(version)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\n /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\n /(msie) ([\\w.]+)/.exec(ua) ||\n ua.indexOf('trident') >= 0 && /(rv)(?::| )([\\w.]+)/.exec(ua) ||\n ua.indexOf('compatible') < 0 && /(firefox)[ \\/]([\\w.]+)/.exec(ua) ||\n [];\n\n let platform_match = /(ipad)/.exec(ua) ||\n /(ipod)/.exec(ua) ||\n /(windows phone)/.exec(ua) ||\n /(iphone)/.exec(ua) ||\n /(kindle)/.exec(ua) ||\n /(android)/.exec(ua) ||\n /(windows)/.exec(ua) ||\n /(mac)/.exec(ua) ||\n /(linux)/.exec(ua) ||\n /(cros)/.exec(ua) ||\n [];\n\n let matched = {\n browser: match[5] || match[3] || match[1] || '',\n version: match[2] || match[4] || '0',\n majorVersion: match[4] || match[2] || '0',\n platform: platform_match[0] || ''\n };\n\n let browser = {};\n if (matched.browser) {\n browser[matched.browser] = true;\n\n let versionArray = matched.majorVersion.split('.');\n browser.version = {\n major: parseInt(matched.majorVersion, 10),\n string: matched.version\n };\n if (versionArray.length > 1) {\n browser.version.minor = parseInt(versionArray[1], 10);\n }\n if (versionArray.length > 2) {\n browser.version.build = parseInt(versionArray[2], 10);\n }\n }\n\n if (matched.platform) {\n browser[matched.platform] = true;\n }\n\n if (browser.chrome || browser.opr || browser.safari) {\n browser.webkit = true;\n }\n\n // MSIE. IE11 has 'rv' identifer\n if (browser.rv || browser.iemobile) {\n if (browser.rv) {\n delete browser.rv;\n }\n let msie = 'msie';\n matched.browser = msie;\n browser[msie] = true;\n }\n\n // Microsoft Edge\n if (browser.edge) {\n delete browser.edge;\n let msedge = 'msedge';\n matched.browser = msedge;\n browser[msedge] = true;\n }\n\n // Opera 15+\n if (browser.opr) {\n let opera = 'opera';\n matched.browser = opera;\n browser[opera] = true;\n }\n\n // Stock android browsers are marked as Safari\n if (browser.safari && browser.android) {\n let android = 'android';\n matched.browser = android;\n browser[android] = true;\n }\n\n browser.name = matched.browser;\n browser.platform = matched.platform;\n\n for (let key in Browser) {\n if (Browser.hasOwnProperty(key)) {\n delete Browser[key];\n }\n }\n Object.assign(Browser, browser);\n}\n\ndetect();\n\nexport default Browser;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DemuxErrors = {\n OK: 'OK',\n FORMAT_ERROR: 'FormatError',\n FORMAT_UNSUPPORTED: 'FormatUnsupported',\n CODEC_UNSUPPORTED: 'CodecUnsupported'\n};\n\nexport default DemuxErrors;","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Represents an media sample (audio / video)\nexport class SampleInfo {\n\n constructor(dts, pts, duration, originalDts, isSync) {\n this.dts = dts;\n this.pts = pts;\n this.duration = duration;\n this.originalDts = originalDts;\n this.isSyncPoint = isSync;\n this.fileposition = null;\n }\n\n}\n\n// Media Segment concept is defined in Media Source Extensions spec.\n// Particularly in ISO BMFF format, an Media Segment contains a moof box followed by a mdat box.\nexport class MediaSegmentInfo {\n\n constructor() {\n this.beginDts = 0;\n this.endDts = 0;\n this.beginPts = 0;\n this.endPts = 0;\n this.originalBeginDts = 0;\n this.originalEndDts = 0;\n this.syncPoints = []; // SampleInfo[n], for video IDR frames only\n this.firstSample = null; // SampleInfo\n this.lastSample = null; // SampleInfo\n }\n\n appendSyncPoint(sampleInfo) { // also called Random Access Point\n sampleInfo.isSyncPoint = true;\n this.syncPoints.push(sampleInfo);\n }\n\n}\n\n// Ordered list for recording video IDR frames, sorted by originalDts\nexport class IDRSampleList {\n\n constructor() {\n this._list = [];\n }\n\n clear() {\n this._list = [];\n }\n\n appendArray(syncPoints) {\n let list = this._list;\n\n if (syncPoints.length === 0) {\n return;\n }\n\n if (list.length > 0 && syncPoints[0].originalDts < list[list.length - 1].originalDts) {\n this.clear();\n }\n\n Array.prototype.push.apply(list, syncPoints);\n }\n\n getLastSyncPointBeforeDts(dts) {\n if (this._list.length == 0) {\n return null;\n }\n\n let list = this._list;\n let idx = 0;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (dts < list[0].dts) {\n idx = 0;\n lbound = ubound + 1;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (dts >= list[mid].dts && dts < list[mid + 1].dts)) {\n idx = mid;\n break;\n } else if (list[mid].dts < dts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return this._list[idx];\n }\n\n}\n\n// Data structure for recording information of media segments in single track.\nexport class MediaSegmentInfoList {\n\n constructor(type) {\n this._type = type;\n this._list = [];\n this._lastAppendLocation = -1; // cached last insert location\n }\n\n get type() {\n return this._type;\n }\n\n get length() {\n return this._list.length;\n }\n\n isEmpty() {\n return this._list.length === 0;\n }\n\n clear() {\n this._list = [];\n this._lastAppendLocation = -1;\n }\n\n _searchNearestSegmentBefore(originalBeginDts) {\n let list = this._list;\n if (list.length === 0) {\n return -2;\n }\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n let idx = 0;\n\n if (originalBeginDts < list[0].originalBeginDts) {\n idx = -1;\n return idx;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (originalBeginDts > list[mid].lastSample.originalDts &&\n (originalBeginDts < list[mid + 1].originalBeginDts))) {\n idx = mid;\n break;\n } else if (list[mid].originalBeginDts < originalBeginDts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return idx;\n }\n\n _searchNearestSegmentAfter(originalBeginDts) {\n return this._searchNearestSegmentBefore(originalBeginDts) + 1;\n }\n\n append(mediaSegmentInfo) {\n let list = this._list;\n let msi = mediaSegmentInfo;\n let lastAppendIdx = this._lastAppendLocation;\n let insertIdx = 0;\n\n if (lastAppendIdx !== -1 && lastAppendIdx < list.length &&\n msi.originalBeginDts >= list[lastAppendIdx].lastSample.originalDts &&\n ((lastAppendIdx === list.length - 1) ||\n (lastAppendIdx < list.length - 1 &&\n msi.originalBeginDts < list[lastAppendIdx + 1].originalBeginDts))) {\n insertIdx = lastAppendIdx + 1; // use cached location idx\n } else {\n if (list.length > 0) {\n insertIdx = this._searchNearestSegmentBefore(msi.originalBeginDts) + 1;\n }\n }\n\n this._lastAppendLocation = insertIdx;\n this._list.splice(insertIdx, 0, msi);\n }\n\n getLastSegmentBefore(originalBeginDts) {\n let idx = this._searchNearestSegmentBefore(originalBeginDts);\n if (idx >= 0) {\n return this._list[idx];\n } else { // -1\n return null;\n }\n }\n\n getLastSampleBefore(originalBeginDts) {\n let segment = this.getLastSegmentBefore(originalBeginDts);\n if (segment != null) {\n return segment.lastSample;\n } else {\n return null;\n }\n }\n\n getLastSyncPointBefore(originalBeginDts) {\n let segmentIdx = this._searchNearestSegmentBefore(originalBeginDts);\n let syncPoints = this._list[segmentIdx].syncPoints;\n while (syncPoints.length === 0 && segmentIdx > 0) {\n segmentIdx--;\n syncPoints = this._list[segmentIdx].syncPoints;\n }\n if (syncPoints.length > 0) {\n return syncPoints[syncPoints.length - 1];\n } else {\n return null;\n }\n }\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass MediaInfo {\n\n constructor() {\n this.mimeType = null;\n this.duration = null;\n\n this.hasAudio = null;\n this.hasVideo = null;\n this.audioCodec = null;\n this.videoCodec = null;\n this.audioDataRate = null;\n this.videoDataRate = null;\n\n this.audioSampleRate = null;\n this.audioChannelCount = null;\n\n this.width = null;\n this.height = null;\n this.fps = null;\n this.profile = null;\n this.level = null;\n this.refFrames = null;\n this.chromaFormat = null;\n this.sarNum = null;\n this.sarDen = null;\n\n this.metadata = null;\n this.segments = null; // MediaInfo[]\n this.segmentCount = null;\n this.hasKeyframesIndex = null;\n this.keyframesIndex = null;\n }\n\n isComplete() {\n let audioInfoComplete = (this.hasAudio === false) ||\n (this.hasAudio === true &&\n this.audioCodec != null &&\n this.audioSampleRate != null &&\n this.audioChannelCount != null);\n\n let videoInfoComplete = (this.hasVideo === false) ||\n (this.hasVideo === true &&\n this.videoCodec != null &&\n this.width != null &&\n this.height != null &&\n this.fps != null &&\n this.profile != null &&\n this.level != null &&\n this.refFrames != null &&\n this.chromaFormat != null &&\n this.sarNum != null &&\n this.sarDen != null);\n\n // keyframesIndex may not be present\n return this.mimeType != null &&\n audioInfoComplete &&\n videoInfoComplete;\n }\n\n isSeekable() {\n return this.hasKeyframesIndex === true;\n }\n\n getNearestKeyframe(milliseconds) {\n if (this.keyframesIndex == null) {\n return null;\n }\n\n let table = this.keyframesIndex;\n let keyframeIdx = this._search(table.times, milliseconds);\n\n return {\n index: keyframeIdx,\n milliseconds: table.times[keyframeIdx],\n fileposition: table.filepositions[keyframeIdx]\n };\n }\n\n _search(list, value) {\n let idx = 0;\n\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (value < list[0]) {\n idx = 0;\n lbound = ubound + 1; // skip search\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (value >= list[mid] && value < list[mid + 1])) {\n idx = mid;\n break;\n } else if (list[mid] < value) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n\n return idx;\n }\n\n}\n\nexport default MediaInfo;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from './logger.js';\n\nclass LoggingControl {\n\n static get forceGlobalTag() {\n return Log.FORCE_GLOBAL_TAG;\n }\n\n static set forceGlobalTag(enable) {\n Log.FORCE_GLOBAL_TAG = enable;\n LoggingControl._notifyChange();\n }\n\n static get globalTag() {\n return Log.GLOBAL_TAG;\n }\n\n static set globalTag(tag) {\n Log.GLOBAL_TAG = tag;\n LoggingControl._notifyChange();\n }\n\n static get enableAll() {\n return Log.ENABLE_VERBOSE\n && Log.ENABLE_DEBUG\n && Log.ENABLE_INFO\n && Log.ENABLE_WARN\n && Log.ENABLE_ERROR;\n }\n\n static set enableAll(enable) {\n Log.ENABLE_VERBOSE = enable;\n Log.ENABLE_DEBUG = enable;\n Log.ENABLE_INFO = enable;\n Log.ENABLE_WARN = enable;\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableDebug() {\n return Log.ENABLE_DEBUG;\n }\n\n static set enableDebug(enable) {\n Log.ENABLE_DEBUG = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableVerbose() {\n return Log.ENABLE_VERBOSE;\n }\n\n static set enableVerbose(enable) {\n Log.ENABLE_VERBOSE = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableInfo() {\n return Log.ENABLE_INFO;\n }\n\n static set enableInfo(enable) {\n Log.ENABLE_INFO = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableWarn() {\n return Log.ENABLE_WARN;\n }\n\n static set enableWarn(enable) {\n Log.ENABLE_WARN = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableError() {\n return Log.ENABLE_ERROR;\n }\n\n static set enableError(enable) {\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static getConfig() {\n return {\n globalTag: Log.GLOBAL_TAG,\n forceGlobalTag: Log.FORCE_GLOBAL_TAG,\n enableVerbose: Log.ENABLE_VERBOSE,\n enableDebug: Log.ENABLE_DEBUG,\n enableInfo: Log.ENABLE_INFO,\n enableWarn: Log.ENABLE_WARN,\n enableError: Log.ENABLE_ERROR,\n enableCallback: Log.ENABLE_CALLBACK\n };\n }\n\n static applyConfig(config) {\n Log.GLOBAL_TAG = config.globalTag;\n Log.FORCE_GLOBAL_TAG = config.forceGlobalTag;\n Log.ENABLE_VERBOSE = config.enableVerbose;\n Log.ENABLE_DEBUG = config.enableDebug;\n Log.ENABLE_INFO = config.enableInfo;\n Log.ENABLE_WARN = config.enableWarn;\n Log.ENABLE_ERROR = config.enableError;\n Log.ENABLE_CALLBACK = config.enableCallback;\n }\n\n static _notifyChange() {\n let emitter = LoggingControl.emitter;\n\n if (emitter.listenerCount('change') > 0) {\n let config = LoggingControl.getConfig();\n emitter.emit('change', config);\n }\n }\n\n static registerListener(listener) {\n LoggingControl.emitter.addListener('change', listener);\n }\n\n static removeListener(listener) {\n LoggingControl.emitter.removeListener('change', listener);\n }\n\n static addLogListener(listener) {\n Log.emitter.addListener('log', listener);\n if (Log.emitter.listenerCount('log') > 0) {\n Log.ENABLE_CALLBACK = true;\n LoggingControl._notifyChange();\n }\n }\n\n static removeLogListener(listener) {\n Log.emitter.removeListener('log', listener);\n if (Log.emitter.listenerCount('log') === 0) {\n Log.ENABLE_CALLBACK = false;\n LoggingControl._notifyChange();\n }\n }\n\n}\n\nLoggingControl.emitter = new EventEmitter();\n\nexport default LoggingControl;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from C++ project libWinTF8 (https://github.com/m13253/libWinTF8)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction checkContinuation(uint8array, start, checkLength) {\n let array = uint8array;\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80)\n return false;\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction decodeUTF8(uint8array) {\n let out = [];\n let input = uint8array;\n let i = 0;\n let length = uint8array.length;\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]));\n ++i;\n continue;\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (checkContinuation(input, i, 1)) {\n let ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F);\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 2;\n continue;\n }\n }\n } else if (input[i] < 0xF0) {\n if (checkContinuation(input, i, 2)) {\n let ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F;\n if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 3;\n continue;\n }\n }\n } else if (input[i] < 0xF8) {\n if (checkContinuation(input, i, 3)) {\n let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12\n | (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F);\n if (ucs4 > 0x10000 && ucs4 < 0x110000) {\n ucs4 -= 0x10000;\n out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800));\n out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00));\n i += 4;\n continue;\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD));\n ++i;\n }\n\n return out.join('');\n}\n\nexport default decodeUTF8;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport decodeUTF8 from '../utils/utf8-conv.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\nlet le = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n})();\n\nclass AMF {\n\n static parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let data = {};\n\n try {\n let name = AMF.parseValue(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n\n data[name.data] = value.data;\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return data;\n }\n\n static parseObject(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 3) {\n throw new IllegalStateException('Data not enough when parse ScriptDataObject');\n }\n let name = AMF.parseString(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n let isObjectEnd = value.objectEnd;\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n objectEnd: isObjectEnd\n };\n }\n\n static parseVariable(arrayBuffer, dataOffset, dataSize) {\n return AMF.parseObject(arrayBuffer, dataOffset, dataSize);\n }\n\n static parseString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 2) {\n throw new IllegalStateException('Data not enough when parse String');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint16(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 2, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 2 + length\n };\n }\n\n static parseLongString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 4) {\n throw new IllegalStateException('Data not enough when parse LongString');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint32(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 4, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 4 + length\n };\n }\n\n static parseDate(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 10) {\n throw new IllegalStateException('Data size invalid when parse Date');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let timestamp = v.getFloat64(0, !le);\n let localTimeOffset = v.getInt16(8, !le);\n timestamp += localTimeOffset * 60 * 1000; // get UTC time\n\n return {\n data: new Date(timestamp),\n size: 8 + 2\n };\n }\n\n static parseValue(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 1) {\n throw new IllegalStateException('Data not enough when parse Value');\n }\n\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let offset = 1;\n let type = v.getUint8(0);\n let value;\n let objectEnd = false;\n\n try {\n switch (type) {\n case 0: // Number(Double) type\n value = v.getFloat64(1, !le);\n offset += 8;\n break;\n case 1: { // Boolean type\n let b = v.getUint8(1);\n value = b ? true : false;\n offset += 1;\n break;\n }\n case 2: { // String type\n let amfstr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfstr.data;\n offset += amfstr.size;\n break;\n }\n case 3: { // Object(s) type\n value = {};\n let terminal = 0; // workaround for malformed Objects which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n let amfobj = AMF.parseObject(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfobj.objectEnd)\n break;\n value[amfobj.data.name] = amfobj.data.value;\n offset += amfobj.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 8: { // ECMA array type (Mixed array)\n value = {};\n offset += 4; // ECMAArrayLength(UI32)\n let terminal = 0; // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n let amfvar = AMF.parseVariable(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfvar.objectEnd)\n break;\n value[amfvar.data.name] = amfvar.data.value;\n offset += amfvar.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 9: // ScriptDataObjectEnd\n value = undefined;\n offset = 1;\n objectEnd = true;\n break;\n case 10: { // Strict array type\n // ScriptDataValue[n]. NOTE: according to video_file_format_spec_v10_1.pdf\n value = [];\n let strictArrayLength = v.getUint32(1, !le);\n offset += 4;\n for (let i = 0; i < strictArrayLength; i++) {\n let val = AMF.parseValue(arrayBuffer, dataOffset + offset, dataSize - offset);\n value.push(val.data);\n offset += val.size;\n }\n break;\n }\n case 11: { // Date type\n let date = AMF.parseDate(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = date.data;\n offset += date.size;\n break;\n }\n case 12: { // Long string type\n let amfLongStr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfLongStr.data;\n offset += amfLongStr.size;\n break;\n }\n default:\n // ignore and skip\n offset = dataSize;\n Log.w('AMF', 'Unsupported AMF value type ' + type);\n }\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return {\n data: value,\n size: offset,\n objectEnd: objectEnd\n };\n }\n\n}\n\nexport default AMF;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n// Exponential-Golomb buffer decoder\nclass ExpGolomb {\n\n constructor(uint8array) {\n this.TAG = 'ExpGolomb';\n\n this._buffer = uint8array;\n this._buffer_index = 0;\n this._total_bytes = uint8array.byteLength;\n this._total_bits = uint8array.byteLength * 8;\n this._current_word = 0;\n this._current_word_bits_left = 0;\n }\n\n destroy() {\n this._buffer = null;\n }\n\n _fillCurrentWord() {\n let buffer_bytes_left = this._total_bytes - this._buffer_index;\n if (buffer_bytes_left <= 0)\n throw new IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available');\n\n let bytes_read = Math.min(4, buffer_bytes_left);\n let word = new Uint8Array(4);\n word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));\n this._current_word = new DataView(word.buffer).getUint32(0, false);\n\n this._buffer_index += bytes_read;\n this._current_word_bits_left = bytes_read * 8;\n }\n\n readBits(bits) {\n if (bits > 32)\n throw new InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!');\n\n if (bits <= this._current_word_bits_left) {\n let result = this._current_word >>> (32 - bits);\n this._current_word <<= bits;\n this._current_word_bits_left -= bits;\n return result;\n }\n\n let result = this._current_word_bits_left ? this._current_word : 0;\n result = result >>> (32 - this._current_word_bits_left);\n let bits_need_left = bits - this._current_word_bits_left;\n\n this._fillCurrentWord();\n let bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);\n\n let result2 = this._current_word >>> (32 - bits_read_next);\n this._current_word <<= bits_read_next;\n this._current_word_bits_left -= bits_read_next;\n\n result = (result << bits_read_next) | result2;\n return result;\n }\n\n readBool() {\n return this.readBits(1) === 1;\n }\n\n readByte() {\n return this.readBits(8);\n }\n\n _skipLeadingZero() {\n let zero_count;\n for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {\n if (0 !== (this._current_word & (0x80000000 >>> zero_count))) {\n this._current_word <<= zero_count;\n this._current_word_bits_left -= zero_count;\n return zero_count;\n }\n }\n this._fillCurrentWord();\n return zero_count + this._skipLeadingZero();\n }\n\n readUEG() { // unsigned exponential golomb\n let leading_zeros = this._skipLeadingZero();\n return this.readBits(leading_zeros + 1) - 1;\n }\n\n readSEG() { // signed exponential golomb\n let value = this.readUEG();\n if (value & 0x01) {\n return (value + 1) >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n\n}\n\nexport default ExpGolomb;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExpGolomb from './exp-golomb.js';\n\nclass SPSParser {\n\n static _ebsp2rbsp(uint8array) {\n let src = uint8array;\n let src_length = src.byteLength;\n let dst = new Uint8Array(src_length);\n let dst_idx = 0;\n\n for (let i = 0; i < src_length; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dst_idx] = src[i];\n dst_idx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dst_idx);\n }\n\n static parseSPS(uint8array) {\n let codec_array = uint8array.subarray(1, 4);\n let codec_mimetype = 'avc1.';\n for (let j = 0; j < 3; j++) {\n let h = codec_array[j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codec_mimetype += h;\n }\n\n let rbsp = SPSParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n gb.readByte();\n let profile_idc = gb.readByte(); // profile_idc\n gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]\n let level_idc = gb.readByte(); // level_idc\n gb.readUEG(); // seq_parameter_set_id\n\n let profile_string = SPSParser.getProfileString(profile_idc);\n let level_string = SPSParser.getLevelString(level_idc);\n let chroma_format_idc = 1;\n let chroma_format = 420;\n let chroma_format_table = [0, 420, 422, 444];\n let bit_depth_luma = 8;\n let bit_depth_chroma = 8;\n\n if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 ||\n profile_idc === 244 || profile_idc === 44 || profile_idc === 83 ||\n profile_idc === 86 || profile_idc === 118 || profile_idc === 128 ||\n profile_idc === 138 || profile_idc === 144) {\n\n chroma_format_idc = gb.readUEG();\n if (chroma_format_idc === 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n if (chroma_format_idc <= 3) {\n chroma_format = chroma_format_table[chroma_format_idc];\n }\n\n bit_depth_luma = gb.readUEG() + 8; // bit_depth_luma_minus8\n bit_depth_chroma = gb.readUEG() + 8; // bit_depth_chroma_minus8\n gb.readBits(1); // qpprime_y_zero_transform_bypass_flag\n if (gb.readBool()) { // seq_scaling_matrix_present_flag\n let scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12;\n for (let i = 0; i < scaling_list_count; i++) {\n if (gb.readBool()) { // seq_scaling_list_present_flag\n if (i < 6) {\n SPSParser._skipScalingList(gb, 16);\n } else {\n SPSParser._skipScalingList(gb, 64);\n }\n }\n }\n }\n }\n gb.readUEG(); // log2_max_frame_num_minus4\n let pic_order_cnt_type = gb.readUEG();\n if (pic_order_cnt_type === 0) {\n gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4\n } else if (pic_order_cnt_type === 1) {\n gb.readBits(1); // delta_pic_order_always_zero_flag\n gb.readSEG(); // offset_for_non_ref_pic\n gb.readSEG(); // offset_for_top_to_bottom_field\n let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();\n for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {\n gb.readSEG(); // offset_for_ref_frame\n }\n }\n let ref_frames = gb.readUEG(); // max_num_ref_frames\n gb.readBits(1); // gaps_in_frame_num_value_allowed_flag\n\n let pic_width_in_mbs_minus1 = gb.readUEG();\n let pic_height_in_map_units_minus1 = gb.readUEG();\n\n let frame_mbs_only_flag = gb.readBits(1);\n if (frame_mbs_only_flag === 0) {\n gb.readBits(1); // mb_adaptive_frame_field_flag\n }\n gb.readBits(1); // direct_8x8_inference_flag\n\n let frame_crop_left_offset = 0;\n let frame_crop_right_offset = 0;\n let frame_crop_top_offset = 0;\n let frame_crop_bottom_offset = 0;\n\n let frame_cropping_flag = gb.readBool();\n if (frame_cropping_flag) {\n frame_crop_left_offset = gb.readUEG();\n frame_crop_right_offset = gb.readUEG();\n frame_crop_top_offset = gb.readUEG();\n frame_crop_bottom_offset = gb.readUEG();\n }\n\n let sar_width = 1, sar_height = 1;\n let fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0;\n\n let vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n if (gb.readBool()) { // aspect_ratio_info_present_flag\n let aspect_ratio_idc = gb.readByte();\n let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n sar_width = sar_w_table[aspect_ratio_idc - 1];\n sar_height = sar_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n sar_width = gb.readByte() << 8 | gb.readByte();\n sar_height = gb.readByte() << 8 | gb.readByte();\n }\n }\n\n if (gb.readBool()) { // overscan_info_present_flag\n gb.readBool(); // overscan_appropriate_flag\n }\n if (gb.readBool()) { // video_signal_type_present_flag\n gb.readBits(4); // video_format & video_full_range_flag\n if (gb.readBool()) { // colour_description_present_flag\n gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients\n }\n }\n if (gb.readBool()) { // chroma_loc_info_present_flag\n gb.readUEG(); // chroma_sample_loc_type_top_field\n gb.readUEG(); // chroma_sample_loc_type_bottom_field\n }\n if (gb.readBool()) { // timing_info_present_flag\n let num_units_in_tick = gb.readBits(32);\n let time_scale = gb.readBits(32);\n fps_fixed = gb.readBool(); // fixed_frame_rate_flag\n\n fps_num = time_scale;\n fps_den = num_units_in_tick * 2;\n fps = fps_num / fps_den;\n }\n }\n\n let sarScale = 1;\n if (sar_width !== 1 || sar_height !== 1) {\n sarScale = sar_width / sar_height;\n }\n\n let crop_unit_x = 0, crop_unit_y = 0;\n if (chroma_format_idc === 0) {\n crop_unit_x = 1;\n crop_unit_y = 2 - frame_mbs_only_flag;\n } else {\n let sub_wc = (chroma_format_idc === 3) ? 1 : 2;\n let sub_hc = (chroma_format_idc === 1) ? 2 : 1;\n crop_unit_x = sub_wc;\n crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);\n }\n\n let codec_width = (pic_width_in_mbs_minus1 + 1) * 16;\n let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);\n\n codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;\n codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;\n\n let present_width = Math.ceil(codec_width * sarScale);\n\n gb.destroy();\n gb = null;\n\n return {\n codec_mimetype,\n profile_idc,\n level_idc,\n profile_string, // baseline, high, high10, ...\n level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...\n chroma_format_idc,\n bit_depth: bit_depth_luma, // 8bit, 10bit, ...\n bit_depth_luma,\n bit_depth_chroma,\n ref_frames,\n chroma_format, // 4:2:0, 4:2:2, ...\n chroma_format_string: SPSParser.getChromaFormatString(chroma_format),\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps,\n fps_den: fps_den,\n fps_num: fps_num\n },\n\n sar_ratio: {\n width: sar_width,\n height: sar_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: present_width,\n height: codec_height\n }\n };\n }\n\n static _skipScalingList(gb, count) {\n let last_scale = 8, next_scale = 8;\n let delta_scale = 0;\n for (let i = 0; i < count; i++) {\n if (next_scale !== 0) {\n delta_scale = gb.readSEG();\n next_scale = (last_scale + delta_scale + 256) % 256;\n }\n last_scale = (next_scale === 0) ? last_scale : next_scale;\n }\n }\n\n static getProfileString(profile_idc) {\n switch (profile_idc) {\n case 66:\n return 'Baseline';\n case 77:\n return 'Main';\n case 88:\n return 'Extended';\n case 100:\n return 'High';\n case 110:\n return 'High10';\n case 122:\n return 'High422';\n case 244:\n return 'High444';\n default:\n return 'Unknown';\n }\n }\n\n static getLevelString(level_idc) {\n return (level_idc / 10).toFixed(1);\n }\n\n static getChromaFormatString(chroma) {\n switch (chroma) {\n case 420:\n return '4:2:0';\n case 422:\n return '4:2:2';\n case 444:\n return '4:4:4';\n default:\n return 'Unknown';\n }\n }\n\n}\n\nexport default SPSParser;","/*\n * Copyright (C) 2022 もにょてっく. All Rights Reserved.\n *\n * @author もにょ〜ん \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExpGolomb from './exp-golomb.js';\n\nclass H265NaluParser {\n\n static _ebsp2rbsp(uint8array) {\n let src = uint8array;\n let src_length = src.byteLength;\n let dst = new Uint8Array(src_length);\n let dst_idx = 0;\n\n for (let i = 0; i < src_length; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dst_idx] = src[i];\n dst_idx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dst_idx);\n }\n\n static parseVPS(uint8array) {\n let rbsp = H265NaluParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n /* remove NALu Header */\n gb.readByte();\n gb.readByte();\n\n // VPS\n let video_parameter_set_id = gb.readBits(4);\n gb.readBits(2);\n let max_layers_minus1 = gb.readBits(6);\n let max_sub_layers_minus1 = gb.readBits(3);\n let temporal_id_nesting_flag = gb.readBool();\n // and more ...\n\n return {\n num_temporal_layers: max_sub_layers_minus1 + 1,\n temporal_id_nested: temporal_id_nesting_flag\n }\n }\n\n static parseSPS(uint8array) {\n let rbsp = H265NaluParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n /* remove NALu Header */\n gb.readByte();\n gb.readByte();\n\n let left_offset = 0, right_offset = 0, top_offset = 0, bottom_offset = 0;\n\n // SPS\n let video_paramter_set_id = gb.readBits(4);\n let max_sub_layers_minus1 = gb.readBits(3);\n let temporal_id_nesting_flag = gb.readBool();\n\n // profile_tier_level begin\n let general_profile_space = gb.readBits(2);\n let general_tier_flag = gb.readBool();\n let general_profile_idc = gb.readBits(5);\n let general_profile_compatibility_flags_1 = gb.readByte();\n let general_profile_compatibility_flags_2 = gb.readByte();\n let general_profile_compatibility_flags_3 = gb.readByte();\n let general_profile_compatibility_flags_4 = gb.readByte();\n let general_constraint_indicator_flags_1 = gb.readByte();\n let general_constraint_indicator_flags_2 = gb.readByte();\n let general_constraint_indicator_flags_3 = gb.readByte();\n let general_constraint_indicator_flags_4 = gb.readByte();\n let general_constraint_indicator_flags_5 = gb.readByte();\n let general_constraint_indicator_flags_6 = gb.readByte();\n let general_level_idc = gb.readByte();\n let sub_layer_profile_present_flag = [];\n let sub_layer_level_present_flag = [];\n for (let i = 0; i < max_sub_layers_minus1; i++) {\n sub_layer_profile_present_flag.push(gb.readBool());\n sub_layer_level_present_flag.push(gb.readBool());\n }\n if (max_sub_layers_minus1 > 0) {\n for (let i = max_sub_layers_minus1; i < 8; i++) { gb.readBits(2); }\n }\n for (let i = 0; i < max_sub_layers_minus1; i++) {\n if (sub_layer_profile_present_flag[i]) {\n gb.readByte(); // sub_layer_profile_space, sub_layer_tier_flag, sub_layer_profile_idc\n gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte(); // sub_layer_profile_compatibility_flag\n gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte();\n }\n if (sub_layer_level_present_flag[i]) {\n gb.readByte();\n }\n }\n // profile_tier_level end\n\n let seq_parameter_set_id = gb.readUEG();\n let chroma_format_idc = gb.readUEG();\n if (chroma_format_idc == 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n let pic_width_in_luma_samples = gb.readUEG();\n let pic_height_in_luma_samples = gb.readUEG();\n let conformance_window_flag = gb.readBool();\n if (conformance_window_flag) {\n left_offset += gb.readUEG();\n right_offset += gb.readUEG();\n top_offset += gb.readUEG();\n bottom_offset += gb.readUEG();\n }\n let bit_depth_luma_minus8 = gb.readUEG();\n let bit_depth_chroma_minus8 = gb.readUEG();\n let log2_max_pic_order_cnt_lsb_minus4 = gb.readUEG();\n let sub_layer_ordering_info_present_flag = gb.readBool();\n for (let i = sub_layer_ordering_info_present_flag ? 0 : max_sub_layers_minus1; i <= max_sub_layers_minus1; i++) {\n gb.readUEG(); // max_dec_pic_buffering_minus1[i]\n gb.readUEG(); // max_num_reorder_pics[i]\n gb.readUEG(); // max_latency_increase_plus1[i]\n }\n let log2_min_luma_coding_block_size_minus3 = gb.readUEG();\n let log2_diff_max_min_luma_coding_block_size = gb.readUEG();\n let log2_min_transform_block_size_minus2 = gb.readUEG();\n let log2_diff_max_min_transform_block_size = gb.readUEG();\n let max_transform_hierarchy_depth_inter = gb.readUEG();\n let max_transform_hierarchy_depth_intra = gb.readUEG();\n let scaling_list_enabled_flag = gb.readBool();\n if (scaling_list_enabled_flag) {\n let sps_scaling_list_data_present_flag = gb.readBool();\n if (sps_scaling_list_data_present_flag) {\n for (let sizeId = 0; sizeId < 4; sizeId++) {\n for(let matrixId = 0; matrixId < ((sizeId === 3) ? 2 : 6); matrixId++){\n let scaling_list_pred_mode_flag = gb.readBool();\n if (!scaling_list_pred_mode_flag) {\n gb.readUEG(); // scaling_list_pred_matrix_id_delta\n } else {\n let coefNum = Math.min(64, (1 << (4 + (sizeId << 1))));\n if (sizeId > 1) { gb.readSEG() }\n for (let i = 0; i < coefNum; i++) { gb.readSEG(); }\n }\n }\n }\n }\n }\n let amp_enabled_flag = gb.readBool();\n let sample_adaptive_offset_enabled_flag = gb.readBool();\n let pcm_enabled_flag = gb.readBool();\n if (pcm_enabled_flag) {\n gb.readByte();\n gb.readUEG();\n gb.readUEG();\n gb.readBool();\n }\n let num_short_term_ref_pic_sets = gb.readUEG();\n let num_delta_pocs = 0;\n for (let i = 0; i < num_short_term_ref_pic_sets; i++) {\n let inter_ref_pic_set_prediction_flag = false;\n if (i !== 0) { inter_ref_pic_set_prediction_flag = gb.readBool(); }\n if (inter_ref_pic_set_prediction_flag) {\n if (i === num_short_term_ref_pic_sets) { gb.readUEG(); }\n gb.readBool();\n gb.readUEG();\n let next_num_delta_pocs = 0;\n for (let j = 0; j <= num_delta_pocs; j++) {\n let used_by_curr_pic_flag = gb.readBool();\n let use_delta_flag = false;\n if (!used_by_curr_pic_flag) {\n use_delta_flag = gb.readBool();\n }\n if (used_by_curr_pic_flag || use_delta_flag) {\n next_num_delta_pocs++;\n }\n }\n num_delta_pocs = next_num_delta_pocs;\n } else {\n let num_negative_pics = gb.readUEG();\n let num_positive_pics = gb.readUEG();\n num_delta_pocs = num_negative_pics + num_positive_pics;\n for (let j = 0; j < num_negative_pics; j++) {\n gb.readUEG();\n gb.readBool();\n }\n for (let j = 0; j < num_positive_pics; j++) {\n gb.readUEG();\n gb.readBool();\n }\n }\n }\n let long_term_ref_pics_present_flag = gb.readBool();\n if (long_term_ref_pics_present_flag) {\n let num_long_term_ref_pics_sps = gb.readUEG();\n for (let i = 0; i < num_long_term_ref_pics_sps; i++) {\n for (let j = 0; j < (log2_max_pic_order_cnt_lsb_minus4 + 4); j++) { gb.readBits(1); }\n gb.readBits(1);\n }\n }\n //*\n let default_display_window_flag = false; // for calc offset\n let min_spatial_segmentation_idc = 0; // for hvcC\n let sar_width = 1, sar_height = 1;\n let fps_fixed = false, fps_den = 1, fps_num = 1;\n //*/\n let sps_temporal_mvp_enabled_flag = gb.readBool();\n let strong_intra_smoothing_enabled_flag = gb.readBool();\n let vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n let aspect_ratio_info_present_flag = gb.readBool();\n if (aspect_ratio_info_present_flag) {\n let aspect_ratio_idc = gb.readByte();\n\n let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n sar_width = sar_w_table[aspect_ratio_idc - 1];\n sar_height = sar_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n sar_width = gb.readBits(16);\n sar_height = gb.readBits(16);\n }\n }\n let overscan_info_present_flag = gb.readBool();\n if (overscan_info_present_flag) {\n gb.readBool();\n }\n let video_signal_type_present_flag = gb.readBool();\n if (video_signal_type_present_flag) {\n gb.readBits(3);\n gb.readBool();\n let colour_description_present_flag = gb.readBool();\n if (colour_description_present_flag) {\n gb.readByte();\n gb.readByte();\n gb.readByte();\n }\n }\n let chroma_loc_info_present_flag = gb.readBool();\n if (chroma_loc_info_present_flag) {\n gb.readUEG();\n gb.readUEG();\n }\n let neutral_chroma_indication_flag = gb.readBool();\n let field_seq_flag = gb.readBool();\n let frame_field_info_present_flag = gb.readBool();\n default_display_window_flag = gb.readBool();\n if (default_display_window_flag) {\n left_offset += gb.readUEG();\n right_offset += gb.readUEG();\n top_offset += gb.readUEG();\n bottom_offset += gb.readUEG();\n }\n let vui_timing_info_present_flag = gb.readBool();\n if (vui_timing_info_present_flag) {\n fps_den = gb.readBits(32);\n fps_num = gb.readBits(32);\n let vui_poc_proportional_to_timing_flag = gb.readBool();\n if (vui_poc_proportional_to_timing_flag) {\n gb.readUEG();\n let vui_hrd_parameters_present_flag = gb.readBool();\n if (vui_hrd_parameters_present_flag) {\n let commonInfPresentFlag = 1;\n let nal_hrd_parameters_present_flag = false;\n let vcl_hrd_parameters_present_flag = false;\n let sub_pic_hrd_params_present_flag = false;\n if (commonInfPresentFlag) {\n nal_hrd_parameters_present_flag = gb.readBool();\n vcl_hrd_parameters_present_flag = gb.readBool();\n if( nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag ){\n sub_pic_hrd_params_present_flag = gb.readBool();\n if (sub_pic_hrd_params_present_flag) {\n gb.readByte();\n gb.readBits(5);\n gb.readBool();\n gb.readBits(5);\n }\n let bit_rate_scale = gb.readBits(4);\n let cpb_size_scale = gb.readBits(4);\n if (sub_pic_hrd_params_present_flag) {\n gb.readBits(4);\n }\n gb.readBits(5);\n gb.readBits(5);\n gb.readBits(5);\n }\n }\n for (let i = 0; i <= max_sub_layers_minus1; i++) {\n let fixed_pic_rate_general_flag = gb.readBool();\n fps_fixed = fixed_pic_rate_general_flag;\n let fixed_pic_rate_within_cvs_flag = false;\n let cpbCnt = 1;\n if (!fixed_pic_rate_general_flag) {\n fixed_pic_rate_within_cvs_flag = gb.readBool();\n }\n let low_delay_hrd_flag = false;\n if (fixed_pic_rate_within_cvs_flag) {\n gb.readSEG();\n } else {\n low_delay_hrd_flag = gb.readBool();\n }\n if (!low_delay_hrd_flag) {\n cpbCnt = gb.readUEG() + 1;\n }\n if (nal_hrd_parameters_present_flag) {\n for (let j = 0; j < cpbCnt; j++) {\n gb.readUEG(); gb.readUEG();\n if (sub_pic_hrd_params_present_flag) {\n gb.readUEG(); gb.readUEG();\n }\n }\n }\n if (vcl_hrd_parameters_present_flag) {\n for (let j = 0; j < cpbCnt; j++) {\n gb.readUEG(); gb.readUEG();\n if (sub_pic_hrd_params_present_flag) {\n gb.readUEG(); gb.readUEG();\n }\n }\n }\n }\n }\n }\n }\n let bitstream_restriction_flag = gb.readBool();\n if (bitstream_restriction_flag) {\n let tiles_fixed_structure_flag = gb.readBool()\n let motion_vectors_over_pic_boundaries_flag = gb.readBool()\n let restricted_ref_pic_lists_flag = gb.readBool();\n min_spatial_segmentation_idc = gb.readUEG();\n let max_bytes_per_pic_denom = gb.readUEG();\n let max_bits_per_min_cu_denom = gb.readUEG();\n let log2_max_mv_length_horizontal = gb.readUEG();\n let log2_max_mv_length_vertical = gb.readUEG();\n }\n }\n let sps_extension_flag = gb.readBool(); // ignore...\n\n // for meta data\n let codec_mimetype = `hvc1.${general_profile_idc}.1.L${general_level_idc}.B0`;\n let codec_width = pic_width_in_luma_samples;\n let codec_height = pic_height_in_luma_samples;\n let sar_scale = 1;\n if (sar_width !== 1 && sar_height !== 1) {\n sar_scale = sar_width / sar_height;\n }\n\n gb.destroy();\n gb = null;\n\n return {\n codec_mimetype,\n level_string: H265NaluParser.getLevelString(general_level_idc),\n profile_idc: general_profile_idc,\n bit_depth: bit_depth_luma_minus8 + 8,\n ref_frames: 1, // FIXME!!!\n chroma_format: chroma_format_idc,\n chroma_format_string: H265NaluParser.getChromaFormatString(chroma_format_idc),\n\n general_level_idc,\n general_profile_space,\n general_tier_flag,\n general_profile_idc,\n general_profile_compatibility_flags_1,\n general_profile_compatibility_flags_2,\n general_profile_compatibility_flags_3,\n general_profile_compatibility_flags_4,\n general_constraint_indicator_flags_1,\n general_constraint_indicator_flags_2,\n general_constraint_indicator_flags_3,\n general_constraint_indicator_flags_4,\n general_constraint_indicator_flags_5,\n general_constraint_indicator_flags_6,\n min_spatial_segmentation_idc,\n constant_frame_rate: 0 /* FIXME!! fps_fixed ? 1 : 0? */,\n chroma_format_idc,\n bit_depth_luma_minus8,\n bit_depth_chroma_minus8,\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps_num / fps_den,\n fps_den: fps_den,\n fps_num: fps_num,\n },\n\n sar_ratio: {\n width: sar_width,\n height: sar_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: codec_width * sar_scale,\n height: codec_height\n }\n };\n }\n\n static parsePPS(uint8array) {\n let rbsp = H265NaluParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n /* remove NALu Header */\n gb.readByte();\n gb.readByte();\n\n let pic_parameter_set_id = gb.readUEG();\n let seq_parameter_set_id = gb.readUEG();\n let dependent_slice_segments_enabled_flag = gb.readBool();\n let output_flag_present_flag = gb.readBool();\n let num_extra_slice_header_bits = gb.readBits(3);\n let sign_data_hiding_enabled_flag = gb.readBool();\n let cabac_init_present_flag = gb.readBool();\n let num_ref_idx_l0_default_active_minus1 = gb.readUEG();\n let num_ref_idx_l1_default_active_minus1 = gb.readUEG();\n let init_qp_minus26 = gb.readSEG();\n let constrained_intra_pred_flag = gb.readBool();\n let transform_skip_enabled_flag = gb.readBool();\n let cu_qp_delta_enabled_flag = gb.readBool();\n if (cu_qp_delta_enabled_flag) {\n let diff_cu_qp_delta_depth = gb.readUEG();\n }\n let cb_qp_offset = gb.readSEG();\n let cr_qp_offset = gb.readSEG();\n let pps_slice_chroma_qp_offsets_present_flag = gb.readBool();\n let weighted_pred_flag = gb.readBool();\n let weighted_bipred_flag = gb.readBool();\n let transquant_bypass_enabled_flag = gb.readBool();\n let tiles_enabled_flag = gb.readBool();\n let entropy_coding_sync_enabled_flag = gb.readBool();\n // and more ...\n\n // needs hvcC\n let parallelismType = 1; // slice-based parallel decoding\n if (entropy_coding_sync_enabled_flag && tiles_enabled_flag) {\n parallelismType = 0; // mixed-type parallel decoding\n } else if (entropy_coding_sync_enabled_flag) {\n parallelismType = 3; // wavefront-based parallel decoding\n } else if (tiles_enabled_flag) {\n parallelismType = 2; // tile-based parallel decoding\n }\n\n return {\n parallelismType\n }\n }\n\n static getChromaFormatString(chroma_idc) {\n switch (chroma_idc) {\n case 0: return '4:0:0';\n case 1: return '4:2:0';\n case 2: return '4:2:2';\n case 3: return '4:4:4';\n default: return 'Unknown';\n }\n }\n\n static getProfileString(profile_idc) {\n switch (profile_idc) {\n case 1: return 'Main';\n case 2: return 'Main10';\n case 3: return 'MainSP';\n case 4: return 'Rext';\n case 9: return 'SCC';\n default: return 'Unknown';\n }\n }\n\n static getLevelString(level_idc) {\n return (level_idc / 30).toFixed(1);\n }\n}\n\nexport default H265NaluParser;\n","/*\n * Copyright (C) 2022 magicxqq. All Rights Reserved.\n *\n * @author magicxqq \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction isAligned16(a: Uint8Array) : boolean {\n return a.byteOffset % 2 === 0 && a.byteLength % 2 === 0;\n}\n\nfunction isAligned32(a: Uint8Array) : boolean {\n return a.byteOffset % 4 === 0 && a.byteLength % 4 === 0;\n}\n\nfunction compareArray(a: Uint8Array | Uint16Array | Uint32Array,\n b: Uint8Array | Uint16Array | Uint32Array): boolean {\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction equal8(a: Uint8Array, b: Uint8Array) : boolean {\n return compareArray(a, b);\n}\n\nfunction equal16(a: Uint8Array, b: Uint8Array) : boolean {\n let a16 = new Uint16Array(a.buffer, a.byteOffset, a.byteLength / 2);\n let b16 = new Uint16Array(b.buffer, b.byteOffset, b.byteLength / 2);\n return compareArray(a16, b16);\n}\n\nfunction equal32(a: Uint8Array, b: Uint8Array) : boolean {\n let a32 = new Uint32Array(a.buffer, a.byteOffset, a.byteLength / 4);\n let b32 = new Uint32Array(b.buffer, b.byteOffset, b.byteLength / 4);\n return compareArray(a32, b32);\n}\n\nfunction buffersAreEqual(a: Uint8Array, b: Uint8Array) : boolean {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n\n if (isAligned32(a) && isAligned32(b)) {\n return equal32(a, b);\n }\n\n if (isAligned16(a) && isAligned16(b)) {\n return equal16(a, b);\n }\n\n return equal8(a, b);\n}\n\nexport default buffersAreEqual;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport AMF from './amf-parser.js';\nimport SPSParser from './sps-parser.js';\nimport DemuxErrors from './demux-errors.js';\nimport MediaInfo from '../core/media-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\nimport H265Parser from './h265-parser.js';\nimport buffersAreEqual from '../utils/typedarray-equality.ts';\n\nfunction Swap16(src) {\n return (((src >>> 8) & 0xFF) |\n ((src & 0xFF) << 8));\n}\n\nfunction Swap32(src) {\n return (((src & 0xFF000000) >>> 24) |\n ((src & 0x00FF0000) >>> 8) |\n ((src & 0x0000FF00) << 8) |\n ((src & 0x000000FF) << 24));\n}\n\nfunction ReadBig32(array, index) {\n return ((array[index] << 24) |\n (array[index + 1] << 16) |\n (array[index + 2] << 8) |\n (array[index + 3]));\n}\n\n\nclass FLVDemuxer {\n\n constructor(probeData, config) {\n this.TAG = 'FLVDemuxer';\n\n this._config = config;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onMetaDataArrived = null;\n this._onScriptDataArrived = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n\n this._dataOffset = probeData.dataOffset;\n this._firstParse = true;\n this._dispatch = false;\n\n this._hasAudio = probeData.hasAudioTrack;\n this._hasVideo = probeData.hasVideoTrack;\n\n this._hasAudioFlagOverrided = false;\n this._hasVideoFlagOverrided = false;\n\n this._audioInitialMetadataDispatched = false;\n this._videoInitialMetadataDispatched = false;\n\n this._mediaInfo = new MediaInfo();\n this._mediaInfo.hasAudio = this._hasAudio;\n this._mediaInfo.hasVideo = this._hasVideo;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n\n this._naluLengthSize = 4;\n this._timestampBase = 0; // int32, in milliseconds\n this._timescale = 1000;\n this._duration = 0; // int32, in milliseconds\n this._durationOverrided = false;\n this._referenceFrameRate = {\n fixed: true,\n fps: 23.976,\n fps_num: 23976,\n fps_den: 1000\n };\n\n this._flvSoundRateTable = [5500, 11025, 22050, 44100, 48000];\n\n this._mpegSamplingRates = [\n 96000, 88200, 64000, 48000, 44100, 32000,\n 24000, 22050, 16000, 12000, 11025, 8000, 7350\n ];\n\n this._mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0];\n this._mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0];\n this._mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0];\n\n this._mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1];\n this._mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1];\n this._mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];\n\n this._videoTrack = {type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0};\n this._audioTrack = {type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0};\n\n this._littleEndian = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n })();\n }\n\n destroy() {\n this._mediaInfo = null;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n this._videoTrack = null;\n this._audioTrack = null;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onMetaDataArrived = null;\n this._onScriptDataArrived = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n }\n\n static probe(buffer) {\n let data = new Uint8Array(buffer);\n if (data.byteLength < 9) {\n return {needMoreData: true};\n }\n\n let mismatch = {match: false};\n\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return mismatch;\n }\n\n let hasAudio = ((data[4] & 4) >>> 2) !== 0;\n let hasVideo = (data[4] & 1) !== 0;\n\n let offset = ReadBig32(data, 5);\n\n if (offset < 9) {\n return mismatch;\n }\n\n return {\n match: true,\n consumed: offset,\n dataOffset: offset,\n hasAudioTrack: hasAudio,\n hasVideoTrack: hasVideo\n };\n }\n\n bindDataSource(loader) {\n loader.onDataArrival = this.parseChunks.bind(this);\n return this;\n }\n\n // prototype: function(type: string, metadata: any): void\n get onTrackMetadata() {\n return this._onTrackMetadata;\n }\n\n set onTrackMetadata(callback) {\n this._onTrackMetadata = callback;\n }\n\n // prototype: function(mediaInfo: MediaInfo): void\n get onMediaInfo() {\n return this._onMediaInfo;\n }\n\n set onMediaInfo(callback) {\n this._onMediaInfo = callback;\n }\n\n get onMetaDataArrived() {\n return this._onMetaDataArrived;\n }\n\n set onMetaDataArrived(callback) {\n this._onMetaDataArrived = callback;\n }\n\n get onScriptDataArrived() {\n return this._onScriptDataArrived;\n }\n\n set onScriptDataArrived(callback) {\n this._onScriptDataArrived = callback;\n }\n\n // prototype: function(type: number, info: string): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n // prototype: function(videoTrack: any, audioTrack: any): void\n get onDataAvailable() {\n return this._onDataAvailable;\n }\n\n set onDataAvailable(callback) {\n this._onDataAvailable = callback;\n }\n\n // timestamp base for output samples, must be in milliseconds\n get timestampBase() {\n return this._timestampBase;\n }\n\n set timestampBase(base) {\n this._timestampBase = base;\n }\n\n get overridedDuration() {\n return this._duration;\n }\n\n // Force-override media duration. Must be in milliseconds, int32\n set overridedDuration(duration) {\n this._durationOverrided = true;\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n\n // Force-override audio track present flag, boolean\n set overridedHasAudio(hasAudio) {\n this._hasAudioFlagOverrided = true;\n this._hasAudio = hasAudio;\n this._mediaInfo.hasAudio = hasAudio;\n }\n\n // Force-override video track present flag, boolean\n set overridedHasVideo(hasVideo) {\n this._hasVideoFlagOverrided = true;\n this._hasVideo = hasVideo;\n this._mediaInfo.hasVideo = hasVideo;\n }\n\n resetMediaInfo() {\n this._mediaInfo = new MediaInfo();\n }\n\n _isInitialMetadataDispatched() {\n if (this._hasAudio && this._hasVideo) { // both audio & video\n return this._audioInitialMetadataDispatched && this._videoInitialMetadataDispatched;\n }\n if (this._hasAudio && !this._hasVideo) { // audio only\n return this._audioInitialMetadataDispatched;\n }\n if (!this._hasAudio && this._hasVideo) { // video only\n return this._videoInitialMetadataDispatched;\n }\n return false;\n }\n\n // function parseChunks(chunk: ArrayBuffer, byteStart: number): number;\n parseChunks(chunk, byteStart) {\n if (!this._onError || !this._onMediaInfo || !this._onTrackMetadata || !this._onDataAvailable) {\n throw new IllegalStateException('Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified');\n }\n\n let offset = 0;\n let le = this._littleEndian;\n\n if (byteStart === 0) { // buffer with FLV header\n if (chunk.byteLength > 13) {\n let probeData = FLVDemuxer.probe(chunk);\n offset = probeData.dataOffset;\n } else {\n return 0;\n }\n }\n\n if (this._firstParse) { // handle PreviousTagSize0 before Tag1\n this._firstParse = false;\n if (byteStart + offset !== this._dataOffset) {\n Log.w(this.TAG, 'First time parsing but chunk byteStart invalid!');\n }\n\n let v = new DataView(chunk, offset);\n let prevTagSize0 = v.getUint32(0, !le);\n if (prevTagSize0 !== 0) {\n Log.w(this.TAG, 'PrevTagSize0 !== 0 !!!');\n }\n offset += 4;\n }\n\n while (offset < chunk.byteLength) {\n this._dispatch = true;\n\n let v = new DataView(chunk, offset);\n\n if (offset + 11 + 4 > chunk.byteLength) {\n // data not enough for parsing an flv tag\n break;\n }\n\n let tagType = v.getUint8(0);\n let dataSize = v.getUint32(0, !le) & 0x00FFFFFF;\n\n if (offset + 11 + dataSize + 4 > chunk.byteLength) {\n // data not enough for parsing actual data body\n break;\n }\n\n if (tagType !== 8 && tagType !== 9 && tagType !== 18) {\n Log.w(this.TAG, `Unsupported tag type ${tagType}, skipped`);\n // consume the whole tag (skip it)\n offset += 11 + dataSize + 4;\n continue;\n }\n\n let ts2 = v.getUint8(4);\n let ts1 = v.getUint8(5);\n let ts0 = v.getUint8(6);\n let ts3 = v.getUint8(7);\n\n let timestamp = ts0 | (ts1 << 8) | (ts2 << 16) | (ts3 << 24);\n\n let streamId = v.getUint32(7, !le) & 0x00FFFFFF;\n if (streamId !== 0) {\n Log.w(this.TAG, 'Meet tag which has StreamID != 0!');\n }\n\n let dataOffset = offset + 11;\n\n switch (tagType) {\n case 8: // Audio\n this._parseAudioData(chunk, dataOffset, dataSize, timestamp);\n break;\n case 9: // Video\n this._parseVideoData(chunk, dataOffset, dataSize, timestamp, byteStart + offset);\n break;\n case 18: // ScriptDataObject\n this._parseScriptData(chunk, dataOffset, dataSize);\n break;\n }\n\n let prevTagSize = v.getUint32(11 + dataSize, !le);\n if (prevTagSize !== 11 + dataSize) {\n Log.w(this.TAG, `Invalid PrevTagSize ${prevTagSize}`);\n }\n\n offset += 11 + dataSize + 4; // tagBody + dataSize + prevTagSize\n }\n\n // dispatch parsed frames to consumer (typically, the remuxer)\n if (this._isInitialMetadataDispatched()) {\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n }\n\n return offset; // consumed bytes, just equals latest offset index\n }\n\n _parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let scriptData = AMF.parseScriptData(arrayBuffer, dataOffset, dataSize);\n\n if (scriptData.hasOwnProperty('onMetaData')) {\n if (scriptData.onMetaData == null || typeof scriptData.onMetaData !== 'object') {\n Log.w(this.TAG, 'Invalid onMetaData structure!');\n return;\n }\n if (this._metadata) {\n Log.w(this.TAG, 'Found another onMetaData tag!');\n }\n this._metadata = scriptData;\n let onMetaData = this._metadata.onMetaData;\n\n if (this._onMetaDataArrived) {\n this._onMetaDataArrived(Object.assign({}, onMetaData));\n }\n\n if (typeof onMetaData.hasAudio === 'boolean') { // hasAudio\n if (this._hasAudioFlagOverrided === false) {\n this._hasAudio = onMetaData.hasAudio;\n this._mediaInfo.hasAudio = this._hasAudio;\n }\n }\n if (typeof onMetaData.hasVideo === 'boolean') { // hasVideo\n if (this._hasVideoFlagOverrided === false) {\n this._hasVideo = onMetaData.hasVideo;\n this._mediaInfo.hasVideo = this._hasVideo;\n }\n }\n if (typeof onMetaData.audiodatarate === 'number') { // audiodatarate\n this._mediaInfo.audioDataRate = onMetaData.audiodatarate;\n }\n if (typeof onMetaData.videodatarate === 'number') { // videodatarate\n this._mediaInfo.videoDataRate = onMetaData.videodatarate;\n }\n if (typeof onMetaData.width === 'number') { // width\n this._mediaInfo.width = onMetaData.width;\n }\n if (typeof onMetaData.height === 'number') { // height\n this._mediaInfo.height = onMetaData.height;\n }\n if (typeof onMetaData.duration === 'number') { // duration\n if (!this._durationOverrided) {\n let duration = Math.floor(onMetaData.duration * this._timescale);\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n } else {\n this._mediaInfo.duration = 0;\n }\n if (typeof onMetaData.framerate === 'number') { // framerate\n let fps_num = Math.floor(onMetaData.framerate * 1000);\n if (fps_num > 0) {\n let fps = fps_num / 1000;\n this._referenceFrameRate.fixed = true;\n this._referenceFrameRate.fps = fps;\n this._referenceFrameRate.fps_num = fps_num;\n this._referenceFrameRate.fps_den = 1000;\n this._mediaInfo.fps = fps;\n }\n }\n if (typeof onMetaData.keyframes === 'object') { // keyframes\n this._mediaInfo.hasKeyframesIndex = true;\n let keyframes = onMetaData.keyframes;\n this._mediaInfo.keyframesIndex = this._parseKeyframesIndex(keyframes);\n onMetaData.keyframes = null; // keyframes has been extracted, remove it\n } else {\n this._mediaInfo.hasKeyframesIndex = false;\n }\n this._dispatch = false;\n this._mediaInfo.metadata = onMetaData;\n Log.v(this.TAG, 'Parsed onMetaData');\n if (this._mediaInfo.isComplete()) {\n this._onMediaInfo(this._mediaInfo);\n }\n }\n\n if (Object.keys(scriptData).length > 0) {\n if (this._onScriptDataArrived) {\n this._onScriptDataArrived(Object.assign({}, scriptData));\n }\n }\n }\n\n _parseKeyframesIndex(keyframes) {\n let times = [];\n let filepositions = [];\n\n // ignore first keyframe which is actually AVC/HEVC Sequence Header (AVCDecoderConfigurationRecord or HEVCDecoderConfigurationRecord)\n for (let i = 1; i < keyframes.times.length; i++) {\n let time = this._timestampBase + Math.floor(keyframes.times[i] * 1000);\n times.push(time);\n filepositions.push(keyframes.filepositions[i]);\n }\n\n return {\n times: times,\n filepositions: filepositions\n };\n }\n\n _parseAudioData(arrayBuffer, dataOffset, dataSize, tagTimestamp) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid audio packet, missing SoundData payload!');\n return;\n }\n\n if (this._hasAudioFlagOverrided === true && this._hasAudio === false) {\n // If hasAudio: false indicated explicitly in MediaDataSource,\n // Ignore all the audio packets\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let soundSpec = v.getUint8(0);\n\n let soundFormat = soundSpec >>> 4;\n if (soundFormat !== 2 && soundFormat !== 10) { // MP3 or AAC\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, 'Flv: Unsupported audio codec idx: ' + soundFormat);\n return;\n }\n\n let soundRate = 0;\n let soundRateIndex = (soundSpec & 12) >>> 2;\n if (soundRateIndex >= 0 && soundRateIndex <= 4) {\n soundRate = this._flvSoundRateTable[soundRateIndex];\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid audio sample rate idx: ' + soundRateIndex);\n return;\n }\n\n let soundSize = (soundSpec & 2) >>> 1; // unused\n let soundType = (soundSpec & 1);\n\n\n let meta = this._audioMetadata;\n let track = this._audioTrack;\n\n if (!meta) {\n if (this._hasAudio === false && this._hasAudioFlagOverrided === false) {\n this._hasAudio = true;\n this._mediaInfo.hasAudio = true;\n }\n\n // initial metadata\n meta = this._audioMetadata = {};\n meta.type = 'audio';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n meta.audioSampleRate = soundRate;\n meta.channelCount = (soundType === 0 ? 1 : 2);\n }\n\n if (soundFormat === 10) { // AAC\n let aacData = this._parseAACAudioData(arrayBuffer, dataOffset + 1, dataSize - 1);\n if (aacData == undefined) {\n return;\n }\n\n if (aacData.packetType === 0) { // AAC sequence header (AudioSpecificConfig)\n if (meta.config) {\n if (buffersAreEqual(aacData.data.config, meta.config)) {\n // If AudioSpecificConfig is not changed, ignore it to avoid generating initialization segment repeatedly\n return;\n } else {\n Log.w(this.TAG, 'AudioSpecificConfig has been changed, re-generate initialization segment');\n }\n }\n let misc = aacData.data;\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n meta.config = misc.config;\n // The decode result of an aac sample is 1024 PCM samples\n meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed AudioSpecificConfig');\n\n if (this._isInitialMetadataDispatched()) {\n // Non-initial metadata, force dispatch (or flush) parsed frames to remuxer\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._audioInitialMetadataDispatched = true;\n }\n // then notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.originalCodec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n } else if (aacData.packetType === 1) { // AAC raw frame data\n let dts = this._timestampBase + tagTimestamp;\n let aacSample = {unit: aacData.data, length: aacData.data.byteLength, dts: dts, pts: dts};\n track.samples.push(aacSample);\n track.length += aacData.data.length;\n } else {\n Log.e(this.TAG, `Flv: Unsupported AAC data type ${aacData.packetType}`);\n }\n } else if (soundFormat === 2) { // MP3\n if (!meta.codec) {\n // We need metadata for mp3 audio track, extract info from frame header\n let misc = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, true);\n if (misc == undefined) {\n return;\n }\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n // The decode result of an mp3 sample is 1152 PCM samples\n meta.refSampleDuration = 1152 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed MPEG Audio Frame Header');\n\n this._audioInitialMetadataDispatched = true;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.codec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n mi.audioDataRate = misc.bitRate;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n // This packet is always a valid audio packet, extract it\n let data = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, false);\n if (data == undefined) {\n return;\n }\n let dts = this._timestampBase + tagTimestamp;\n let mp3Sample = {unit: data, length: data.byteLength, dts: dts, pts: dts};\n track.samples.push(mp3Sample);\n track.length += data.length;\n }\n }\n\n _parseAACAudioData(arrayBuffer, dataOffset, dataSize) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid AAC packet, missing AACPacketType or/and Data!');\n return;\n }\n\n let result = {};\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n\n result.packetType = array[0];\n\n if (array[0] === 0) {\n result.data = this._parseAACAudioSpecificConfig(arrayBuffer, dataOffset + 1, dataSize - 1);\n } else {\n result.data = array.subarray(1);\n }\n\n return result;\n }\n\n _parseAACAudioSpecificConfig(arrayBuffer, dataOffset, dataSize) {\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let config = null;\n\n /* Audio Object Type:\n 0: Null\n 1: AAC Main\n 2: AAC LC\n 3: AAC SSR (Scalable Sample Rate)\n 4: AAC LTP (Long Term Prediction)\n 5: HE-AAC / SBR (Spectral Band Replication)\n 6: AAC Scalable\n */\n\n let audioObjectType = 0;\n let originalAudioObjectType = 0;\n let audioExtensionObjectType = null;\n let samplingIndex = 0;\n let extensionSamplingIndex = null;\n\n // 5 bits\n audioObjectType = originalAudioObjectType = array[0] >>> 3;\n // 4 bits\n samplingIndex = ((array[0] & 0x07) << 1) | (array[1] >>> 7);\n if (samplingIndex < 0 || samplingIndex >= this._mpegSamplingRates.length) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid sampling frequency index!');\n return;\n }\n\n let samplingFrequence = this._mpegSamplingRates[samplingIndex];\n\n // 4 bits\n let channelConfig = (array[1] & 0x78) >>> 3;\n if (channelConfig < 0 || channelConfig >= 8) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid channel configuration');\n return;\n }\n\n if (audioObjectType === 5) { // HE-AAC?\n // 4 bits\n extensionSamplingIndex = ((array[1] & 0x07) << 1) | (array[2] >>> 7);\n // 5 bits\n audioExtensionObjectType = (array[2] & 0x7C) >>> 2;\n }\n\n // workarounds for various browsers\n let userAgent = self.navigator.userAgent.toLowerCase();\n\n if (userAgent.indexOf('firefox') !== -1) {\n // firefox: use SBR (HE-AAC) if freq less than 24kHz\n if (samplingIndex >= 6) {\n audioObjectType = 5;\n config = new Array(4);\n extensionSamplingIndex = samplingIndex - 3;\n } else { // use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n } else if (userAgent.indexOf('android') !== -1) {\n // android: always use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n } else {\n // for other browsers, e.g. chrome...\n // Always use HE-AAC to make it easier to switch aac codec profile\n audioObjectType = 5;\n extensionSamplingIndex = samplingIndex;\n config = new Array(4);\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3;\n } else if (channelConfig === 1) { // Mono channel\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n }\n\n config[0] = audioObjectType << 3;\n config[0] |= (samplingIndex & 0x0F) >>> 1;\n config[1] = (samplingIndex & 0x0F) << 7;\n config[1] |= (channelConfig & 0x0F) << 3;\n if (audioObjectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0F) >>> 1);\n config[2] = (extensionSamplingIndex & 0x01) << 7;\n // extended audio object type: force to 2 (LC-AAC)\n config[2] |= (2 << 2);\n config[3] = 0;\n }\n\n return {\n config: config,\n samplingRate: samplingFrequence,\n channelCount: channelConfig,\n codec: 'mp4a.40.' + audioObjectType,\n originalCodec: 'mp4a.40.' + originalAudioObjectType\n };\n }\n\n _parseMP3AudioData(arrayBuffer, dataOffset, dataSize, requestHeader) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid MP3 packet, header missing!');\n return;\n }\n\n let le = this._littleEndian;\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let result = null;\n\n if (requestHeader) {\n if (array[0] !== 0xFF) {\n return;\n }\n let ver = (array[1] >>> 3) & 0x03;\n let layer = (array[1] & 0x06) >> 1;\n\n let bitrate_index = (array[2] & 0xF0) >>> 4;\n let sampling_freq_index = (array[2] & 0x0C) >>> 2;\n\n let channel_mode = (array[3] >>> 6) & 0x03;\n let channel_count = channel_mode !== 3 ? 2 : 1;\n\n let sample_rate = 0;\n let bit_rate = 0;\n let object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types\n\n let codec = 'mp3';\n\n switch (ver) {\n case 0: // MPEG 2.5\n sample_rate = this._mpegAudioV25SampleRateTable[sampling_freq_index];\n break;\n case 2: // MPEG 2\n sample_rate = this._mpegAudioV20SampleRateTable[sampling_freq_index];\n break;\n case 3: // MPEG 1\n sample_rate = this._mpegAudioV10SampleRateTable[sampling_freq_index];\n break;\n }\n\n switch (layer) {\n case 1: // Layer 3\n object_type = 34;\n if (bitrate_index < this._mpegAudioL3BitRateTable.length) {\n bit_rate = this._mpegAudioL3BitRateTable[bitrate_index];\n }\n break;\n case 2: // Layer 2\n object_type = 33;\n if (bitrate_index < this._mpegAudioL2BitRateTable.length) {\n bit_rate = this._mpegAudioL2BitRateTable[bitrate_index];\n }\n break;\n case 3: // Layer 1\n object_type = 32;\n if (bitrate_index < this._mpegAudioL1BitRateTable.length) {\n bit_rate = this._mpegAudioL1BitRateTable[bitrate_index];\n }\n break;\n }\n\n result = {\n bitRate: bit_rate,\n samplingRate: sample_rate,\n channelCount: channel_count,\n codec: codec,\n originalCodec: codec\n };\n } else {\n result = array;\n }\n\n return result;\n }\n\n _parseVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid video packet, missing VideoData payload!');\n return;\n }\n\n if (this._hasVideoFlagOverrided === true && this._hasVideo === false) {\n // If hasVideo: false indicated explicitly in MediaDataSource,\n // Ignore all the video packets\n return;\n }\n\n let spec = (new Uint8Array(arrayBuffer, dataOffset, dataSize))[0];\n\n let frameType = (spec & 240) >>> 4;\n let codecId = spec & 15;\n\n if (codecId === 7) { // AVC\n this._parseAVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);\n } else if (codecId === 12) { // HEVC\n this._parseHEVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);\n } else {\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, `Flv: Unsupported codec in video frame: ${codecId}`);\n return;\n }\n }\n\n _parseAVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime');\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let packetType = v.getUint8(0);\n let cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;\n let cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int\n\n if (packetType === 0) { // AVCDecoderConfigurationRecord\n this._parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);\n } else if (packetType === 1) { // One or more Nalus\n this._parseAVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);\n } else if (packetType === 2) {\n // empty, AVC end of sequence\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Invalid video packet type ${packetType}`);\n return;\n }\n }\n\n _parseHEVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid HEVC packet, missing HEVCPacketType or/and CompositionTime');\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let packetType = v.getUint8(0);\n let cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;\n let cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int\n\n if (packetType === 0) { // HEVCDecoderConfigurationRecord\n this._parseHEVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);\n } else if (packetType === 1) { // One or more Nalus\n this._parseHEVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);\n } else if (packetType === 2) {\n // empty, HEVC end of sequence\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Invalid video packet type ${packetType}`);\n return;\n }\n }\n\n _parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 7) {\n Log.w(this.TAG, 'Flv: Invalid AVCDecoderConfigurationRecord, lack of data!');\n return;\n }\n\n let meta = this._videoMetadata;\n let track = this._videoTrack;\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n if (!meta) {\n if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {\n this._hasVideo = true;\n this._mediaInfo.hasVideo = true;\n }\n\n meta = this._videoMetadata = {};\n meta.type = 'video';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n } else {\n if (typeof meta.avcc !== 'undefined') {\n let new_avcc = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n if (buffersAreEqual(new_avcc, meta.avcc)) {\n // AVCDecoderConfigurationRecord is not changed, ignore it to avoid initializaiton segment re-generating\n return;\n } else {\n Log.w(this.TAG, 'AVCDecoderConfigurationRecord has been changed, re-generate initialization segment');\n }\n }\n }\n\n let version = v.getUint8(0); // configurationVersion\n let avcProfile = v.getUint8(1); // avcProfileIndication\n let profileCompatibility = v.getUint8(2); // profile_compatibility\n let avcLevel = v.getUint8(3); // AVCLevelIndication\n\n if (version !== 1 || avcProfile === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');\n return;\n }\n\n this._naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne\n if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!!\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${this._naluLengthSize - 1}`);\n return;\n }\n\n let spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets\n if (spsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');\n return;\n } else if (spsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: SPS Count = ${spsCount}`);\n }\n\n let offset = 6;\n\n for (let i = 0; i < spsCount; i++) {\n let len = v.getUint16(offset, !le); // sequenceParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // Notice: Nalu without startcode header (00 00 00 01)\n let sps = new Uint8Array(arrayBuffer, dataOffset + offset, len);\n offset += len;\n\n let config = SPSParser.parseSPS(sps);\n if (i !== 0) {\n // ignore other sps's config\n continue;\n }\n\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n meta.frameRate = config.frame_rate;\n\n if (config.frame_rate.fixed === false ||\n config.frame_rate.fps_num === 0 ||\n config.frame_rate.fps_den === 0) {\n meta.frameRate = this._referenceFrameRate;\n }\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n meta.refSampleDuration = meta.timescale * (fps_den / fps_num);\n\n let codecArray = sps.subarray(1, 4);\n let codecString = 'avc1.';\n for (let j = 0; j < 3; j++) {\n let h = codecArray[j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codecString += h;\n }\n meta.codec = codecString;\n\n let mi = this._mediaInfo;\n mi.width = meta.codecWidth;\n mi.height = meta.codecHeight;\n mi.fps = meta.frameRate.fps;\n mi.profile = meta.profile;\n mi.level = meta.level;\n mi.refFrames = config.ref_frames;\n mi.chromaFormat = config.chroma_format_string;\n mi.sarNum = meta.sarRatio.width;\n mi.sarDen = meta.sarRatio.height;\n mi.videoCodec = codecString;\n\n if (mi.hasAudio) {\n if (mi.audioCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n let ppsCount = v.getUint8(offset); // numOfPictureParameterSets\n if (ppsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');\n return;\n } else if (ppsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: PPS Count = ${ppsCount}`);\n }\n\n offset++;\n\n for (let i = 0; i < ppsCount; i++) {\n let len = v.getUint16(offset, !le); // pictureParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // pps is useless for extracting video information\n offset += len;\n }\n\n meta.avcc = new Uint8Array(dataSize);\n meta.avcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);\n Log.v(this.TAG, 'Parsed AVCDecoderConfigurationRecord');\n\n if (this._isInitialMetadataDispatched()) {\n // flush parsed frames\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._videoInitialMetadataDispatched = true;\n }\n // notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('video', meta);\n }\n\n _parseHEVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 22) {\n Log.w(this.TAG, 'Flv: Invalid HEVCDecoderConfigurationRecord, lack of data!');\n return;\n }\n\n let meta = this._videoMetadata;\n let track = this._videoTrack;\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n if (!meta) {\n if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {\n this._hasVideo = true;\n this._mediaInfo.hasVideo = true;\n }\n\n meta = this._videoMetadata = {};\n meta.type = 'video';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n } else {\n if (typeof meta.hvcc !== 'undefined') {\n let new_hvcc = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n if (buffersAreEqual(new_hvcc, meta.hvcc)) {\n // HEVCDecoderConfigurationRecord not changed, ignore it to avoid initializaiton segment re-generating\n return;\n } else {\n Log.w(this.TAG, 'HEVCDecoderConfigurationRecord has been changed, re-generate initialization segment');\n }\n }\n }\n\n let version = v.getUint8(0); // configurationVersion\n let hevcProfile = v.getUint8(1) & 0x1F; // hevcProfileIndication\n\n if (version !== 1 || hevcProfile === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid HEVCDecoderConfigurationRecord');\n return;\n }\n\n this._naluLengthSize = (v.getUint8(21) & 3) + 1; // lengthSizeMinusOne\n if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!!\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${this._naluLengthSize - 1}`);\n return;\n }\n\n let numOfArrays = v.getUint8(22);\n for (let i = 0, offset = 23; i < numOfArrays; i++) {\n let nalUnitType = v.getUint8(offset + 0) & 0x3F;\n let numNalus = v.getUint16(offset + 1, !le);\n\n offset += 3;\n for (let j = 0; j < numNalus; j++) {\n let len = v.getUint16(offset + 0, !le);\n if (j !== 0) {\n offset += 2 + len;\n continue;\n }\n\n if (nalUnitType === 33) {\n offset += 2;\n let sps = new Uint8Array(arrayBuffer, dataOffset + offset, len);\n\n let config = H265Parser.parseSPS(sps);\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n meta.frameRate = config.frame_rate;\n\n if (config.frame_rate.fixed === false ||\n config.frame_rate.fps_num === 0 ||\n config.frame_rate.fps_den === 0) {\n meta.frameRate = this._referenceFrameRate;\n }\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n meta.refSampleDuration = meta.timescale * (fps_den / fps_num);\n meta.codec = config.codec_mimetype;\n\n let mi = this._mediaInfo;\n mi.width = meta.codecWidth;\n mi.height = meta.codecHeight;\n mi.fps = meta.frameRate.fps;\n mi.profile = meta.profile;\n mi.level = meta.level;\n mi.refFrames = config.ref_frames;\n mi.chromaFormat = config.chroma_format_string;\n mi.sarNum = meta.sarRatio.width;\n mi.sarDen = meta.sarRatio.height;\n mi.videoCodec = config.codec_mimetype;\n\n if (mi.hasAudio) {\n if (mi.audioCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n\n offset += len;\n } else {\n offset += 2 + len;\n }\n }\n }\n\n meta.hvcc = new Uint8Array(dataSize);\n meta.hvcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);\n Log.v(this.TAG, 'Parsed HEVCDecoderConfigurationRecord');\n\n if (this._isInitialMetadataDispatched()) {\n // flush parsed frames\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._videoInitialMetadataDispatched = true;\n }\n // notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('video', meta);\n }\n\n _parseAVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let units = [], length = 0;\n\n let offset = 0;\n const lengthSize = this._naluLengthSize;\n let dts = this._timestampBase + tagTimestamp;\n let keyframe = (frameType === 1); // from FLV Frame Type constants\n\n while (offset < dataSize) {\n if (offset + 4 >= dataSize) {\n Log.w(this.TAG, `Malformed Nalu near timestamp ${dts}, offset = ${offset}, dataSize = ${dataSize}`);\n break; // data not enough for next Nalu\n }\n // Nalu with length-header (AVC1)\n let naluSize = v.getUint32(offset, !le); // Big-Endian read\n if (lengthSize === 3) {\n naluSize >>>= 8;\n }\n if (naluSize > dataSize - lengthSize) {\n Log.w(this.TAG, `Malformed Nalus near timestamp ${dts}, NaluSize > DataSize!`);\n return;\n }\n\n let unitType = v.getUint8(offset + lengthSize) & 0x1F;\n\n if (unitType === 5) { // IDR\n keyframe = true;\n }\n\n let data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);\n let unit = {type: unitType, data: data};\n units.push(unit);\n length += data.byteLength;\n\n offset += lengthSize + naluSize;\n }\n\n if (units.length) {\n let track = this._videoTrack;\n let avcSample = {\n units: units,\n length: length,\n isKeyframe: keyframe,\n dts: dts,\n cts: cts,\n pts: (dts + cts)\n };\n if (keyframe) {\n avcSample.fileposition = tagPosition;\n }\n track.samples.push(avcSample);\n track.length += length;\n }\n }\n\n _parseHEVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let units = [], length = 0;\n\n let offset = 0;\n const lengthSize = this._naluLengthSize;\n let dts = this._timestampBase + tagTimestamp;\n let keyframe = (frameType === 1); // from FLV Frame Type constants\n\n while (offset < dataSize) {\n if (offset + 4 >= dataSize) {\n Log.w(this.TAG, `Malformed Nalu near timestamp ${dts}, offset = ${offset}, dataSize = ${dataSize}`);\n break; // data not enough for next Nalu\n }\n // Nalu with length-header (HVC1)\n let naluSize = v.getUint32(offset, !le); // Big-Endian read\n if (lengthSize === 3) {\n naluSize >>>= 8;\n }\n if (naluSize > dataSize - lengthSize) {\n Log.w(this.TAG, `Malformed Nalus near timestamp ${dts}, NaluSize > DataSize!`);\n return;\n }\n\n let unitType = v.getUint8(offset + lengthSize) & 0x1F;\n\n if (unitType === 19 || unitType === 20) { // IDR\n keyframe = true;\n }\n\n let data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);\n let unit = {type: unitType, data: data};\n units.push(unit);\n length += data.byteLength;\n\n offset += lengthSize + naluSize;\n }\n\n if (units.length) {\n let track = this._videoTrack;\n let hevcSample = {\n units: units,\n length: length,\n isKeyframe: keyframe,\n dts: dts,\n cts: cts,\n pts: (dts + cts)\n };\n if (keyframe) {\n hevcSample.fileposition = tagPosition;\n }\n track.samples.push(hevcSample);\n track.length += length;\n }\n }\n\n}\n\nexport default FLVDemuxer;","interface ProgramToPMTPIDMap {\n [program: number]: number;\n}\n\nexport class PAT {\n version_number: number;\n network_pid: number;\n // program_number -> pmt_pid\n program_pmt_pid: ProgramToPMTPIDMap = {};\n}\n\nexport enum StreamType {\n kMPEG1Audio = 0x03,\n kMPEG2Audio = 0x04,\n kPESPrivateData = 0x06,\n kADTSAAC = 0x0F,\n kID3 = 0x15,\n kSCTE35 = 0x86,\n kH264 = 0x1b,\n kH265 = 0x24\n}\n\ninterface PIDToStreamTypeMap {\n [pid: number]: StreamType;\n}\n\nexport class PMT {\n program_number: number;\n version_number: number;\n pcr_pid: number;\n // pid -> stream_type\n pid_stream_type: PIDToStreamTypeMap = {};\n\n common_pids: {\n h264: number | undefined,\n h265: number | undefined;\n adts_aac: number | undefined\n mp3: number | undefined\n } = {\n h264: undefined,\n h265: undefined,\n adts_aac: undefined,\n mp3: undefined\n };\n\n pes_private_data_pids: {\n [pid: number]: boolean\n } = {};\n\n timed_id3_pids: {\n [pid: number]: boolean\n } = {};\n\n scte_35_pids: {\n [pid: number]: boolean\n } = {};\n\n smpte2038_pids: {\n [oid: number]: boolean\n } = {};\n}\n\nexport interface ProgramToPMTMap {\n [program: number]: PMT;\n}\n\nexport class PESData {\n pid: number;\n data: Uint8Array;\n stream_type: StreamType;\n file_position: number;\n random_access_indicator: number;\n}\n\nexport class SectionData {\n pid: number;\n data: Uint8Array;\n file_position: number;\n random_access_indicator: number;\n}\n\nexport class SliceQueue {\n slices: Uint8Array[] = [];\n total_length: number = 0;\n expected_length: number = 0;\n file_position: number = 0;\n random_access_indicator: 0;\n}\n\nexport interface PIDToSliceQueues {\n [pid: number]: SliceQueue;\n}\n","import MediaInfo from '../core/media-info';\nimport { PESPrivateData, PESPrivateDataDescriptor } from './pes-private-data';\nimport { SMPTE2038Data } from './smpte2038';\nimport { SCTE35Data } from './scte35';\n\ntype OnErrorCallback = (type: string, info: string) => void;\ntype OnMediaInfoCallback = (mediaInfo: MediaInfo) => void;\ntype OnMetaDataArrivedCallback = (metadata: any) => void;\ntype OnTrackMetadataCallback = (type: string, metadata: any) => void;\ntype OnDataAvailableCallback = (videoTrack: any, audioTrack: any) => void;\ntype OnTimedID3MetadataCallback = (timed_id3_data: PESPrivateData) => void;\ntype OnSMPTE2038MetadataCallback = (smpte2038_data: SMPTE2038Data) => void;\ntype OnSCTE35MetadataCallback = (scte35_data: SCTE35Data) => void;\ntype OnPESPrivateDataCallback = (private_data: PESPrivateData) => void;\ntype OnPESPrivateDataDescriptorCallback = (private_data_descriptor: PESPrivateDataDescriptor) => void;\n\nexport default abstract class BaseDemuxer {\n\n public onError: OnErrorCallback;\n public onMediaInfo: OnMediaInfoCallback;\n public onMetaDataArrived: OnMetaDataArrivedCallback;\n public onTrackMetadata: OnTrackMetadataCallback;\n public onDataAvailable: OnDataAvailableCallback;\n public onTimedID3Metadata: OnTimedID3MetadataCallback;\n public onSMPTE2038Metadata: OnSMPTE2038MetadataCallback;\n public onSCTE35Metadata: OnSCTE35MetadataCallback;\n public onPESPrivateData: OnPESPrivateDataCallback;\n public onPESPrivateDataDescriptor: OnPESPrivateDataDescriptorCallback;\n\n public constructor() {}\n\n public destroy(): void {\n this.onError = null;\n this.onMediaInfo = null;\n this.onMetaDataArrived = null;\n this.onTrackMetadata = null;\n this.onDataAvailable = null;\n this.onTimedID3Metadata = null;\n this.onSMPTE2038Metadata = null;\n this.onSCTE35Metadata = null;\n this.onPESPrivateData = null;\n this.onPESPrivateDataDescriptor = null;\n }\n\n abstract parseChunks(chunk: ArrayBuffer, byteStart: number): number;\n\n}\n","import Log from \"../utils/logger\";\n\nexport enum H264NaluType {\n kUnspecified = 0,\n kSliceNonIDR,\n kSliceDPA,\n kSliceDPB,\n kSliceDPC,\n kSliceIDR,\n kSliceSEI,\n kSliceSPS,\n kSlicePPS,\n kSliceAUD,\n kEndOfSequence,\n kEndOfStream,\n kFiller,\n kSPSExt,\n kReserved0\n}\n\nexport class H264NaluPayload {\n type: H264NaluType;\n data: Uint8Array;\n}\n\nexport class H264NaluAVC1 {\n type: H264NaluType;\n data: Uint8Array;\n\n constructor(nalu: H264NaluPayload) {\n let nalu_size = nalu.data.byteLength;\n\n this.type = nalu.type;\n this.data = new Uint8Array(4 + nalu_size); // 4 byte length-header + nalu payload\n\n let v = new DataView(this.data.buffer);\n // Fill 4 byte length-header\n v.setUint32(0, nalu_size);\n // Copy payload\n this.data.set(nalu.data, 4);\n }\n}\n\nexport class H264AnnexBParser {\n\n private readonly TAG: string = \"H264AnnexBParser\";\n\n private data_: Uint8Array;\n private current_startcode_offset_: number = 0;\n private eof_flag_: boolean = false;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_startcode_offset_ = this.findNextStartCodeOffset(0);\n if (this.eof_flag_) {\n Log.e(this.TAG, \"Could not find H264 startcode until payload end!\");\n }\n }\n\n private findNextStartCodeOffset(start_offset: number) {\n let i = start_offset;\n let data = this.data_;\n\n while (true) {\n if (i + 3 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 00 00 00 01 or 00 00 01\n let uint32 = (data[i + 0] << 24)\n | (data[i + 1] << 16)\n | (data[i + 2] << 8)\n | (data[i + 3]);\n let uint24 = (data[i + 0] << 16)\n | (data[i + 1] << 8)\n | (data[i + 2]);\n if (uint32 === 0x00000001 || uint24 === 0x000001) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextNaluPayload(): H264NaluPayload | null {\n let data = this.data_;\n let nalu_payload: H264NaluPayload = null;\n\n while (nalu_payload == null) {\n if (this.eof_flag_) {\n break;\n }\n // offset pointed to start code\n let startcode_offset = this.current_startcode_offset_;\n\n // nalu payload start offset\n let offset = startcode_offset;\n let u32 = (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | (data[offset + 3]);\n if (u32 === 0x00000001) {\n offset += 4;\n } else {\n offset += 3;\n }\n\n let nalu_type: H264NaluType = data[offset] & 0x1F;\n let forbidden_bit = (data[offset] & 0x80) >>> 7;\n\n let next_startcode_offset = this.findNextStartCodeOffset(offset);\n this.current_startcode_offset_ = next_startcode_offset;\n\n if (nalu_type >= H264NaluType.kReserved0) {\n continue;\n }\n if (forbidden_bit !== 0) {\n // Log.e(this.TAG, `forbidden_bit near offset ${offset} should be 0 but has value ${forbidden_bit}`);\n continue;\n }\n\n let payload_data = data.subarray(offset, next_startcode_offset);\n\n nalu_payload = new H264NaluPayload();\n nalu_payload.type = nalu_type;\n nalu_payload.data = payload_data;\n }\n\n return nalu_payload;\n }\n\n}\n\n\nexport class AVCDecoderConfigurationRecord {\n\n private data: Uint8Array;\n\n // sps, pps: require Nalu without 4 byte length-header\n public constructor(sps: Uint8Array, pps: Uint8Array, sps_details: any) {\n let length = 6 + 2 + sps.byteLength + 1 + 2 + pps.byteLength;\n let need_extra_fields = false;\n\n if (sps[3] !== 66 && sps[3] !== 77 && sps[3] !== 88) {\n need_extra_fields = true;\n length += 4;\n }\n\n let data = this.data = new Uint8Array(length);\n\n data[0] = 0x01; // configurationVersion\n data[1] = sps[1]; // AVCProfileIndication\n data[2] = sps[2]; // profile_compatibility\n data[3] = sps[3]; // AVCLevelIndication\n data[4] = 0xFF; // 111111 + lengthSizeMinusOne(3)\n\n data[5] = 0xE0 | 0x01 // 111 + numOfSequenceParameterSets\n\n let sps_length = sps.byteLength;\n data[6] = sps_length >>> 8; // sequenceParameterSetLength\n data[7] = sps_length & 0xFF;\n\n let offset = 8;\n data.set(sps, 8);\n offset += sps_length;\n\n data[offset] = 1; // numOfPictureParameterSets\n\n let pps_length = pps.byteLength;\n data[offset + 1] = pps_length >>> 8; // pictureParameterSetLength\n data[offset + 2] = pps_length & 0xFF;\n\n data.set(pps, offset + 3);\n offset += 3 + pps_length;\n\n if (need_extra_fields) {\n data[offset] = 0xFC | sps_details.chroma_format_idc;\n data[offset + 1] = 0xF8 | (sps_details.bit_depth_luma - 8);\n data[offset + 2] = 0xF8 | (sps_details.bit_depth_chroma - 8);\n data[offset + 3] = 0x00; // number of sps ext\n offset += 4;\n }\n }\n\n public getData() {\n return this.data;\n }\n\n}\n","export enum MPEG4AudioObjectTypes {\n kNull = 0,\n kAACMain,\n kAAC_LC, // LC-AAC\n kAAC_SSR,\n kAAC_LTP,\n kAAC_SBR, // HE-AAC\n kAAC_Scalable,\n\n kLayer1 = 32,\n kLayer2,\n kLayer3, // MP3\n}\n\nexport enum MPEG4SamplingFrequencyIndex {\n k96000Hz = 0,\n k88200Hz,\n k64000Hz,\n k48000Hz,\n k44100Hz,\n k32000Hz,\n k24000Hz,\n k22050Hz,\n k16000Hz,\n k12000Hz,\n k11025Hz,\n k8000Hz,\n k7350Hz,\n}\n\nexport const MPEG4SamplingFrequencies = [\n 96000,\n 88200,\n 64000,\n 48000,\n 44100,\n 32000,\n 24000,\n 22050,\n 16000,\n 12000,\n 11025,\n 8000,\n 7350,\n];\n","import ExpGolomb from './exp-golomb.js';\n\nexport type SCTE35Data = {\n splice_command_type: SCTE35CommandType.kSpliceInsert\n pts?: number,\n nearest_pts?: number\n auto_return?: boolean\n duraiton?: number,\n detail: SCTE35Detail\n data: Uint8Array\n} | {\n splice_command_type: SCTE35CommandType.kTimeSignal\n pts?: number,\n nearest_pts?: number\n detail: SCTE35Detail\n data: Uint8Array\n} | {\n splice_command_type: SCTE35CommandType.kSpliceNull | SCTE35CommandType.kBandwidthReservation | SCTE35CommandType.kSpliceSchedule | SCTE35CommandType.kPrivateCommand\n pts: undefined,\n nearest_pts?: number\n detail: SCTE35Detail\n data: Uint8Array\n}\n\ntype SCTE35Detail = {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kSpliceNull\n splice_command: SpliceNull\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[]\n E_CRC32?: number\n CRC32: number\n} | {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kSpliceSchedule\n splice_command: SpliceSchedule\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[]\n E_CRC32?: number\n CRC32: number\n} | {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kSpliceInsert\n splice_command: SpliceInsert\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[]\n E_CRC32?: number\n CRC32: number\n} | {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kTimeSignal\n splice_command: TimeSignal\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[]\n E_CRC32?: number\n CRC32: number\n} | {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kBandwidthReservation\n splice_command: BandwidthReservation\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[]\n E_CRC32?: number\n CRC32: number\n} | {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kPrivateCommand\n splice_command: PrivateCommand\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[],\n E_CRC32?: number\n CRC32: number\n};\n\nexport enum SCTE35CommandType {\n kSpliceNull = 0x0,\n kSpliceSchedule = 0x4,\n kSpliceInsert = 0x5,\n kTimeSignal = 0x6,\n kBandwidthReservation = 0x07,\n kPrivateCommand = 0xff\n}\n\ntype SpliceTime = {\n time_specified_flag: boolean,\n pts_time?: number\n}\n\nconst parseSpliceTime = (reader: ExpGolomb): SpliceTime => {\n const time_specified_flag = reader.readBool()\n\n if (!time_specified_flag) {\n reader.readBits(7);\n return { time_specified_flag }\n } else {\n reader.readBits(6)\n const pts_time = reader.readBits(31) * 4 + reader.readBits(2);\n return {\n time_specified_flag,\n pts_time\n }\n }\n}\n\ntype BreakDuration = {\n auto_return: boolean,\n duration: number\n}\nconst parseBreakDuration = (reader: ExpGolomb): BreakDuration => {\n const auto_return = reader.readBool();\n reader.readBits(6);\n const duration = reader.readBits(31) * 4 + reader.readBits(2);\n return {\n auto_return,\n duration\n };\n}\n\ntype SpliceInsertComponent = {\n component_tag: number,\n splice_time?: SpliceTime\n}\nconst parseSpliceInsertComponent = (splice_immediate_flag: boolean, reader: ExpGolomb): SpliceInsertComponent => {\n const component_tag = reader.readBits(8);\n if (splice_immediate_flag) {\n return { component_tag };\n }\n\n const splice_time = parseSpliceTime(reader);\n return {\n component_tag,\n splice_time\n };\n}\ntype SpliceScheduleEventComponent = {\n component_tag: number,\n utc_splice_time: number\n}\nconst parseSpliceScheduleEventComponent = (reader: ExpGolomb): SpliceScheduleEventComponent => {\n const component_tag = reader.readBits(8);\n const utc_splice_time = reader.readBits(32);\n return {\n component_tag,\n utc_splice_time\n };\n}\n\ntype SpliceScheduleEvent = {\n splice_event_id: number,\n splice_event_cancel_indicator: boolean,\n out_of_network_indicator?: boolean,\n program_splice_flag?: boolean,\n duration_flag?: boolean,\n utc_splice_time?: number,\n component_count?: number,\n components?: SpliceScheduleEventComponent[]\n break_duration?: BreakDuration,\n unique_program_id?: number\n avail_num?: number,\n avails_expected?: number\n}\nconst parseSpliceScheduleEvent = (reader: ExpGolomb): SpliceScheduleEvent => {\n const splice_event_id = reader.readBits(32);\n const splice_event_cancel_indicator = reader.readBool();\n reader.readBits(7);\n\n const spliceScheduleEvent: SpliceScheduleEvent = {\n splice_event_id,\n splice_event_cancel_indicator\n }\n\n if (splice_event_cancel_indicator) {\n return spliceScheduleEvent;\n }\n\n spliceScheduleEvent.out_of_network_indicator = reader.readBool()\n spliceScheduleEvent.program_splice_flag = reader.readBool()\n spliceScheduleEvent.duration_flag = reader.readBool()\n reader.readBits(5)\n\n if (spliceScheduleEvent.program_splice_flag) {\n spliceScheduleEvent.utc_splice_time = reader.readBits(32);\n } else {\n spliceScheduleEvent.component_count = reader.readBits(8);\n spliceScheduleEvent.components = [];\n for (let i = 0; i < spliceScheduleEvent.component_count; i++) {\n spliceScheduleEvent.components.push(parseSpliceScheduleEventComponent(reader));\n }\n }\n\n if (spliceScheduleEvent.duration_flag) {\n spliceScheduleEvent.break_duration = parseBreakDuration(reader);\n }\n\n spliceScheduleEvent.unique_program_id = reader.readBits(16);\n spliceScheduleEvent.avail_num = reader.readBits(8);\n spliceScheduleEvent.avails_expected = reader.readBits(8);\n\n return spliceScheduleEvent;\n}\n\ntype SpliceNull = {}\ntype SpliceSchedule = {\n splice_count: number,\n events: SpliceScheduleEvent[],\n}\ntype SpliceInsert = {\n splice_event_id: number,\n splice_event_cancel_indicator: boolean,\n out_of_network_indicator?: boolean,\n program_splice_flag?: boolean,\n duration_flag?: boolean,\n splice_immediate_flag?: boolean,\n splice_time?: SpliceTime,\n component_count?: number,\n components?: SpliceInsertComponent[],\n break_duration?: BreakDuration,\n unique_program_id?: number,\n avail_num?: number,\n avails_expected?: number\n}\ntype TimeSignal = {\n splice_time: SpliceTime\n}\ntype BandwidthReservation = {}\ntype PrivateCommand = {\n identifier: string,\n private_data: ArrayBuffer\n}\n\ntype SpliceCommand = SpliceNull | SpliceSchedule | SpliceInsert | TimeSignal | BandwidthReservation | PrivateCommand\n\nconst parseSpliceNull = (): SpliceNull => {\n return {};\n};\nconst parseSpliceSchedule = (reader: ExpGolomb): SpliceSchedule => {\n const splice_count = reader.readBits(8)\n const events: SpliceScheduleEvent[] = [];\n for (let i = 0; i < splice_count; i++) {\n events.push(parseSpliceScheduleEvent(reader));\n }\n return {\n splice_count,\n events\n };\n}\nconst parseSpliceInsert = (reader: ExpGolomb): SpliceInsert => {\n const splice_event_id = reader.readBits(32);\n const splice_event_cancel_indicator = reader.readBool();\n reader.readBits(7);\n\n const spliceInsert: SpliceInsert = {\n splice_event_id,\n splice_event_cancel_indicator\n }\n\n if (splice_event_cancel_indicator) {\n return spliceInsert;\n }\n\n spliceInsert.out_of_network_indicator = reader.readBool()\n spliceInsert.program_splice_flag = reader.readBool()\n spliceInsert.duration_flag = reader.readBool()\n spliceInsert.splice_immediate_flag = reader.readBool()\n reader.readBits(4)\n\n if (spliceInsert.program_splice_flag && !spliceInsert.splice_immediate_flag) {\n spliceInsert.splice_time = parseSpliceTime(reader);\n }\n if (!spliceInsert.program_splice_flag) {\n spliceInsert.component_count = reader.readBits(8)\n spliceInsert.components = [];\n for (let i = 0; i < spliceInsert.component_count; i++) {\n spliceInsert.components.push(parseSpliceInsertComponent(spliceInsert.splice_immediate_flag, reader));\n }\n }\n\n if (spliceInsert.duration_flag) {\n spliceInsert.break_duration = parseBreakDuration(reader);\n }\n\n spliceInsert.unique_program_id = reader.readBits(16);\n spliceInsert.avail_num = reader.readBits(8);\n spliceInsert.avails_expected = reader.readBits(8);\n\n return spliceInsert;\n}\nconst parseTimeSignal = (reader: ExpGolomb): TimeSignal => {\n return {\n splice_time: parseSpliceTime(reader)\n };\n}\nconst parseBandwidthReservation = (): BandwidthReservation => {\n return {};\n}\nconst parsePrivateCommand = (splice_command_length: number, reader: ExpGolomb): PrivateCommand => {\n const identifier = String.fromCharCode(reader.readBits(8), reader.readBits(8), reader.readBits(8), reader.readBits(8))\n const data = new Uint8Array(splice_command_length - 4);\n for (let i = 0; i < splice_command_length - 4; i++) {\n data[i] = reader.readBits(8);\n }\n\n return {\n identifier,\n private_data: data.buffer\n }\n}\n\ntype Descriptor = {\n descriptor_tag: number,\n descriptor_length: number,\n identifier: string\n}\ntype AvailDescriptor = Descriptor & {\n provider_avail_id: number\n}\nconst parseAvailDescriptor = (descriptor_tag: number, descriptor_length: number, identifier: string, reader: ExpGolomb): AvailDescriptor => {\n const provider_avail_id = reader.readBits(32);\n\n return {\n descriptor_tag,\n descriptor_length,\n identifier,\n provider_avail_id\n }\n}\ntype DTMFDescriptor = Descriptor & {\n preroll: number,\n dtmf_count: number,\n DTMF_char: string\n}\nconst parseDTMFDescriptor = (descriptor_tag: number, descriptor_length: number, identifier: string, reader: ExpGolomb): DTMFDescriptor => {\n const preroll = reader.readBits(8);\n const dtmf_count = reader.readBits(3);\n reader.readBits(5);\n let DTMF_char = '';\n for (let i = 0; i < dtmf_count; i++) {\n DTMF_char += String.fromCharCode(reader.readBits(8));\n }\n\n return {\n descriptor_tag,\n descriptor_length,\n identifier,\n preroll,\n dtmf_count,\n DTMF_char\n };\n}\ntype SegmentationDescriptorComponent = {\n component_tag: number,\n pts_offset: number\n}\nconst parseSegmentationDescriptorComponent = (reader: ExpGolomb): SegmentationDescriptorComponent => {\n const component_tag = reader.readBits(8);\n reader.readBits(7)\n const pts_offset = reader.readBits(31) * 4 + reader.readBits(2);\n return {\n component_tag,\n pts_offset\n };\n}\ntype SegmentationDescriptor = Descriptor & {\n segmentation_event_id: number,\n segmentation_event_cancel_indicator: boolean,\n program_segmentation_flag?: boolean,\n segmentation_duration_flag?: boolean\n delivery_not_restricted_flag?: boolean\n web_delivery_allowed_flag?: boolean\n no_regional_blackout_flag?: boolean,\n archive_allowed_flag?: boolean,\n device_restrictions?: number\n component_count?: number,\n components?: any[]\n segmentation_duration?: number\n segmentation_upid_type?: number,\n segmentation_upid_length?: number,\n segmentation_upid?: ArrayBuffer,\n segmentation_type_id?: number,\n segment_num?: number,\n segments_expected?: number,\n sub_segment_num?: number,\n sub_segments_expected?: number\n}\nconst parseSegmentationDescriptor = (descriptor_tag: number, descriptor_length: number, identifier: string, reader: ExpGolomb): SegmentationDescriptor => {\n const segmentation_event_id = reader.readBits(32);\n const segmentation_event_cancel_indicator = reader.readBool();\n reader.readBits(7);\n\n const segmentationDescriptor: SegmentationDescriptor = {\n descriptor_tag,\n descriptor_length,\n identifier,\n segmentation_event_id,\n segmentation_event_cancel_indicator\n }\n\n if (segmentation_event_cancel_indicator) {\n return segmentationDescriptor;\n }\n\n segmentationDescriptor.program_segmentation_flag = reader.readBool();\n segmentationDescriptor.segmentation_duration_flag = reader.readBool();\n segmentationDescriptor.delivery_not_restricted_flag = reader.readBool();\n\n if (!segmentationDescriptor.delivery_not_restricted_flag) {\n segmentationDescriptor.web_delivery_allowed_flag = reader.readBool();\n segmentationDescriptor.no_regional_blackout_flag = reader.readBool();\n segmentationDescriptor.archive_allowed_flag = reader.readBool();\n segmentationDescriptor.device_restrictions = reader.readBits(2);\n } else {\n reader.readBits(5);\n }\n\n if (!segmentationDescriptor.program_segmentation_flag) {\n segmentationDescriptor.component_count = reader.readBits(8);\n segmentationDescriptor.components = [];\n for (let i = 0; i < segmentationDescriptor.component_count; i++) {\n segmentationDescriptor.components.push(parseSegmentationDescriptorComponent(reader));\n }\n }\n\n if (segmentationDescriptor.segmentation_duration_flag) {\n segmentationDescriptor.segmentation_duration = reader.readBits(40);\n }\n\n segmentationDescriptor.segmentation_upid_type = reader.readBits(8);\n segmentationDescriptor.segmentation_upid_length = reader.readBits(8);\n {\n const upid = new Uint8Array(segmentationDescriptor.segmentation_upid_length)\n for (let i = 0; i < segmentationDescriptor.segmentation_upid_length; i++) {\n upid[i] = reader.readBits(8);\n }\n segmentationDescriptor.segmentation_upid = upid.buffer;\n }\n segmentationDescriptor.segmentation_type_id = reader.readBits(8);\n segmentationDescriptor.segment_num = reader.readBits(8);\n segmentationDescriptor.segments_expected = reader.readBits(8);\n if (\n segmentationDescriptor.segmentation_type_id === 0x34 ||\n segmentationDescriptor.segmentation_type_id === 0x36 ||\n segmentationDescriptor.segmentation_type_id === 0x38 ||\n segmentationDescriptor.segmentation_type_id === 0x3A\n ) {\n segmentationDescriptor.sub_segment_num = reader.readBits(8);\n segmentationDescriptor.sub_segments_expected = reader.readBits(8);\n }\n\n return segmentationDescriptor;\n}\ntype TimeDescriptor = Descriptor & {\n TAI_seconds: number,\n TAI_ns: number,\n UTC_offset: number\n}\nconst parseTimeDescriptor = (descriptor_tag: number, descriptor_length: number, identifier: string, reader: ExpGolomb): TimeDescriptor => {\n const TAI_seconds = reader.readBits(48);\n const TAI_ns = reader.readBits(32);\n const UTC_offset = reader.readBits(16);\n\n return {\n descriptor_tag,\n descriptor_length,\n identifier,\n TAI_seconds,\n TAI_ns,\n UTC_offset\n };\n}\ntype AudioDescriptorComponent = {\n component_tag: number,\n ISO_code: string\n Bit_Stream_Mode: number\n Num_Channels: number,\n Full_Srvc_Audio: boolean\n}\nconst parseAudioDescriptorComponent = (reader: ExpGolomb): AudioDescriptorComponent => {\n const component_tag = reader.readBits(8)\n const ISO_code = String.fromCharCode(reader.readBits(8), reader.readBits(8), reader.readBits(8));\n const Bit_Stream_Mode = reader.readBits(3);\n const Num_Channels = reader.readBits(4);\n const Full_Srvc_Audio = reader.readBool();\n\n return {\n component_tag,\n ISO_code,\n Bit_Stream_Mode,\n Num_Channels,\n Full_Srvc_Audio\n };\n}\ntype AudioDescriptor = Descriptor & {\n audio_count: number,\n components: AudioDescriptorComponent[]\n}\nconst parseAudioDescriptor = (descriptor_tag: number, descriptor_length: number, identifier: string, reader: ExpGolomb): AudioDescriptor => {\n const audio_count = reader.readBits(4);\n const components: AudioDescriptorComponent[] = [];\n for (let i = 0; i < audio_count; i++) {\n components.push(parseAudioDescriptorComponent(reader));\n }\n\n return {\n descriptor_tag,\n descriptor_length,\n identifier,\n audio_count,\n components\n };\n}\n\ntype SpliceDescriptor = AvailDescriptor | DTMFDescriptor | SegmentationDescriptor | TimeDescriptor | AudioDescriptor;\n\nexport const readSCTE35 = (data: Uint8Array): SCTE35Data => {\n const reader = new ExpGolomb(data);\n\n const table_id = reader.readBits(8);\n const section_syntax_indicator = reader.readBool();\n const private_indicator = reader.readBool();\n reader.readBits(2);\n const section_length = reader.readBits(12);\n const protocol_version = reader.readBits(8);\n const encrypted_packet = reader.readBool();\n const encryption_algorithm = reader.readBits(6);\n const pts_adjustment = reader.readBits(31) * 4 + reader.readBits(2);\n const cw_index = reader.readBits(8);\n const tier = reader.readBits(12);\n const splice_command_length = reader.readBits(12)\n const splice_command_type = reader.readBits(8)\n\n let splice_command: SpliceCommand | null = null;\n if (splice_command_type === SCTE35CommandType.kSpliceNull) {\n splice_command = parseSpliceNull();\n } else if (splice_command_type === SCTE35CommandType.kSpliceSchedule) {\n splice_command = parseSpliceSchedule(reader);\n } else if (splice_command_type === SCTE35CommandType.kSpliceInsert) {\n splice_command = parseSpliceInsert(reader);\n } else if (splice_command_type === SCTE35CommandType.kTimeSignal) {\n splice_command = parseTimeSignal(reader);\n } else if (splice_command_type === SCTE35CommandType.kBandwidthReservation) {\n splice_command = parseBandwidthReservation();\n } else if (splice_command_type === SCTE35CommandType.kPrivateCommand) {\n splice_command = parsePrivateCommand(splice_command_length, reader)\n } else {\n reader.readBits(splice_command_length * 8);\n }\n\n const splice_descriptors: SpliceDescriptor[] = [];\n\n const descriptor_loop_length = reader.readBits(16);\n for (let length = 0; length < descriptor_loop_length;) {\n const descriptor_tag = reader.readBits(8);\n const descriptor_length = reader.readBits(8);\n const identifier = String.fromCharCode(reader.readBits(8), reader.readBits(8), reader.readBits(8), reader.readBits(8));\n\n if (descriptor_tag === 0x00) {\n splice_descriptors.push(parseAvailDescriptor(descriptor_tag, descriptor_length, identifier, reader));\n } else if (descriptor_tag === 0x01) {\n splice_descriptors.push(parseDTMFDescriptor(descriptor_tag, descriptor_length, identifier, reader));\n } else if (descriptor_tag === 0x02) {\n splice_descriptors.push(parseSegmentationDescriptor(descriptor_tag, descriptor_length, identifier, reader));\n } else if (descriptor_tag === 0x03) {\n splice_descriptors.push(parseTimeDescriptor(descriptor_tag, descriptor_length, identifier, reader));\n } else if (descriptor_tag === 0x04) {\n splice_descriptors.push(parseAudioDescriptor(descriptor_tag, descriptor_length, identifier, reader));\n } else {\n reader.readBits((descriptor_length - 4) * 8);\n }\n\n length += 2 + descriptor_length;\n }\n\n const E_CRC32 = encrypted_packet ? reader.readBits(32) : undefined;\n const CRC32 = reader.readBits(32);\n\n const detail = {\n table_id,\n section_syntax_indicator,\n private_indicator,\n section_length,\n protocol_version,\n encrypted_packet,\n encryption_algorithm,\n pts_adjustment,\n cw_index,\n tier,\n splice_command_length,\n splice_command_type,\n splice_command,\n descriptor_loop_length,\n splice_descriptors,\n E_CRC32,\n CRC32\n };\n\n if (splice_command_type === SCTE35CommandType.kSpliceInsert) {\n const spliceInsert = splice_command as SpliceInsert;\n\n if (spliceInsert.splice_event_cancel_indicator) {\n return {\n splice_command_type,\n detail,\n data\n }\n } else if (spliceInsert.program_splice_flag && !spliceInsert.splice_immediate_flag) {\n const auto_return = spliceInsert.duration_flag ? spliceInsert.break_duration.auto_return : undefined;\n const duraiton = spliceInsert.duration_flag ? spliceInsert.break_duration.duration / 90 : undefined;\n\n if (spliceInsert.splice_time.time_specified_flag) {\n return {\n splice_command_type,\n pts: (pts_adjustment + spliceInsert.splice_time.pts_time) % (2 ** 33),\n auto_return,\n duraiton,\n detail,\n data\n }\n } else {\n return {\n splice_command_type,\n auto_return,\n duraiton,\n detail,\n data\n } \n }\n } else {\n const auto_return = spliceInsert.duration_flag ? spliceInsert.break_duration.auto_return : undefined;\n const duraiton = spliceInsert.duration_flag ? spliceInsert.break_duration.duration / 90 : undefined;\n\n return {\n splice_command_type,\n auto_return,\n duraiton,\n detail,\n data\n }\n }\n } else if (splice_command_type === SCTE35CommandType.kTimeSignal) {\n const timeSignal = splice_command as TimeSignal;\n\n if (timeSignal.splice_time.time_specified_flag) {\n return {\n splice_command_type,\n pts: (pts_adjustment + timeSignal.splice_time.pts_time) % (2 ** 33),\n detail,\n data\n }\n } else {\n return {\n splice_command_type,\n detail,\n data\n }\n }\n } else {\n return {\n splice_command_type,\n detail,\n data\n }\n }\n}","import Log from \"../utils/logger\";\nimport { MPEG4AudioObjectTypes, MPEG4SamplingFrequencies, MPEG4SamplingFrequencyIndex } from \"./mpeg4-audio\";\n\nexport class AACFrame {\n audio_object_type: MPEG4AudioObjectTypes;\n sampling_freq_index: MPEG4SamplingFrequencyIndex;\n sampling_frequency: number;\n channel_config: number;\n\n data: Uint8Array;\n}\n\nexport class AACADTSParser {\n\n private readonly TAG: string = \"AACADTSParser\";\n\n private data_: Uint8Array;\n private current_syncword_offset_: number;\n private eof_flag_: boolean;\n private has_last_incomplete_data: boolean;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_syncword_offset_ = this.findNextSyncwordOffset(0);\n if (this.eof_flag_) {\n Log.e(this.TAG, `Could not found ADTS syncword until payload end`);\n }\n }\n\n private findNextSyncwordOffset(syncword_offset: number): number {\n let i = syncword_offset;\n let data = this.data_;\n\n while (true) {\n if (i + 7 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 12-bit 0xFFF syncword\n let syncword = ((data[i + 0] << 8) | data[i + 1]) >>> 4;\n if (syncword === 0xFFF) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextAACFrame(): AACFrame | null {\n let data = this.data_;\n let aac_frame: AACFrame = null;\n\n while (aac_frame == null) {\n if (this.eof_flag_) {\n break;\n }\n\n let syncword_offset = this.current_syncword_offset_;\n let offset = syncword_offset;\n\n // adts_fixed_header()\n // syncword 0xFFF: 12-bit\n let ID = (data[offset + 1] & 0x08) >>> 3;\n let layer = (data[offset + 1] & 0x06) >>> 1;\n let protection_absent = data[offset + 1] & 0x01;\n let profile = (data[offset + 2] & 0xC0) >>> 6;\n let sampling_frequency_index = (data[offset + 2] & 0x3C) >>> 2;\n let channel_configuration = ((data[offset + 2] & 0x01) << 2)\n | ((data[offset + 3] & 0xC0) >>> 6);\n\n // adts_variable_header()\n let aac_frame_length = ((data[offset + 3] & 0x03) << 11)\n | (data[offset + 4] << 3)\n | ((data[offset + 5] & 0xE0) >>> 5);\n let number_of_raw_data_blocks_in_frame = data[offset + 6] & 0x03;\n\n if (offset + aac_frame_length > this.data_.byteLength) {\n // data not enough for extracting last sample\n this.eof_flag_ = true;\n this.has_last_incomplete_data = true;\n break;\n }\n\n let adts_header_length = (protection_absent === 1) ? 7 : 9;\n let adts_frame_payload_length = aac_frame_length - adts_header_length;\n\n offset += adts_header_length;\n\n let next_syncword_offset = this.findNextSyncwordOffset(offset + adts_frame_payload_length);\n this.current_syncword_offset_ = next_syncword_offset;\n\n if ((ID !== 0 && ID !== 1) || layer !== 0) {\n // invalid adts frame ?\n continue;\n }\n\n let frame_data = data.subarray(offset, offset + adts_frame_payload_length);\n\n aac_frame = new AACFrame();\n aac_frame.audio_object_type = (profile + 1) as MPEG4AudioObjectTypes;\n aac_frame.sampling_freq_index = sampling_frequency_index as MPEG4SamplingFrequencyIndex;\n aac_frame.sampling_frequency = MPEG4SamplingFrequencies[sampling_frequency_index];\n aac_frame.channel_config = channel_configuration;\n aac_frame.data = frame_data;\n }\n\n return aac_frame;\n }\n\n public hasIncompleteData(): boolean {\n return this.has_last_incomplete_data;\n }\n\n public getIncompleteData(): Uint8Array {\n if (!this.has_last_incomplete_data) {\n return null;\n }\n\n return this.data_.subarray(this.current_syncword_offset_);\n }\n}\n\nexport class AudioSpecificConfig {\n\n public config: Array;\n public sampling_rate: number;\n public channel_count: number;\n public codec_mimetype: string;\n public original_codec_mimetype: string;\n\n public constructor(frame: AACFrame) {\n let config: Array = null;\n\n let original_audio_object_type = frame.audio_object_type;\n let audio_object_type = frame.audio_object_type;\n let sampling_index = frame.sampling_freq_index;\n let channel_config = frame.channel_config;\n let extension_sampling_index = 0;\n\n let userAgent = navigator.userAgent.toLowerCase();\n\n if (userAgent.indexOf('firefox') !== -1) {\n // firefox: use SBR (HE-AAC) if freq less than 24kHz\n if (sampling_index >= 6) {\n audio_object_type = 5;\n config = new Array(4);\n extension_sampling_index = sampling_index - 3;\n } else { // use LC-AAC\n audio_object_type = 2;\n config = new Array(2);\n extension_sampling_index = sampling_index;\n }\n } else if (userAgent.indexOf('android') !== -1) {\n // android: always use LC-AAC\n audio_object_type = 2;\n config = new Array(2);\n extension_sampling_index = sampling_index;\n } else {\n // for other browsers, e.g. chrome...\n // Always use HE-AAC to make it easier to switch aac codec profile\n audio_object_type = 5;\n extension_sampling_index = sampling_index;\n config = new Array(4);\n\n if (sampling_index >= 6) {\n extension_sampling_index = sampling_index - 3;\n } else if (channel_config === 1) { // Mono channel\n audio_object_type = 2;\n config = new Array(2);\n extension_sampling_index = sampling_index;\n }\n }\n\n config[0] = audio_object_type << 3;\n config[0] |= (sampling_index & 0x0F) >>> 1;\n config[1] = (sampling_index & 0x0F) << 7;\n config[1] |= (channel_config & 0x0F) << 3;\n if (audio_object_type === 5) {\n config[1] |= ((extension_sampling_index & 0x0F) >>> 1);\n config[2] = (extension_sampling_index & 0x01) << 7;\n // extended audio object type: force to 2 (LC-AAC)\n config[2] |= (2 << 2);\n config[3] = 0;\n }\n\n this.config = config;\n this.sampling_rate = MPEG4SamplingFrequencies[sampling_index];\n this.channel_count = channel_config;\n this.codec_mimetype = 'mp4a.40.' + audio_object_type;\n this.original_codec_mimetype = 'mp4a.40.' + original_audio_object_type;\n }\n\n}\n","// ISO/IEC 13818-1 PES packets containing private data (stream_type=0x06)\nexport class PESPrivateData {\n pid: number;\n stream_id: number;\n pts?: number;\n dts?: number;\n nearest_pts?: number;\n data: Uint8Array;\n len: number;\n}\n\nexport class PESPrivateDataDescriptor {\n pid: number;\n stream_type: number;\n descriptor: Uint8Array;\n}\n","import Log from \"../utils/logger\";\n\nexport enum H265NaluType {\n kSliceIDR_W_RADL = 19,\n kSliceIDR_N_LP = 20,\n kSliceCRA_NUT = 21,\n kSliceVPS = 32,\n kSliceSPS = 33,\n kSlicePPS = 34,\n kSliceAUD = 35,\n}\n\nexport class H265NaluPayload {\n type: H265NaluType;\n data: Uint8Array;\n}\n\nexport class H265NaluHVC1 {\n type: H265NaluType;\n data: Uint8Array;\n\n constructor(nalu: H265NaluPayload) {\n let nalu_size = nalu.data.byteLength;\n\n this.type = nalu.type;\n this.data = new Uint8Array(4 + nalu_size); // 4 byte length-header + nalu payload\n\n let v = new DataView(this.data.buffer);\n // Fill 4 byte length-header\n v.setUint32(0, nalu_size);\n // Copy payload\n this.data.set(nalu.data, 4);\n }\n}\n\nexport class H265AnnexBParser {\n\n private readonly TAG: string = \"H265AnnexBParser\";\n\n private data_: Uint8Array;\n private current_startcode_offset_: number = 0;\n private eof_flag_: boolean = false;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_startcode_offset_ = this.findNextStartCodeOffset(0);\n if (this.eof_flag_) {\n Log.e(this.TAG, \"Could not find H265 startcode until payload end!\");\n }\n }\n\n private findNextStartCodeOffset(start_offset: number) {\n let i = start_offset;\n let data = this.data_;\n\n while (true) {\n if (i + 3 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 00 00 00 01 or 00 00 01\n let uint32 = (data[i + 0] << 24)\n | (data[i + 1] << 16)\n | (data[i + 2] << 8)\n | (data[i + 3]);\n let uint24 = (data[i + 0] << 16)\n | (data[i + 1] << 8)\n | (data[i + 2]);\n if (uint32 === 0x00000001 || uint24 === 0x000001) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextNaluPayload(): H265NaluPayload | null {\n let data = this.data_;\n let nalu_payload: H265NaluPayload = null;\n\n while (nalu_payload == null) {\n if (this.eof_flag_) {\n break;\n }\n // offset pointed to start code\n let startcode_offset = this.current_startcode_offset_;\n\n // nalu payload start offset\n let offset = startcode_offset;\n let u32 = (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | (data[offset + 3]);\n if (u32 === 0x00000001) {\n offset += 4;\n } else {\n offset += 3;\n }\n\n let nalu_type: H265NaluType = (data[offset] >> 1) & 0x3F;\n let forbidden_bit = (data[offset] & 0x80) >>> 7;\n\n let next_startcode_offset = this.findNextStartCodeOffset(offset);\n this.current_startcode_offset_ = next_startcode_offset;\n\n if (forbidden_bit !== 0) {\n // Log.e(this.TAG, `forbidden_bit near offset ${offset} should be 0 but has value ${forbidden_bit}`);\n continue;\n }\n\n let payload_data = data.subarray(offset, next_startcode_offset);\n\n nalu_payload = new H265NaluPayload();\n nalu_payload.type = nalu_type;\n nalu_payload.data = payload_data;\n }\n\n return nalu_payload;\n }\n\n}\n\nexport type HEVCDecoderConfigurationRecordType = {\n configurationVersion: 1;\n} & VPSHEVCDecoderConfigurationRecordType & SPSHEVCDecoderConfigurationRecordType & PPSHEVCDecoderConfigurationRecordType;\n\nexport type VPSHEVCDecoderConfigurationRecordType = {\n num_temporal_layers: number;\n temporal_id_nested: boolean;\n}\n\nexport type SPSHEVCDecoderConfigurationRecordType = {\n general_profile_space: number;\n general_tier_flag: number;\n general_profile_idc: number;\n general_profile_compatibility_flags_1: number;\n general_profile_compatibility_flags_2: number;\n general_profile_compatibility_flags_3: number;\n general_profile_compatibility_flags_4: number;\n general_constraint_indicator_flags_1: number;\n general_constraint_indicator_flags_2: number;\n general_constraint_indicator_flags_3: number;\n general_constraint_indicator_flags_4: number;\n general_constraint_indicator_flags_5: number;\n general_constraint_indicator_flags_6: number;\n constant_frame_rate: number;\n min_spatial_segmentation_idc: number;\n chroma_format_idc: number,\n bit_depth_luma_minus8: number,\n bit_depth_chroma_minus8: number,\n}\n\nexport type PPSHEVCDecoderConfigurationRecordType = {\n parallelismType: number;\n}\n\nexport class HEVCDecoderConfigurationRecord {\n\n private data: Uint8Array;\n\n // sps, pps: require Nalu without 4 byte length-header\n public constructor(vps: Uint8Array, sps: Uint8Array, pps: Uint8Array, detail: HEVCDecoderConfigurationRecordType) {\n let length = 23 + (3 + 2 + vps.byteLength) + (3 + 2 + sps.byteLength) + (3 + 2 + pps.byteLength);\n let data = this.data = new Uint8Array(length);\n\n data[0] = 0x01; // configurationVersion\n data[1] = ((detail.general_profile_space & 0x03) << 6) | ((detail.general_tier_flag ? 1 : 0) << 5) | ((detail.general_profile_idc & 0x1F));\n data[2] = detail.general_profile_compatibility_flags_1;\n data[3] = detail.general_profile_compatibility_flags_2;\n data[4] = detail.general_profile_compatibility_flags_3;\n data[5] = detail.general_profile_compatibility_flags_4;\n data[6] = detail.general_constraint_indicator_flags_1;\n data[7] = detail.general_constraint_indicator_flags_2;\n data[8] = detail.general_constraint_indicator_flags_3;\n data[9] = detail.general_constraint_indicator_flags_4;\n data[10] = detail.general_constraint_indicator_flags_5;\n data[11] = detail.general_constraint_indicator_flags_6;\n data[12] = 0x3C;\n data[13] = 0xF0 | ((detail.min_spatial_segmentation_idc & 0x0F00) >> 8)\n data[14] = (detail.min_spatial_segmentation_idc & 0xFF);\n data[15] = 0xFC | (detail.parallelismType & 0x03);\n data[16] = 0xFC | (detail.chroma_format_idc & 0x03);\n data[17] = 0xF8 | (detail.bit_depth_luma_minus8 & 0x07);\n data[18] = 0xF8 | (detail.bit_depth_chroma_minus8 & 0x07);\n data[19] = 0;\n data[20] = 0;\n data[21] = ((detail.constant_frame_rate & 0x03) << 6) | ((detail.num_temporal_layers & 0x07) << 3) | ((detail.temporal_id_nested ? 1 : 0) << 2) | 3;\n data[22] = 3;\n data[23 + 0 + 0] = 0x80 | H265NaluType.kSliceVPS;\n data[23 + 0 + 1] = 0;\n data[23 + 0 + 2] = 1;\n data[23 + 0 + 3] = (vps.byteLength & 0xFF00) >> 8;\n data[23 + 0 + 4] = (vps.byteLength & 0x00FF) >> 0;\n data.set(vps, 23 + 0 + 5);\n data[23 + (5 + vps.byteLength) + 0] = 0x80 | H265NaluType.kSliceSPS;\n data[23 + (5 + vps.byteLength) + 1] = 0;\n data[23 + (5 + vps.byteLength) + 2] = 1;\n data[23 + (5 + vps.byteLength) + 3] = (sps.byteLength & 0xFF00) >> 8;\n data[23 + (5 + vps.byteLength) + 4] = (sps.byteLength & 0x00FF) >> 0;\n data.set(sps, 23 + (5 + vps.byteLength) + 5);\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 0] = 0x80 | H265NaluType.kSlicePPS;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 1] = 0;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 2] = 1;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 3] = (pps.byteLength & 0xFF00) >> 8;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 4] = (pps.byteLength & 0x00FF) >> 0;\n data.set(pps, 23 + (5 + vps.byteLength + 5 + sps.byteLength) + 5);\n }\n\n public getData() {\n return this.data;\n }\n\n}\n","import ExpGolomb from \"./exp-golomb\";\n\nexport class SMPTE2038Data {\n pid: number;\n stream_id: number;\n pts?: number;\n dts?: number;\n nearest_pts?: number;\n ancillaries: AncillaryData[];\n data: Uint8Array;\n len: number;\n}\n\ntype AncillaryData = {\n yc_indicator: boolean;\n line_number: number;\n horizontal_offset: number;\n did: number;\n sdid: number;\n user_data: Uint8Array;\n description: string;\n information: any;\n}\n\n\nexport const smpte2038parse = (data: Uint8Array) => {\n let gb = new ExpGolomb(data);\n let readBits = 0;\n\n let ancillaries: AncillaryData[] = [];\n while (true) {\n let zero = gb.readBits(6); readBits += 6;\n if (zero !== 0) { break; }\n let YC_indicator = gb.readBool(); readBits += 1;\n let line_number = gb.readBits(11); readBits += 11;\n let horizontal_offset = gb.readBits(12); readBits += 12;\n let data_ID = gb.readBits(10) & 0xFF; readBits += 10;\n let data_SDID = gb.readBits(10) & 0xFF; readBits += 10;\n let data_count = gb.readBits(10) & 0xFF; readBits += 10;\n let user_data = new Uint8Array(data_count);\n for (let i = 0; i < data_count; i++) {\n let user_data_word = gb.readBits(10) & 0xFF; readBits += 10;\n user_data[i] = user_data_word;\n }\n let checksum_word = gb.readBits(10); readBits += 10;\n\n let description = 'User Defined';\n let information: any = {};\n if (data_ID === 0x41) {\n if (data_SDID === 0x07) {\n description = 'SCTE-104'\n }\n } else if (data_ID === 0x5F) {\n if (data_SDID === 0xDC) {\n description = 'ARIB STD-B37 (1SEG)';\n } else if (data_SDID === 0xDD) {\n description = 'ARIB STD-B37 (ANALOG)';\n } else if (data_SDID === 0xDE) {\n description = 'ARIB STD-B37 (SD)';\n } else if (data_SDID === 0xDF) {\n description = 'ARIB STD-B37 (HD)';\n }\n } else if (data_ID === 0x61) {\n if (data_SDID === 0x01) {\n description = 'EIA-708';\n } else if (data_SDID === 0x02) {\n description = 'EIA-608';\n }\n }\n\n ancillaries.push({\n yc_indicator: YC_indicator,\n line_number,\n horizontal_offset,\n did: data_ID,\n sdid: data_SDID,\n user_data,\n description,\n information\n });\n gb.readBits(8 - (readBits - Math.floor(readBits / 8)) % 8);\n readBits += (8 - (readBits - Math.floor(readBits / 8))) % 8;\n }\n\n gb.destroy();\n gb = null;\n\n return ancillaries;\n}","export class MP3Data {\n object_type: number;\n sample_rate: number;\n channel_count: number;\n\n data: Uint8Array;\n}\n","/*\n * Copyright (C) 2021 magicxqq. All Rights Reserved.\n *\n * @author magicxqq \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger';\nimport DemuxErrors from './demux-errors';\nimport MediaInfo from '../core/media-info';\nimport {IllegalStateException} from '../utils/exception';\nimport BaseDemuxer from './base-demuxer';\nimport { PAT, PESData, SectionData, SliceQueue, PIDToSliceQueues, PMT, ProgramToPMTMap, StreamType } from './pat-pmt-pes';\nimport { AVCDecoderConfigurationRecord, H264AnnexBParser, H264NaluAVC1, H264NaluPayload, H264NaluType } from './h264';\nimport SPSParser from './sps-parser';\nimport { AACADTSParser, AACFrame, AudioSpecificConfig } from './aac';\nimport { MPEG4AudioObjectTypes, MPEG4SamplingFrequencyIndex } from './mpeg4-audio';\nimport { PESPrivateData, PESPrivateDataDescriptor } from './pes-private-data';\nimport { readSCTE35, SCTE35Data } from './scte35';\nimport { H265AnnexBParser, H265NaluHVC1, H265NaluPayload, H265NaluType, HEVCDecoderConfigurationRecord } from './h265';\nimport H265Parser from './h265-parser';\nimport { SMPTE2038Data, smpte2038parse } from './smpte2038';\nimport { MP3Data } from './mp3';\n\ntype AACAudioMetadata = {\n codec: 'aac',\n audio_object_type: MPEG4AudioObjectTypes;\n sampling_freq_index: MPEG4SamplingFrequencyIndex;\n sampling_frequency: number;\n channel_config: number;\n};\ntype MP3AudioMetadata = {\n codec: 'mp3',\n object_type: number,\n sample_rate: number,\n channel_count: number;\n};\ntype AudioData = {\n codec: 'aac';\n data: AACFrame;\n} | {\n codec: 'mp3';\n data: MP3Data;\n}\n\nclass TSDemuxer extends BaseDemuxer {\n\n private readonly TAG: string = 'TSDemuxer';\n\n private config_: any;\n private ts_packet_size_: number;\n private sync_offset_: number;\n private first_parse_: boolean = true;\n\n private media_info_ = new MediaInfo();\n\n private timescale_ = 90;\n private duration_ = 0;\n\n private pat_: PAT;\n private current_program_: number;\n private current_pmt_pid_: number = -1;\n private pmt_: PMT;\n private program_pmt_map_: ProgramToPMTMap = {};\n\n private pes_slice_queues_: PIDToSliceQueues = {};\n private section_slice_queues_: PIDToSliceQueues = {};\n\n private video_metadata_: {\n vps: H265NaluHVC1 | undefined,\n sps: H264NaluAVC1 | H265NaluHVC1 | undefined,\n pps: H264NaluAVC1 | H265NaluHVC1 | undefined,\n details: any\n } = {\n vps: undefined,\n sps: undefined,\n pps: undefined,\n details: undefined\n };\n\n private audio_metadata_: AACAudioMetadata | MP3AudioMetadata = {\n codec: undefined,\n audio_object_type: undefined,\n sampling_freq_index: undefined,\n sampling_frequency: undefined,\n channel_config: undefined\n };\n\n private aac_last_sample_pts_: number = undefined;\n private aac_last_incomplete_data_: Uint8Array = null;\n\n private has_video_ = false;\n private has_audio_ = false;\n private video_init_segment_dispatched_ = false;\n private audio_init_segment_dispatched_ = false;\n private video_metadata_changed_ = false;\n private audio_metadata_changed_ = false;\n\n private video_track_ = {type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0};\n private audio_track_ = {type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0};\n\n public constructor(probe_data: any, config: any) {\n super();\n\n this.ts_packet_size_ = probe_data.ts_packet_size;\n this.sync_offset_ = probe_data.sync_offset;\n this.config_ = config;\n }\n\n public destroy() {\n this.media_info_ = null;\n this.pes_slice_queues_ = null;\n this.section_slice_queues_ = null;\n\n this.video_metadata_ = null;\n this.audio_metadata_ = null;\n this.aac_last_incomplete_data_ = null;\n\n this.video_track_ = null;\n this.audio_track_ = null;\n\n super.destroy();\n }\n\n public static probe(buffer: ArrayBuffer) {\n let data = new Uint8Array(buffer);\n let sync_offset = -1;\n let ts_packet_size = 188;\n\n if (data.byteLength <= 3 * ts_packet_size) {\n return {needMoreData: true};\n }\n\n while (sync_offset === -1) {\n let scan_window = Math.min(1000, data.byteLength - 3 * ts_packet_size);\n\n for (let i = 0; i < scan_window; ) {\n // sync_byte should all be 0x47\n if (data[i] === 0x47\n && data[i + ts_packet_size] === 0x47\n && data[i + 2 * ts_packet_size] === 0x47) {\n sync_offset = i;\n break;\n } else {\n i++;\n }\n }\n\n // find sync_offset failed in previous ts_packet_size\n if (sync_offset === -1) {\n if (ts_packet_size === 188) {\n // try 192 packet size (BDAV, etc.)\n ts_packet_size = 192;\n } else if (ts_packet_size === 192) {\n // try 204 packet size (European DVB, etc.)\n ts_packet_size = 204;\n } else {\n // 192, 204 also failed, exit\n break;\n }\n }\n }\n\n if (sync_offset === -1) {\n // both 188, 192, 204 failed, Non MPEG-TS\n return {match: false};\n }\n\n if (ts_packet_size === 192 && sync_offset >= 4) {\n Log.v('TSDemuxer', `ts_packet_size = 192, m2ts mode`);\n sync_offset -= 4;\n } else if (ts_packet_size === 204) {\n Log.v('TSDemuxer', `ts_packet_size = 204, RS encoded MPEG2-TS stream`);\n }\n\n return {\n match: true,\n consumed: 0,\n ts_packet_size,\n sync_offset\n };\n }\n\n public bindDataSource(loader) {\n loader.onDataArrival = this.parseChunks.bind(this);\n return this;\n }\n\n public resetMediaInfo() {\n this.media_info_ = new MediaInfo();\n }\n\n public parseChunks(chunk: ArrayBuffer, byte_start: number): number {\n if (!this.onError\n || !this.onMediaInfo\n || !this.onTrackMetadata\n || !this.onDataAvailable) {\n throw new IllegalStateException('onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified');\n }\n\n let offset = 0;\n\n if (this.first_parse_) {\n this.first_parse_ = false;\n offset = this.sync_offset_;\n }\n\n while (offset + this.ts_packet_size_ <= chunk.byteLength) {\n let file_position = byte_start + offset;\n\n if (this.ts_packet_size_ === 192) {\n // skip ATS field (2-bits copy-control + 30-bits timestamp) for m2ts\n offset += 4;\n }\n\n let data = new Uint8Array(chunk, offset, 188);\n\n let sync_byte = data[0];\n if (sync_byte !== 0x47) {\n Log.e(this.TAG, `sync_byte = ${sync_byte}, not 0x47`);\n break;\n }\n\n let payload_unit_start_indicator = (data[1] & 0x40) >>> 6;\n let transport_priority = (data[1] & 0x20) >>> 5;\n let pid = ((data[1] & 0x1F) << 8) | data[2];\n let adaptation_field_control = (data[3] & 0x30) >>> 4;\n let continuity_conunter = (data[3] & 0x0F);\n\n let adaptation_field_info: {\n discontinuity_indicator?: number,\n random_access_indicator?: number,\n elementary_stream_priority_indicator?: number\n } = {};\n let ts_payload_start_index = 4;\n\n if (adaptation_field_control == 0x02 || adaptation_field_control == 0x03) {\n let adaptation_field_length = data[4];\n if (5 + adaptation_field_length === 188) {\n // TS packet only has adaption field, jump to next\n offset += 188;\n if (this.ts_packet_size_ === 204) {\n // skip parity word (16 bytes) for RS encoded TS\n offset += 16;\n }\n continue;\n } else {\n // parse leading adaptation_field if has payload\n if (adaptation_field_length > 0) {\n adaptation_field_info = this.parseAdaptationField(chunk,\n offset + 4,\n 1 + adaptation_field_length);\n }\n ts_payload_start_index = 4 + 1 + adaptation_field_length;\n }\n }\n\n if (adaptation_field_control == 0x01 || adaptation_field_control == 0x03) {\n if (pid === 0 || pid === this.current_pmt_pid_ || (this.pmt_ != undefined && this.pmt_.pid_stream_type[pid] === StreamType.kSCTE35)) { // PAT(pid === 0) or PMT or SCTE35\n let ts_payload_length = 188 - ts_payload_start_index;\n\n this.handleSectionSlice(chunk,\n offset + ts_payload_start_index,\n ts_payload_length,\n {\n pid,\n file_position,\n payload_unit_start_indicator,\n continuity_conunter,\n random_access_indicator: adaptation_field_info.random_access_indicator\n });\n } else if (this.pmt_ != undefined && this.pmt_.pid_stream_type[pid] != undefined) {\n // PES\n let ts_payload_length = 188 - ts_payload_start_index;\n let stream_type = this.pmt_.pid_stream_type[pid];\n\n // process PES only for known common_pids\n if (pid === this.pmt_.common_pids.h264\n || pid === this.pmt_.common_pids.h265\n || pid === this.pmt_.common_pids.adts_aac\n || pid === this.pmt_.common_pids.mp3\n || this.pmt_.pes_private_data_pids[pid] === true\n || this.pmt_.timed_id3_pids[pid] === true) {\n this.handlePESSlice(chunk,\n offset + ts_payload_start_index,\n ts_payload_length,\n {\n pid,\n stream_type,\n file_position,\n payload_unit_start_indicator,\n continuity_conunter,\n random_access_indicator: adaptation_field_info.random_access_indicator\n });\n }\n }\n }\n\n offset += 188;\n\n if (this.ts_packet_size_ === 204) {\n // skip parity word (16 bytes) for RS encoded TS\n offset += 16;\n }\n }\n\n // dispatch parsed frames to the remuxer (consumer)\n this.dispatchAudioVideoMediaSegment();\n\n return offset; // consumed bytes\n }\n\n private parseAdaptationField(buffer: ArrayBuffer, offset: number, length: number): {\n discontinuity_indicator?: number,\n random_access_indicator?: number,\n elementary_stream_priority_indicator?: number\n } {\n let data = new Uint8Array(buffer, offset, length);\n\n let adaptation_field_length = data[0];\n if (adaptation_field_length > 0) {\n if (adaptation_field_length > 183) {\n Log.w(this.TAG, `Illegal adaptation_field_length: ${adaptation_field_length}`);\n return {};\n }\n\n let discontinuity_indicator: number = (data[1] & 0x80) >>> 7;\n let random_access_indicator: number = (data[1] & 0x40) >>> 6;\n let elementary_stream_priority_indicator: number = (data[1] & 0x20) >>> 5;\n\n return {\n discontinuity_indicator,\n random_access_indicator,\n elementary_stream_priority_indicator\n };\n }\n\n return {};\n }\n\n private handleSectionSlice(buffer: ArrayBuffer, offset: number, length: number, misc: any): void {\n let data = new Uint8Array(buffer, offset, length);\n let slice_queue = this.section_slice_queues_[misc.pid];\n\n if (misc.payload_unit_start_indicator) {\n let pointer_field = data[0];\n\n if (slice_queue != undefined && slice_queue.total_length !== 0) {\n let remain_section = new Uint8Array(buffer, offset + 1, Math.min(length, pointer_field));\n slice_queue.slices.push(remain_section);\n slice_queue.total_length += remain_section.byteLength;\n\n if (slice_queue.total_length === slice_queue.expected_length) {\n this.emitSectionSlices(slice_queue, misc);\n } else {\n this.clearSlices(slice_queue, misc);\n }\n }\n\n for (let i = 1 + pointer_field; i < data.byteLength; ){\n let table_id = data[i + 0];\n if (table_id === 0xFF) { break; }\n\n let section_length = ((data[i + 1] & 0x0F) << 8) | data[i + 2];\n\n this.section_slice_queues_[misc.pid] = new SliceQueue();\n slice_queue = this.section_slice_queues_[misc.pid];\n\n slice_queue.expected_length = section_length + 3;\n slice_queue.file_position = misc.file_position;\n slice_queue.random_access_indicator = misc.random_access_indicator;\n\n let remain_section = new Uint8Array(buffer, offset + i, Math.min(length - i, slice_queue.expected_length - slice_queue.total_length));\n slice_queue.slices.push(remain_section);\n slice_queue.total_length += remain_section.byteLength;\n\n if (slice_queue.total_length === slice_queue.expected_length) {\n this.emitSectionSlices(slice_queue, misc);\n } else if (slice_queue.total_length >= slice_queue.expected_length) {\n this.clearSlices(slice_queue, misc);\n }\n\n i += remain_section.byteLength;\n }\n } else if (slice_queue != undefined && slice_queue.total_length !== 0) {\n let remain_section = new Uint8Array(buffer, offset, Math.min(length, slice_queue.expected_length - slice_queue.total_length));\n slice_queue.slices.push(remain_section);\n slice_queue.total_length += remain_section.byteLength;\n\n if (slice_queue.total_length === slice_queue.expected_length) {\n this.emitSectionSlices(slice_queue, misc);\n } else if (slice_queue.total_length >= slice_queue.expected_length) {\n this.clearSlices(slice_queue, misc);\n }\n }\n }\n\n private handlePESSlice(buffer: ArrayBuffer, offset: number, length: number, misc: any): void {\n let data = new Uint8Array(buffer, offset, length);\n\n let packet_start_code_prefix = (data[0] << 16) | (data[1] << 8) | (data[2]);\n let stream_id = data[3];\n let PES_packet_length = (data[4] << 8) | data[5];\n\n if (misc.payload_unit_start_indicator) {\n if (packet_start_code_prefix !== 1) {\n Log.e(this.TAG, `handlePESSlice: packet_start_code_prefix should be 1 but with value ${packet_start_code_prefix}`);\n return;\n }\n\n // handle queued PES slices:\n // Merge into a big Uint8Array then call parsePES()\n let slice_queue = this.pes_slice_queues_[misc.pid];\n if (slice_queue) {\n if (slice_queue.expected_length === 0 || slice_queue.expected_length === slice_queue.total_length) {\n this.emitPESSlices(slice_queue, misc);\n } else {\n this.clearSlices(slice_queue, misc);\n }\n }\n\n // Make a new PES queue for new PES slices\n this.pes_slice_queues_[misc.pid] = new SliceQueue();\n this.pes_slice_queues_[misc.pid].file_position = misc.file_position;\n this.pes_slice_queues_[misc.pid].random_access_indicator = misc.random_access_indicator;\n }\n\n if (this.pes_slice_queues_[misc.pid] == undefined) {\n // ignore PES slices without [PES slice that has payload_unit_start_indicator]\n return;\n }\n\n // push subsequent PES slices into pes_queue\n let slice_queue = this.pes_slice_queues_[misc.pid];\n slice_queue.slices.push(data);\n if (misc.payload_unit_start_indicator) {\n slice_queue.expected_length = PES_packet_length === 0 ? 0 : PES_packet_length + 6;\n }\n slice_queue.total_length += data.byteLength;\n\n if (slice_queue.expected_length > 0 && slice_queue.expected_length === slice_queue.total_length) {\n this.emitPESSlices(slice_queue, misc);\n } else if (slice_queue.expected_length > 0 && slice_queue.expected_length < slice_queue.total_length) {\n this.clearSlices(slice_queue, misc);\n }\n }\n\n private emitSectionSlices(slice_queue: SliceQueue, misc: any): void {\n let data = new Uint8Array(slice_queue.total_length);\n for (let i = 0, offset = 0; i < slice_queue.slices.length; i++) {\n let slice = slice_queue.slices[i];\n data.set(slice, offset);\n offset += slice.byteLength;\n }\n slice_queue.slices = [];\n slice_queue.expected_length = -1;\n slice_queue.total_length = 0;\n\n let section_data = new SectionData();\n section_data.pid = misc.pid;\n section_data.data = data;\n section_data.file_position = slice_queue.file_position;\n section_data.random_access_indicator = slice_queue.random_access_indicator;\n this.parseSection(section_data);\n }\n\n private emitPESSlices(slice_queue: SliceQueue, misc: any): void {\n let data = new Uint8Array(slice_queue.total_length);\n for (let i = 0, offset = 0; i < slice_queue.slices.length; i++) {\n let slice = slice_queue.slices[i];\n data.set(slice, offset);\n offset += slice.byteLength;\n }\n slice_queue.slices = [];\n slice_queue.expected_length = -1;\n slice_queue.total_length = 0;\n\n let pes_data = new PESData();\n pes_data.pid = misc.pid;\n pes_data.data = data;\n pes_data.stream_type = misc.stream_type;\n pes_data.file_position = slice_queue.file_position;\n pes_data.random_access_indicator = slice_queue.random_access_indicator;\n this.parsePES(pes_data);\n }\n\n private clearSlices(slice_queue: SliceQueue, misc: any): void {\n slice_queue.slices = [];\n slice_queue.expected_length = -1;\n slice_queue.total_length = 0;\n }\n\n private parseSection(section_data: SectionData): void {\n let data = section_data.data;\n let pid = section_data.pid;\n\n if (pid === 0x00) {\n this.parsePAT(data);\n } else if (pid === this.current_pmt_pid_) {\n this.parsePMT(data);\n } else if (this.pmt_ != undefined && this.pmt_.scte_35_pids[pid]) {\n this.parseSCTE35(data);\n }\n }\n\n private parsePES(pes_data: PESData): void {\n let data = pes_data.data;\n let packet_start_code_prefix = (data[0] << 16) | (data[1] << 8) | (data[2]);\n let stream_id = data[3];\n let PES_packet_length = (data[4] << 8) | data[5];\n\n if (packet_start_code_prefix !== 1) {\n Log.e(this.TAG, `parsePES: packet_start_code_prefix should be 1 but with value ${packet_start_code_prefix}`);\n return;\n }\n\n if (stream_id !== 0xBC // program_stream_map\n && stream_id !== 0xBE // padding_stream\n && stream_id !== 0xBF // private_stream_2\n && stream_id !== 0xF0 // ECM\n && stream_id !== 0xF1 // EMM\n && stream_id !== 0xFF // program_stream_directory\n && stream_id !== 0xF2 // DSMCC\n && stream_id !== 0xF8) {\n let PES_scrambling_control = (data[6] & 0x30) >>> 4;\n let PTS_DTS_flags = (data[7] & 0xC0) >>> 6;\n let PES_header_data_length = data[8];\n\n let pts: number | undefined;\n let dts: number | undefined;\n\n if (PTS_DTS_flags === 0x02 || PTS_DTS_flags === 0x03) {\n pts = (data[9] & 0x0E) * 536870912 + // 1 << 29\n (data[10] & 0xFF) * 4194304 + // 1 << 22\n (data[11] & 0xFE) * 16384 + // 1 << 14\n (data[12] & 0xFF) * 128 + // 1 << 7\n (data[13] & 0xFE) / 2;\n\n if (PTS_DTS_flags === 0x03) {\n dts = (data[14] & 0x0E) * 536870912 + // 1 << 29\n (data[15] & 0xFF) * 4194304 + // 1 << 22\n (data[16] & 0xFE) * 16384 + // 1 << 14\n (data[17] & 0xFF) * 128 + // 1 << 7\n (data[18] & 0xFE) / 2;\n } else {\n dts = pts;\n }\n }\n\n let payload_start_index = 6 + 3 + PES_header_data_length;\n let payload_length: number;\n\n if (PES_packet_length !== 0) {\n if (PES_packet_length < 3 + PES_header_data_length) {\n Log.v(this.TAG, `Malformed PES: PES_packet_length < 3 + PES_header_data_length`);\n return;\n }\n payload_length = PES_packet_length - 3 - PES_header_data_length;\n } else { // PES_packet_length === 0\n payload_length = data.byteLength - payload_start_index;\n }\n\n let payload = data.subarray(payload_start_index, payload_start_index + payload_length);\n\n switch (pes_data.stream_type) {\n case StreamType.kMPEG1Audio:\n case StreamType.kMPEG2Audio:\n this.parseMP3Payload(payload, pts);\n break;\n case StreamType.kPESPrivateData:\n if (this.pmt_.smpte2038_pids[pes_data.pid]) {\n this.parseSMPTE2038MetadataPayload(payload, pts, dts, pes_data.pid, stream_id);\n } else {\n this.parsePESPrivateDataPayload(payload, pts, dts, pes_data.pid, stream_id);\n }\n break;\n case StreamType.kADTSAAC:\n this.parseAACPayload(payload, pts);\n break;\n case StreamType.kID3:\n this.parseTimedID3MetadataPayload(payload, pts, dts, pes_data.pid, stream_id);\n break;\n case StreamType.kH264:\n this.parseH264Payload(payload, pts, dts, pes_data.file_position, pes_data.random_access_indicator);\n break;\n case StreamType.kH265:\n this.parseH265Payload(payload, pts, dts, pes_data.file_position, pes_data.random_access_indicator);\n break;\n default:\n break;\n }\n } else if (stream_id === 0xBC // program_stream_map\n || stream_id === 0xBF // private_stream_2\n || stream_id === 0xF0 // ECM\n || stream_id === 0xF1 // EMM\n || stream_id === 0xFF // program_stream_directory\n || stream_id === 0xF2 // DSMCC_stream\n || stream_id === 0xF8) { // ITU-T Rec. H.222.1 type E stream\n if (pes_data.stream_type === StreamType.kPESPrivateData) {\n let payload_start_index = 6;\n let payload_length: number;\n\n if (PES_packet_length !== 0) {\n payload_length = PES_packet_length;\n } else { // PES_packet_length === 0\n payload_length = data.byteLength - payload_start_index;\n }\n\n let payload = data.subarray(payload_start_index, payload_start_index + payload_length);\n this.parsePESPrivateDataPayload(payload, undefined, undefined, pes_data.pid, stream_id);\n }\n }\n }\n\n private parsePAT(data: Uint8Array): void {\n let table_id = data[0];\n if (table_id !== 0x00) {\n Log.e(this.TAG, `parsePAT: table_id ${table_id} is not corresponded to PAT!`);\n return;\n }\n\n let section_length = ((data[1] & 0x0F) << 8) | data[2];\n\n let transport_stream_id = (data[3] << 8) | data[4];\n let version_number = (data[5] & 0x3E) >>> 1;\n let current_next_indicator = data[5] & 0x01;\n let section_number = data[6];\n let last_section_number = data[7];\n\n let pat: PAT = null;\n\n if (current_next_indicator === 1 && section_number === 0) {\n pat = new PAT();\n pat.version_number = version_number;\n } else {\n pat = this.pat_;\n if (pat == undefined) {\n return;\n }\n }\n\n let program_start_index = 8;\n let program_bytes = section_length - 5 - 4; // section_length - (headers + crc)\n let first_program_number = -1;\n let first_pmt_pid = -1;\n\n for (let i = program_start_index; i < program_start_index + program_bytes; i += 4) {\n let program_number = (data[i] << 8) | data[i + 1];\n let pid = ((data[i + 2] & 0x1F) << 8) | data[i + 3];\n\n if (program_number === 0) {\n // network_PID\n pat.network_pid = pid;\n } else {\n // program_map_PID\n pat.program_pmt_pid[program_number] = pid;\n\n if (first_program_number === -1) {\n first_program_number = program_number;\n }\n\n if (first_pmt_pid === -1) {\n first_pmt_pid = pid;\n }\n }\n }\n\n // Currently we only deal with first appeared PMT pid\n if (current_next_indicator === 1 && section_number === 0) {\n if (this.pat_ == undefined) {\n Log.v(this.TAG, `Parsed first PAT: ${JSON.stringify(pat)}`);\n }\n this.pat_ = pat;\n this.current_program_ = first_program_number;\n this.current_pmt_pid_ = first_pmt_pid;\n }\n }\n\n private parsePMT(data: Uint8Array): void {\n let table_id = data[0];\n if (table_id !== 0x02) {\n Log.e(this.TAG, `parsePMT: table_id ${table_id} is not corresponded to PMT!`);\n return;\n }\n\n let section_length = ((data[1] & 0x0F) << 8) | data[2];\n\n let program_number = (data[3] << 8) | data[4];\n let version_number = (data[5] & 0x3E) >>> 1;\n let current_next_indicator = data[5] & 0x01;\n let section_number = data[6];\n let last_section_number = data[7];\n\n let pmt: PMT = null;\n\n if (current_next_indicator === 1 && section_number === 0) {\n pmt = new PMT();\n pmt.program_number = program_number;\n pmt.version_number = version_number;\n this.program_pmt_map_[program_number] = pmt;\n } else {\n pmt = this.program_pmt_map_[program_number];\n if (pmt == undefined) {\n return;\n }\n }\n\n let PCR_PID = ((data[8] & 0x1F) << 8) | data[9];\n let program_info_length = ((data[10] & 0x0F) << 8) | data[11];\n\n let info_start_index = 12 + program_info_length;\n let info_bytes = section_length - 9 - program_info_length - 4;\n\n for (let i = info_start_index; i < info_start_index + info_bytes; ) {\n let stream_type = data[i] as StreamType;\n let elementary_PID = ((data[i + 1] & 0x1F) << 8) | data[i + 2];\n let ES_info_length = ((data[i + 3] & 0x0F) << 8) | data[i + 4];\n\n pmt.pid_stream_type[elementary_PID] = stream_type;\n\n if (stream_type === StreamType.kH264 && !pmt.common_pids.h264 && !pmt.common_pids.h265) {\n pmt.common_pids.h264 = elementary_PID;\n } else if (stream_type === StreamType.kH265 && !pmt.common_pids.h264 && !pmt.common_pids.h265) {\n pmt.common_pids.h265 = elementary_PID;\n } else if (stream_type === StreamType.kADTSAAC && !pmt.common_pids.adts_aac) {\n pmt.common_pids.adts_aac = elementary_PID;\n } else if ((stream_type === StreamType.kMPEG1Audio || stream_type === StreamType.kMPEG2Audio) && !pmt.common_pids.mp3) {\n pmt.common_pids.mp3 = elementary_PID;\n } else if (stream_type === StreamType.kPESPrivateData) {\n pmt.pes_private_data_pids[elementary_PID] = true;\n if (ES_info_length > 0) {\n // parse descriptor for PES private data\n for (let offset = i + 5; offset < i + 5 + ES_info_length; ) {\n let tag = data[offset + 0];\n let length = data[offset + 1];\n if (tag === 0x05) { // Registration Descriptor\n let registration = String.fromCharCode(... Array.from(data.subarray(offset + 2, offset + 2 + length)));\n\n if (registration === 'VANC') {\n pmt.smpte2038_pids[elementary_PID] = true;\n }\n }\n offset += 2 + length;\n }\n // provide descriptor for PES private data via callback\n let descriptors = data.subarray(i + 5, i + 5 + ES_info_length);\n this.dispatchPESPrivateDataDescriptor(elementary_PID, stream_type, descriptors);\n }\n } else if (stream_type === StreamType.kID3) {\n pmt.timed_id3_pids[elementary_PID] = true;\n } else if (stream_type === StreamType.kSCTE35) {\n pmt.scte_35_pids[elementary_PID] = true;\n }\n\n i += 5 + ES_info_length;\n }\n\n if (program_number === this.current_program_) {\n if (this.pmt_ == undefined) {\n Log.v(this.TAG, `Parsed first PMT: ${JSON.stringify(pmt)}`);\n }\n this.pmt_ = pmt;\n if (pmt.common_pids.h264 || pmt.common_pids.h265) {\n this.has_video_ = true;\n }\n if (pmt.common_pids.adts_aac || pmt.common_pids.mp3) {\n this.has_audio_ = true;\n }\n }\n }\n\n private parseSCTE35(data: Uint8Array): void {\n const scte35 = readSCTE35(data);\n\n if (scte35.pts != undefined) {\n let pts_ms = Math.floor(scte35.pts / this.timescale_);\n scte35.pts = pts_ms;\n } else {\n scte35.nearest_pts = this.aac_last_sample_pts_;\n }\n\n if (this.onSCTE35Metadata) {\n this.onSCTE35Metadata(scte35);\n }\n }\n\n private parseH264Payload(data: Uint8Array, pts: number, dts: number, file_position: number, random_access_indicator: number) {\n let annexb_parser = new H264AnnexBParser(data);\n let nalu_payload: H264NaluPayload = null;\n let units: {type: H264NaluType, data: Uint8Array}[] = [];\n let length = 0;\n let keyframe = false;\n\n while ((nalu_payload = annexb_parser.readNextNaluPayload()) != null) {\n let nalu_avc1 = new H264NaluAVC1(nalu_payload);\n\n if (nalu_avc1.type === H264NaluType.kSliceSPS) {\n // Notice: parseSPS requires Nalu without startcode or length-header\n let details = SPSParser.parseSPS(nalu_payload.data);\n if (!this.video_init_segment_dispatched_) {\n this.video_metadata_.sps = nalu_avc1;\n this.video_metadata_.details = details;\n } else if (this.detectVideoMetadataChange(nalu_avc1, details) === true) {\n Log.v(this.TAG, `H264: Critical h264 metadata has been changed, attempt to re-generate InitSegment`);\n this.video_metadata_changed_ = true;\n this.video_metadata_ = {vps: undefined, sps: nalu_avc1, pps: undefined, details: details};\n }\n } else if (nalu_avc1.type === H264NaluType.kSlicePPS) {\n if (!this.video_init_segment_dispatched_ || this.video_metadata_changed_) {\n this.video_metadata_.pps = nalu_avc1;\n if (this.video_metadata_.sps && this.video_metadata_.pps) {\n if (this.video_metadata_changed_) {\n // flush stashed frames before changing codec metadata\n this.dispatchVideoMediaSegment();\n }\n // notify new codec metadata (maybe changed)\n this.dispatchVideoInitSegment();\n }\n }\n } else if (nalu_avc1.type === H264NaluType.kSliceIDR) {\n keyframe = true;\n } else if (nalu_avc1.type === H264NaluType.kSliceNonIDR && random_access_indicator === 1) {\n // For open-gop stream, use random_access_indicator to identify keyframe\n keyframe = true;\n }\n\n // Push samples to remuxer only if initialization metadata has been dispatched\n if (this.video_init_segment_dispatched_) {\n units.push(nalu_avc1);\n length += nalu_avc1.data.byteLength;\n }\n }\n\n let pts_ms = Math.floor(pts / this.timescale_);\n let dts_ms = Math.floor(dts / this.timescale_);\n\n if (units.length) {\n let track = this.video_track_;\n let avc_sample = {\n units,\n length,\n isKeyframe: keyframe,\n dts: dts_ms,\n pts: pts_ms,\n cts: pts_ms - dts_ms,\n file_position\n };\n track.samples.push(avc_sample);\n track.length += length;\n }\n }\n\n private parseH265Payload(data: Uint8Array, pts: number, dts: number, file_position: number, random_access_indicator: number) {\n let annexb_parser = new H265AnnexBParser(data);\n let nalu_payload: H265NaluPayload = null;\n let units: {type: H265NaluType, data: Uint8Array}[] = [];\n let length = 0;\n let keyframe = false;\n\n while ((nalu_payload = annexb_parser.readNextNaluPayload()) != null) {\n let nalu_hvc1 = new H265NaluHVC1(nalu_payload);\n\n if (nalu_hvc1.type === H265NaluType.kSliceVPS) {\n if (!this.video_init_segment_dispatched_) {\n let details = H265Parser.parseVPS(nalu_payload.data);\n this.video_metadata_.vps = nalu_hvc1;\n this.video_metadata_.details = {\n ... this.video_metadata_.details,\n ... details\n };\n }\n } else if (nalu_hvc1.type === H265NaluType.kSliceSPS) {\n let details = H265Parser.parseSPS(nalu_payload.data);\n if (!this.video_init_segment_dispatched_) {\n this.video_metadata_.sps = nalu_hvc1;\n this.video_metadata_.details = {\n ... this.video_metadata_.details,\n ... details\n };\n } else if (this.detectVideoMetadataChange(nalu_hvc1, details) === true) {\n Log.v(this.TAG, `H265: Critical h265 metadata has been changed, attempt to re-generate InitSegment`);\n this.video_metadata_changed_ = true;\n this.video_metadata_ = { vps: undefined, sps: nalu_hvc1, pps: undefined, details: details};\n }\n } else if (nalu_hvc1.type === H265NaluType.kSlicePPS) {\n if (!this.video_init_segment_dispatched_ || this.video_metadata_changed_) {\n let details = H265Parser.parsePPS(nalu_payload.data);\n this.video_metadata_.pps = nalu_hvc1;\n this.video_metadata_.details = {\n ... this.video_metadata_.details,\n ... details\n };\n\n if (this.video_metadata_.vps && this.video_metadata_.sps && this.video_metadata_.pps) {\n if (this.video_metadata_changed_) {\n // flush stashed frames before changing codec metadata\n this.dispatchVideoMediaSegment();\n }\n // notify new codec metadata (maybe changed)\n this.dispatchVideoInitSegment();\n }\n }\n } else if (nalu_hvc1.type === H265NaluType.kSliceIDR_W_RADL || nalu_hvc1.type === H265NaluType.kSliceIDR_N_LP || nalu_hvc1.type === H265NaluType.kSliceCRA_NUT) {\n keyframe = true;\n }\n\n // Push samples to remuxer only if initialization metadata has been dispatched\n if (this.video_init_segment_dispatched_) {\n units.push(nalu_hvc1);\n length += nalu_hvc1.data.byteLength;\n }\n }\n\n let pts_ms = Math.floor(pts / this.timescale_);\n let dts_ms = Math.floor(dts / this.timescale_);\n\n if (units.length) {\n let track = this.video_track_;\n let hvc_sample = {\n units,\n length,\n isKeyframe: keyframe,\n dts: dts_ms,\n pts: pts_ms,\n cts: pts_ms - dts_ms,\n file_position\n };\n track.samples.push(hvc_sample);\n track.length += length;\n }\n }\n\n private detectVideoMetadataChange(new_sps: H264NaluAVC1 | H265NaluHVC1, new_details: any): boolean {\n if (new_details.codec_mimetype !== this.video_metadata_.details.codec_mimetype) {\n Log.v(this.TAG, `Video: Codec mimeType changed from ` +\n `${this.video_metadata_.details.codec_mimetype} to ${new_details.codec_mimetype}`);\n return true;\n }\n\n if (new_details.codec_size.width !== this.video_metadata_.details.codec_size.width\n || new_details.codec_size.height !== this.video_metadata_.details.codec_size.height) {\n let old_size = this.video_metadata_.details.codec_size;\n let new_size = new_details.codec_size;\n Log.v(this.TAG, `Video: Coded Resolution changed from ` +\n `${old_size.width}x${old_size.height} to ${new_size.width}x${new_size.height}`);\n return true;\n }\n\n if (new_details.present_size.width !== this.video_metadata_.details.present_size.width) {\n Log.v(this.TAG, `Video: Present resolution width changed from ` +\n `${this.video_metadata_.details.present_size.width} to ${new_details.present_size.width}`);\n return true;\n }\n\n return false;\n }\n\n private isInitSegmentDispatched(): boolean {\n if (this.has_video_ && this.has_audio_) { // both video & audio\n return this.video_init_segment_dispatched_ && this.audio_init_segment_dispatched_;\n }\n if (this.has_video_ && !this.has_audio_) { // video only\n return this.video_init_segment_dispatched_;\n }\n if (!this.has_video_ && this.has_audio_) { // audio only\n return this.audio_init_segment_dispatched_;\n }\n return false;\n }\n\n private dispatchVideoInitSegment() {\n let details = this.video_metadata_.details;\n let meta: any = {};\n\n meta.type = 'video';\n meta.id = this.video_track_.id;\n meta.timescale = 1000;\n meta.duration = this.duration_;\n\n meta.codecWidth = details.codec_size.width;\n meta.codecHeight = details.codec_size.height;\n meta.presentWidth = details.present_size.width;\n meta.presentHeight = details.present_size.height;\n\n meta.profile = details.profile_string;\n meta.level = details.level_string;\n meta.bitDepth = details.bit_depth;\n meta.chromaFormat = details.chroma_format;\n meta.sarRatio = details.sar_ratio;\n meta.frameRate = details.frame_rate;\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n meta.refSampleDuration = 1000 * (fps_den / fps_num);\n\n meta.codec = details.codec_mimetype;\n\n if (this.video_metadata_.vps) {\n let vps_without_header = this.video_metadata_.vps.data.subarray(4);\n let sps_without_header = this.video_metadata_.sps.data.subarray(4);\n let pps_without_header = this.video_metadata_.pps.data.subarray(4);\n let hvcc = new HEVCDecoderConfigurationRecord(vps_without_header, sps_without_header, pps_without_header, details);\n meta.hvcc = hvcc.getData();\n\n if (this.video_init_segment_dispatched_ == false) {\n Log.v(this.TAG, `Generated first HEVCDecoderConfigurationRecord for mimeType: ${meta.codec}`);\n }\n } else {\n let sps_without_header = this.video_metadata_.sps.data.subarray(4);\n let pps_without_header = this.video_metadata_.pps.data.subarray(4);\n let avcc = new AVCDecoderConfigurationRecord(sps_without_header, pps_without_header, details);\n meta.avcc = avcc.getData();\n\n if (this.video_init_segment_dispatched_ == false) {\n Log.v(this.TAG, `Generated first AVCDecoderConfigurationRecord for mimeType: ${meta.codec}`);\n }\n }\n this.onTrackMetadata('video', meta);\n this.video_init_segment_dispatched_ = true;\n this.video_metadata_changed_ = false;\n\n // notify new MediaInfo\n let mi = this.media_info_;\n mi.hasVideo = true;\n mi.width = meta.codecWidth;\n mi.height = meta.codecHeight;\n mi.fps = meta.frameRate.fps;\n mi.profile = meta.profile;\n mi.level = meta.level;\n mi.refFrames = details.ref_frames;\n mi.chromaFormat = details.chroma_format_string;\n mi.sarNum = meta.sarRatio.width;\n mi.sarDen = meta.sarRatio.height;\n mi.videoCodec = meta.codec;\n\n if (mi.hasAudio && mi.audioCodec) {\n mi.mimeType = `video/mp2t; codecs=\"${mi.videoCodec},${mi.audioCodec}\"`;\n } else {\n mi.mimeType = `video/mp2t; codecs=\"${mi.videoCodec}\"`;\n }\n\n if (mi.isComplete()) {\n this.onMediaInfo(mi);\n }\n }\n\n private dispatchVideoMediaSegment() {\n if (this.isInitSegmentDispatched()) {\n if (this.video_track_.length) {\n this.onDataAvailable(null, this.video_track_);\n }\n }\n }\n\n private dispatchAudioMediaSegment() {\n if (this.isInitSegmentDispatched()) {\n if (this.audio_track_.length) {\n this.onDataAvailable(this.audio_track_, null);\n }\n }\n }\n\n private dispatchAudioVideoMediaSegment() {\n if (this.isInitSegmentDispatched()) {\n if (this.audio_track_.length || this.video_track_.length) {\n this.onDataAvailable(this.audio_track_, this.video_track_);\n }\n }\n }\n\n private parseAACPayload(data: Uint8Array, pts: number) {\n if (this.has_video_ && !this.video_init_segment_dispatched_) {\n // If first video IDR frame hasn't been detected,\n // Wait for first IDR frame and video init segment being dispatched\n return;\n }\n\n if (this.aac_last_incomplete_data_) {\n let buf = new Uint8Array(data.byteLength + this.aac_last_incomplete_data_.byteLength);\n buf.set(this.aac_last_incomplete_data_, 0);\n buf.set(data, this.aac_last_incomplete_data_.byteLength);\n data = buf;\n }\n\n let ref_sample_duration: number;\n let base_pts_ms: number;\n\n if (pts != undefined) {\n base_pts_ms = pts / this.timescale_;\n }\n if (this.audio_metadata_.codec === 'aac') {\n if (pts == undefined && this.aac_last_sample_pts_ != undefined) {\n ref_sample_duration = 1024 / this.audio_metadata_.sampling_frequency * 1000;\n base_pts_ms = this.aac_last_sample_pts_ + ref_sample_duration;\n } else if (pts == undefined){\n Log.w(this.TAG, `AAC: Unknown pts`);\n return;\n }\n\n if (this.aac_last_incomplete_data_ && this.aac_last_sample_pts_) {\n ref_sample_duration = 1024 / this.audio_metadata_.sampling_frequency * 1000;\n let new_pts_ms = this.aac_last_sample_pts_ + ref_sample_duration;\n\n if (Math.abs(new_pts_ms - base_pts_ms) > 1) {\n Log.w(this.TAG, `AAC: Detected pts overlapped, ` +\n `expected: ${new_pts_ms}ms, PES pts: ${base_pts_ms}ms`);\n base_pts_ms = new_pts_ms;\n }\n }\n }\n\n let adts_parser = new AACADTSParser(data);\n let aac_frame: AACFrame = null;\n let sample_pts_ms = base_pts_ms;\n let last_sample_pts_ms: number;\n\n while ((aac_frame = adts_parser.readNextAACFrame()) != null) {\n ref_sample_duration = 1024 / aac_frame.sampling_frequency * 1000;\n const audio_sample = {\n codec: 'aac',\n data: aac_frame\n } as const;\n\n if (this.audio_init_segment_dispatched_ == false) {\n this.audio_metadata_ = {\n codec: 'aac',\n audio_object_type: aac_frame.audio_object_type,\n sampling_freq_index: aac_frame.sampling_freq_index,\n sampling_frequency: aac_frame.sampling_frequency,\n channel_config: aac_frame.channel_config\n };\n this.dispatchAudioInitSegment(audio_sample);\n } else if (this.detectAudioMetadataChange(audio_sample)) {\n // flush stashed frames before notify new AudioSpecificConfig\n this.dispatchAudioMediaSegment();\n // notify new AAC AudioSpecificConfig\n this.dispatchAudioInitSegment(audio_sample);\n }\n\n last_sample_pts_ms = sample_pts_ms;\n let sample_pts_ms_int = Math.floor(sample_pts_ms);\n\n let aac_sample = {\n unit: aac_frame.data,\n length: aac_frame.data.byteLength,\n pts: sample_pts_ms_int,\n dts: sample_pts_ms_int\n };\n this.audio_track_.samples.push(aac_sample);\n this.audio_track_.length += aac_frame.data.byteLength;\n\n sample_pts_ms += ref_sample_duration;\n }\n\n if (adts_parser.hasIncompleteData()) {\n this.aac_last_incomplete_data_ = adts_parser.getIncompleteData();\n }\n\n if (last_sample_pts_ms) {\n this.aac_last_sample_pts_ = last_sample_pts_ms;\n }\n }\n\n private parseMP3Payload(data: Uint8Array, pts: number) {\n if (this.has_video_ && !this.video_init_segment_dispatched_) {\n // If first video IDR frame hasn't been detected,\n // Wait for first IDR frame and video init segment being dispatched\n return;\n }\n\n let _mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0];\n let _mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0];\n let _mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0];\n let _mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1];\n let _mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1];\n let _mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];\n\n let ver = (data[1] >>> 3) & 0x03;\n let layer = (data[1] & 0x06) >> 1;\n let bitrate_index = (data[2] & 0xF0) >>> 4;\n let sampling_freq_index = (data[2] & 0x0C) >>> 2;\n let channel_mode = (data[3] >>> 6) & 0x03;\n let channel_count = channel_mode !== 3 ? 2 : 1;\n\n let sample_rate = 0;\n let bit_rate = 0;\n let object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types\n\n let codec = 'mp3';\n switch (ver) {\n case 0: // MPEG 2.5\n sample_rate = _mpegAudioV25SampleRateTable[sampling_freq_index];\n break;\n case 2: // MPEG 2\n sample_rate = _mpegAudioV20SampleRateTable[sampling_freq_index];\n break;\n case 3: // MPEG 1\n sample_rate = _mpegAudioV10SampleRateTable[sampling_freq_index];\n break;\n }\n\n switch (layer) {\n case 1: // Layer 3\n object_type = 34;\n if (bitrate_index < _mpegAudioL3BitRateTable.length) {\n bit_rate = _mpegAudioL3BitRateTable[bitrate_index];\n }\n break;\n case 2: // Layer 2\n object_type = 33;\n if (bitrate_index < _mpegAudioL2BitRateTable.length) {\n bit_rate = _mpegAudioL2BitRateTable[bitrate_index];\n }\n break;\n case 3: // Layer 1\n object_type = 32;\n if (bitrate_index < _mpegAudioL1BitRateTable.length) {\n bit_rate = _mpegAudioL1BitRateTable[bitrate_index];\n }\n break;\n }\n\n const sample = new MP3Data();\n sample.object_type = object_type;\n sample.sample_rate = sample_rate;\n sample.channel_count = channel_count;\n sample.data = data;\n const audio_sample = {\n codec: 'mp3',\n data: sample\n } as const;\n\n\n if (this.audio_init_segment_dispatched_ == false) {\n this.audio_metadata_ = {\n codec: 'mp3',\n object_type,\n sample_rate,\n channel_count\n }\n this.dispatchAudioInitSegment(audio_sample);\n } else if (this.detectAudioMetadataChange(audio_sample)) {\n // flush stashed frames before notify new AudioSpecificConfig\n this.dispatchAudioMediaSegment();\n // notify new AAC AudioSpecificConfig\n this.dispatchAudioInitSegment(audio_sample);\n }\n\n let mp3_sample = {\n unit: data,\n length: data.byteLength,\n pts: pts / this.timescale_,\n dts: pts / this.timescale_\n };\n this.audio_track_.samples.push(mp3_sample);\n this.audio_track_.length += data.byteLength;\n }\n\n private detectAudioMetadataChange(sample: AudioData): boolean {\n if (sample.codec !== this.audio_metadata_.codec) {\n Log.v(this.TAG, `Audio: Audio Codecs changed from ` +\n `${this.audio_metadata_.codec} to ${sample.codec}`);\n return true;\n }\n\n if (sample.codec === 'aac' && this.audio_metadata_.codec === 'aac') {\n const frame = sample.data;\n if (frame.audio_object_type !== this.audio_metadata_.audio_object_type) {\n Log.v(this.TAG, `AAC: AudioObjectType changed from ` +\n `${this.audio_metadata_.audio_object_type} to ${frame.audio_object_type}`);\n return true;\n }\n\n if (frame.sampling_freq_index !== this.audio_metadata_.sampling_freq_index) {\n Log.v(this.TAG, `AAC: SamplingFrequencyIndex changed from ` +\n `${this.audio_metadata_.sampling_freq_index} to ${frame.sampling_freq_index}`);\n return true;\n }\n\n if (frame.channel_config !== this.audio_metadata_.channel_config) {\n Log.v(this.TAG, `AAC: Channel configuration changed from ` +\n `${this.audio_metadata_.channel_config} to ${frame.channel_config}`);\n return true;\n }\n } else if (sample.codec === 'mp3' && this.audio_metadata_.codec === 'mp3') {\n const data = sample.data;\n if (data.object_type !== this.audio_metadata_.object_type) {\n Log.v(this.TAG, `MP3: AudioObjectType changed from ` +\n `${this.audio_metadata_.object_type} to ${data.object_type}`);\n return true;\n }\n\n if (data.sample_rate !== this.audio_metadata_.sample_rate) {\n Log.v(this.TAG, `MP3: SamplingFrequencyIndex changed from ` +\n `${this.audio_metadata_.sample_rate} to ${data.sample_rate}`);\n return true;\n }\n\n if (data.channel_count !== this.audio_metadata_.channel_count) {\n Log.v(this.TAG, `MP3: Channel count changed from ` +\n `${this.audio_metadata_.channel_count} to ${data.channel_count}`);\n return true;\n }\n }\n\n return false;\n }\n\n private dispatchAudioInitSegment(sample: AudioData) {\n let meta: any = {};\n meta.type = 'audio';\n meta.id = this.audio_track_.id;\n meta.timescale = 1000;\n meta.duration = this.duration_;\n\n if (this.audio_metadata_.codec === 'aac') {\n let aac_frame = sample.data as AACFrame;\n let audio_specific_config = new AudioSpecificConfig(aac_frame);\n\n meta.audioSampleRate = audio_specific_config.sampling_rate;\n meta.channelCount = audio_specific_config.channel_count;\n meta.codec = audio_specific_config.codec_mimetype;\n meta.originalCodec = audio_specific_config.original_codec_mimetype;\n meta.config = audio_specific_config.config;\n } else if (this.audio_metadata_.codec === 'mp3') {\n meta.audioSampleRate = this.audio_metadata_.sample_rate;\n meta.channelCount = this.audio_metadata_.channel_count;\n meta.codec = 'mp3';\n meta.originalCodec = 'mp3';\n meta.config = undefined;\n }\n\n meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale;\n\n if (this.audio_init_segment_dispatched_ == false) {\n Log.v(this.TAG, `Generated first AudioSpecificConfig for mimeType: ${meta.codec}`);\n }\n\n this.onTrackMetadata('audio', meta);\n this.audio_init_segment_dispatched_ = true;\n this.video_metadata_changed_ = false;\n\n // notify new MediaInfo\n let mi = this.media_info_;\n mi.hasAudio = true;\n mi.audioCodec = meta.originalCodec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n\n if (mi.hasVideo && mi.videoCodec) {\n mi.mimeType = `video/mp2t; codecs=\"${mi.videoCodec},${mi.audioCodec}\"`;\n } else {\n mi.mimeType = `video/mp2t; codecs=\"${mi.audioCodec}\"`;\n }\n\n if (mi.isComplete()) {\n this.onMediaInfo(mi);\n }\n }\n\n private dispatchPESPrivateDataDescriptor(pid: number, stream_type: number, descriptor: Uint8Array) {\n let desc = new PESPrivateDataDescriptor();\n desc.pid = pid;\n desc.stream_type = stream_type;\n desc.descriptor = descriptor;\n\n if (this.onPESPrivateDataDescriptor) {\n this.onPESPrivateDataDescriptor(desc);\n }\n }\n\n private parsePESPrivateDataPayload(data: Uint8Array, pts: number, dts: number, pid: number, stream_id: number) {\n let private_data = new PESPrivateData();\n\n private_data.pid = pid;\n private_data.stream_id = stream_id;\n private_data.len = data.byteLength;\n private_data.data = data;\n\n if (pts != undefined) {\n let pts_ms = Math.floor(pts / this.timescale_);\n private_data.pts = pts_ms;\n } else {\n private_data.nearest_pts = this.aac_last_sample_pts_;\n }\n\n if (dts != undefined) {\n let dts_ms = Math.floor(dts / this.timescale_);\n private_data.dts = dts_ms;\n }\n\n if (this.onPESPrivateData) {\n this.onPESPrivateData(private_data);\n }\n }\n\n private parseTimedID3MetadataPayload(data: Uint8Array, pts: number, dts: number, pid: number, stream_id: number) {\n let timed_id3_metadata = new PESPrivateData();\n\n timed_id3_metadata.pid = pid;\n timed_id3_metadata.stream_id = stream_id;\n timed_id3_metadata.len = data.byteLength;\n timed_id3_metadata.data = data;\n\n if (pts != undefined) {\n let pts_ms = Math.floor(pts / this.timescale_);\n timed_id3_metadata.pts = pts_ms;\n } \n\n if (dts != undefined) {\n let dts_ms = Math.floor(dts / this.timescale_);\n timed_id3_metadata.dts = dts_ms;\n }\n\n if (this.onTimedID3Metadata) {\n this.onTimedID3Metadata(timed_id3_metadata);\n }\n }\n\n private parseSMPTE2038MetadataPayload(data: Uint8Array, pts: number, dts: number, pid: number, stream_id: number) {\n let smpte2038_data = new SMPTE2038Data();\n\n smpte2038_data.pid = pid;\n smpte2038_data.stream_id = stream_id;\n smpte2038_data.len = data.byteLength;\n smpte2038_data.data = data;\n\n if (pts != undefined) {\n let pts_ms = Math.floor(pts / this.timescale_);\n smpte2038_data.pts = pts_ms;\n }\n smpte2038_data.nearest_pts = this.aac_last_sample_pts_;\n\n if (dts != undefined) {\n let dts_ms = Math.floor(dts / this.timescale_);\n smpte2038_data.dts = dts_ms;\n }\n\n smpte2038_data.ancillaries = smpte2038parse(data);\n if (this.onSMPTE2038Metadata) {\n this.onSMPTE2038Metadata(smpte2038_data);\n }\n }\n}\n\nexport default TSDemuxer;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from dailymotion's hls.js library (hls.js/src/remux/mp4-generator.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// MP4 boxes generator for ISO BMFF (ISO Base Media File Format, defined in ISO/IEC 14496-12)\nclass MP4 {\n\n static init() {\n MP4.types = {\n avc1: [], avcC: [], btrt: [], dinf: [],\n dref: [], esds: [], ftyp: [], hdlr: [],\n hvc1: [], hvcC: [],\n mdat: [], mdhd: [], mdia: [], mfhd: [],\n minf: [], moof: [], moov: [], mp4a: [],\n mvex: [], mvhd: [], sdtp: [], stbl: [],\n stco: [], stsc: [], stsd: [], stsz: [],\n stts: [], tfdt: [], tfhd: [], traf: [],\n trak: [], trun: [], trex: [], tkhd: [],\n vmhd: [], smhd: [], '.mp3': []\n };\n\n for (let name in MP4.types) {\n if (MP4.types.hasOwnProperty(name)) {\n MP4.types[name] = [\n name.charCodeAt(0),\n name.charCodeAt(1),\n name.charCodeAt(2),\n name.charCodeAt(3)\n ];\n }\n }\n\n let constants = MP4.constants = {};\n\n constants.FTYP = new Uint8Array([\n 0x69, 0x73, 0x6F, 0x6D, // major_brand: isom\n 0x0, 0x0, 0x0, 0x1, // minor_version: 0x01\n 0x69, 0x73, 0x6F, 0x6D, // isom\n 0x61, 0x76, 0x63, 0x31 // avc1\n ]);\n\n constants.STSD_PREFIX = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]);\n\n constants.STTS = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n\n constants.STSC = constants.STCO = constants.STTS;\n\n constants.STSZ = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n\n constants.HDLR_VIDEO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x56, 0x69, 0x64, 0x65,\n 0x6F, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler\n ]);\n\n constants.HDLR_AUDIO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x53, 0x6F, 0x75, 0x6E,\n 0x64, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler\n ]);\n\n constants.DREF = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0C, // entry_size\n 0x75, 0x72, 0x6C, 0x20, // type 'url '\n 0x00, 0x00, 0x00, 0x01 // version(0) + flags\n ]);\n\n // Sound media header\n constants.SMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)\n ]);\n\n // video media header\n constants.VMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x01, // version(0) + flags\n 0x00, 0x00, // graphicsmode: 2 bytes\n 0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes\n 0x00, 0x00\n ]);\n }\n\n // Generate a box\n static box(type) {\n let size = 8;\n let result = null;\n let datas = Array.prototype.slice.call(arguments, 1);\n let arrayCount = datas.length;\n\n for (let i = 0; i < arrayCount; i++) {\n size += datas[i].byteLength;\n }\n\n result = new Uint8Array(size);\n result[0] = (size >>> 24) & 0xFF; // size\n result[1] = (size >>> 16) & 0xFF;\n result[2] = (size >>> 8) & 0xFF;\n result[3] = (size) & 0xFF;\n\n result.set(type, 4); // type\n\n let offset = 8;\n for (let i = 0; i < arrayCount; i++) { // data body\n result.set(datas[i], offset);\n offset += datas[i].byteLength;\n }\n\n return result;\n }\n\n // emit ftyp & moov\n static generateInitSegment(meta) {\n let ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP);\n let moov = MP4.moov(meta);\n\n let result = new Uint8Array(ftyp.byteLength + moov.byteLength);\n result.set(ftyp, 0);\n result.set(moov, ftyp.byteLength);\n return result;\n }\n\n // Movie metadata box\n static moov(meta) {\n let mvhd = MP4.mvhd(meta.timescale, meta.duration);\n let trak = MP4.trak(meta);\n let mvex = MP4.mvex(meta);\n return MP4.box(MP4.types.moov, mvhd, trak, mvex);\n }\n\n // Movie header box\n static mvhd(timescale, duration) {\n return MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0\n 0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----\n 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID\n ]));\n }\n\n // Track box\n static trak(meta) {\n return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta));\n }\n\n // Track header box\n static tkhd(meta) {\n let trackId = meta.id, duration = meta.duration;\n let width = meta.presentWidth, height = meta.presentHeight;\n\n return MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x07, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (trackId >>> 24) & 0xFF, // track_ID: 4 bytes\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)\n 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n (width >>> 8) & 0xFF, // width and height\n (width) & 0xFF,\n 0x00, 0x00,\n (height >>> 8) & 0xFF,\n (height) & 0xFF,\n 0x00, 0x00\n ]));\n }\n\n // Media Box\n static mdia(meta) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta));\n }\n\n // Media header box\n static mdhd(meta) {\n let timescale = meta.timescale;\n let duration = meta.duration;\n return MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x55, 0xC4, // language: und (undetermined)\n 0x00, 0x00 // pre_defined = 0\n ]));\n }\n\n // Media handler reference box\n static hdlr(meta) {\n let data = null;\n if (meta.type === 'audio') {\n data = MP4.constants.HDLR_AUDIO;\n } else {\n data = MP4.constants.HDLR_VIDEO;\n }\n return MP4.box(MP4.types.hdlr, data);\n }\n\n // Media infomation box\n static minf(meta) {\n let xmhd = null;\n if (meta.type === 'audio') {\n xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD);\n } else {\n xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD);\n }\n return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta));\n }\n\n // Data infomation box\n static dinf() {\n let result = MP4.box(MP4.types.dinf,\n MP4.box(MP4.types.dref, MP4.constants.DREF)\n );\n return result;\n }\n\n // Sample table box\n static stbl(meta) {\n let result = MP4.box(MP4.types.stbl, // type: stbl\n MP4.stsd(meta), // Sample Description Table\n MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample\n MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk\n MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size\n MP4.box(MP4.types.stco, MP4.constants.STCO) // Chunk offset\n ); \n return result; \n }\n\n // Sample description box\n static stsd(meta) {\n if (meta.type === 'audio') {\n if (meta.codec === 'mp3') {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp3(meta));\n }\n // else: aac -> mp4a\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta));\n } else if (meta.type === 'video' && meta.codec.startsWith('hvc1')) {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.hvc1(meta));\n } else {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta));\n }\n }\n\n static mp3(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types['.mp3'], data);\n }\n\n static mp4a(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types.mp4a, data, MP4.esds(meta));\n }\n\n static esds(meta) {\n let config = meta.config || [];\n let configSize = config.length;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version 0 + flags\n\n 0x03, // descriptor_type\n 0x17 + configSize, // length3\n 0x00, 0x01, // es_id\n 0x00, // stream_priority\n\n 0x04, // descriptor_type\n 0x0F + configSize, // length\n 0x40, // codec: mpeg4_audio\n 0x15, // stream_type: Audio\n 0x00, 0x00, 0x00, // buffer_size\n 0x00, 0x00, 0x00, 0x00, // maxBitrate\n 0x00, 0x00, 0x00, 0x00, // avgBitrate\n\n 0x05 // descriptor_type\n ].concat([\n configSize\n ]).concat(\n config\n ).concat([\n 0x06, 0x01, 0x02 // GASpecificConfig\n ]));\n return MP4.box(MP4.types.esds, data);\n }\n\n static avc1(meta) {\n let avcc = meta.avcc;\n let width = meta.codecWidth, height = meta.codecHeight;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined(2) + reserved(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n (width >>> 8) & 0xFF, // width: 2 bytes\n (width) & 0xFF,\n (height >>> 8) & 0xFF, // height: 2 bytes\n (height) & 0xFF,\n 0x00, 0x48, 0x00, 0x00, // horizresolution: 4 bytes\n 0x00, 0x48, 0x00, 0x00, // vertresolution: 4 bytes\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n 0x00, 0x01, // frame_count\n 0x0A, // strlen\n 0x78, 0x71, 0x71, 0x2F, // compressorname: 32 bytes\n 0x66, 0x6C, 0x76, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00,\n 0x00, 0x18, // depth\n 0xFF, 0xFF // pre_defined = -1\n ]);\n return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc));\n }\n\n static hvc1(meta) {\n let hvcc = meta.hvcc;\n let width = meta.codecWidth, height = meta.codecHeight;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined(2) + reserved(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n (width >>> 8) & 0xFF, // width: 2 bytes\n (width) & 0xFF,\n (height >>> 8) & 0xFF, // height: 2 bytes\n (height) & 0xFF,\n 0x00, 0x48, 0x00, 0x00, // horizresolution: 4 bytes\n 0x00, 0x48, 0x00, 0x00, // vertresolution: 4 bytes\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n 0x00, 0x01, // frame_count\n 0x0A, // strlen\n 0x78, 0x71, 0x71, 0x2F, // compressorname: 32 bytes\n 0x66, 0x6C, 0x76, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00,\n 0x00, 0x18, // depth\n 0xFF, 0xFF // pre_defined = -1\n ]);\n return MP4.box(MP4.types.hvc1, data, MP4.box(MP4.types.hvcC, hvcc));\n }\n\n // Movie Extends box\n static mvex(meta) {\n return MP4.box(MP4.types.mvex, MP4.trex(meta));\n }\n\n // Track Extends box\n static trex(meta) {\n let trackId = meta.id;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]);\n return MP4.box(MP4.types.trex, data);\n }\n\n // Movie fragment box\n static moof(track, baseMediaDecodeTime) {\n return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime));\n }\n\n static mfhd(sequenceNumber) {\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n (sequenceNumber >>> 24) & 0xFF, // sequence_number: int32\n (sequenceNumber >>> 16) & 0xFF,\n (sequenceNumber >>> 8) & 0xFF,\n (sequenceNumber) & 0xFF\n ]);\n return MP4.box(MP4.types.mfhd, data);\n }\n\n // Track fragment box\n static traf(track, baseMediaDecodeTime) {\n let trackId = track.id;\n\n // Track fragment header box\n let tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF\n ]));\n // Track Fragment Decode Time\n let tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (baseMediaDecodeTime >>> 24) & 0xFF, // baseMediaDecodeTime: int32\n (baseMediaDecodeTime >>> 16) & 0xFF,\n (baseMediaDecodeTime >>> 8) & 0xFF,\n (baseMediaDecodeTime) & 0xFF\n ]));\n let sdtp = MP4.sdtp(track);\n let trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);\n\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp);\n }\n\n // Sample Dependency Type box\n static sdtp(track) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let data = new Uint8Array(4 + sampleCount);\n // 0~4 bytes: version(0) & flags\n for (let i = 0; i < sampleCount; i++) {\n let flags = samples[i].flags;\n data[i + 4] = (flags.isLeading << 6) // is_leading: 2 (bit)\n | (flags.dependsOn << 4) // sample_depends_on\n | (flags.isDependedOn << 2) // sample_is_depended_on\n | (flags.hasRedundancy); // sample_has_redundancy\n }\n return MP4.box(MP4.types.sdtp, data);\n }\n\n // Track fragment run box\n static trun(track, offset) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let dataSize = 12 + 16 * sampleCount;\n let data = new Uint8Array(dataSize);\n offset += 8 + dataSize;\n\n data.set([\n 0x00, 0x00, 0x0F, 0x01, // version(0) & flags\n (sampleCount >>> 24) & 0xFF, // sample_count\n (sampleCount >>> 16) & 0xFF,\n (sampleCount >>> 8) & 0xFF,\n (sampleCount) & 0xFF,\n (offset >>> 24) & 0xFF, // data_offset\n (offset >>> 16) & 0xFF,\n (offset >>> 8) & 0xFF,\n (offset) & 0xFF\n ], 0);\n\n for (let i = 0; i < sampleCount; i++) {\n let duration = samples[i].duration;\n let size = samples[i].size;\n let flags = samples[i].flags;\n let cts = samples[i].cts;\n data.set([\n (duration >>> 24) & 0xFF, // sample_duration\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n (size >>> 24) & 0xFF, // sample_size\n (size >>> 16) & 0xFF,\n (size >>> 8) & 0xFF,\n (size) & 0xFF,\n (flags.isLeading << 2) | flags.dependsOn, // sample_flags\n (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) | flags.isNonSync,\n 0x00, 0x00, // sample_degradation_priority\n (cts >>> 24) & 0xFF, // sample_composition_time_offset\n (cts >>> 16) & 0xFF,\n (cts >>> 8) & 0xFF,\n (cts) & 0xFF\n ], 12 + 16 * i);\n }\n return MP4.box(MP4.types.trun, data);\n }\n\n static mdat(data) {\n return MP4.box(MP4.types.mdat, data);\n }\n\n}\n\nMP4.init();\n\nexport default MP4;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is modified from dailymotion's hls.js library (hls.js/src/helper/aac.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass AAC {\n\n static getSilentFrame(codec, channelCount) {\n if (codec === 'mp4a.40.2') {\n // handle LC-AAC\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);\n } else if (channelCount === 2) {\n return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]);\n } else if (channelCount === 3) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]);\n } else if (channelCount === 4) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]);\n } else if (channelCount === 5) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]);\n } else if (channelCount === 6) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2, 0x00, 0x20, 0x08, 0xe0]);\n }\n } else {\n // handle HE-AAC (mp4a.40.5 / mp4a.40.29)\n if (channelCount === 1) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0:d=0.05\" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n } else if (channelCount === 2) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n } else if (channelCount === 3) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n }\n }\n return null;\n }\n\n}\n\nexport default AAC;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport MP4 from './mp4-generator.js';\nimport AAC from './aac-silent.js';\nimport Browser from '../utils/browser.js';\nimport { SampleInfo, MediaSegmentInfo, MediaSegmentInfoList } from '../core/media-segment-info.js';\nimport { IllegalStateException } from '../utils/exception.js';\n\n\n// Fragmented mp4 remuxer\nclass MP4Remuxer {\n\n constructor(config) {\n this.TAG = 'MP4Remuxer';\n\n this._config = config;\n this._isLive = (config.isLive === true) ? true : false;\n\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioDtsBase = Infinity;\n this._videoDtsBase = Infinity;\n this._audioNextDts = undefined;\n this._videoNextDts = undefined;\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n\n this._audioMeta = null;\n this._videoMeta = null;\n\n this._audioSegmentInfoList = new MediaSegmentInfoList('audio');\n this._videoSegmentInfoList = new MediaSegmentInfoList('video');\n\n this._onInitSegment = null;\n this._onMediaSegment = null;\n\n // Workaround for chrome < 50: Always force first sample as a Random Access Point in media segment\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n this._forceFirstIDR = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661))) ? true : false;\n\n // Workaround for IE11/Edge: Fill silent aac frame after keyframe-seeking\n // Make audio beginDts equals with video beginDts, in order to fix seek freeze\n this._fillSilentAfterSeek = (Browser.msedge || Browser.msie);\n\n // While only FireFox supports 'audio/mp4, codecs=\"mp3\"', use 'audio/mpeg' for chrome, safari, ...\n this._mp3UseMpegAudio = !Browser.firefox;\n\n this._fillAudioTimestampGap = this._config.fixAudioTimestampGap;\n }\n\n destroy() {\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioMeta = null;\n this._videoMeta = null;\n this._audioSegmentInfoList.clear();\n this._audioSegmentInfoList = null;\n this._videoSegmentInfoList.clear();\n this._videoSegmentInfoList = null;\n this._onInitSegment = null;\n this._onMediaSegment = null;\n }\n\n bindDataSource(producer) {\n producer.onDataAvailable = this.remux.bind(this);\n producer.onTrackMetadata = this._onTrackMetadataReceived.bind(this);\n return this;\n }\n\n /* prototype: function onInitSegment(type: string, initSegment: ArrayBuffer): void\n InitSegment: {\n type: string,\n data: ArrayBuffer,\n codec: string,\n container: string\n }\n */\n get onInitSegment() {\n return this._onInitSegment;\n }\n\n set onInitSegment(callback) {\n this._onInitSegment = callback;\n }\n\n /* prototype: function onMediaSegment(type: string, mediaSegment: MediaSegment): void\n MediaSegment: {\n type: string,\n data: ArrayBuffer,\n sampleCount: int32\n info: MediaSegmentInfo\n }\n */\n get onMediaSegment() {\n return this._onMediaSegment;\n }\n\n set onMediaSegment(callback) {\n this._onMediaSegment = callback;\n }\n\n insertDiscontinuity() {\n this._audioNextDts = this._videoNextDts = undefined;\n }\n\n seek(originalDts) {\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n this._videoSegmentInfoList.clear();\n this._audioSegmentInfoList.clear();\n }\n\n remux(audioTrack, videoTrack) {\n if (!this._onMediaSegment) {\n throw new IllegalStateException('MP4Remuxer: onMediaSegment callback must be specificed!');\n }\n if (!this._dtsBaseInited) {\n this._calculateDtsBase(audioTrack, videoTrack);\n }\n if (videoTrack) {\n this._remuxVideo(videoTrack);\n }\n if (audioTrack) {\n this._remuxAudio(audioTrack);\n }\n }\n\n _onTrackMetadataReceived(type, metadata) {\n let metabox = null;\n\n let container = 'mp4';\n let codec = metadata.codec;\n\n if (type === 'audio') {\n this._audioMeta = metadata;\n if (metadata.codec === 'mp3' && this._mp3UseMpegAudio) {\n // 'audio/mpeg' for MP3 audio track\n container = 'mpeg';\n codec = '';\n metabox = new Uint8Array();\n } else {\n // 'audio/mp4, codecs=\"codec\"'\n metabox = MP4.generateInitSegment(metadata);\n }\n } else if (type === 'video') {\n this._videoMeta = metadata;\n metabox = MP4.generateInitSegment(metadata);\n } else {\n return;\n }\n\n // dispatch metabox (Initialization Segment)\n if (!this._onInitSegment) {\n throw new IllegalStateException('MP4Remuxer: onInitSegment callback must be specified!');\n }\n this._onInitSegment(type, {\n type: type,\n data: metabox.buffer,\n codec: codec,\n container: `${type}/${container}`,\n mediaDuration: metadata.duration // in timescale 1000 (milliseconds)\n });\n }\n\n _calculateDtsBase(audioTrack, videoTrack) {\n if (this._dtsBaseInited) {\n return;\n }\n\n if (audioTrack && audioTrack.samples && audioTrack.samples.length) {\n this._audioDtsBase = audioTrack.samples[0].dts;\n }\n if (videoTrack && videoTrack.samples && videoTrack.samples.length) {\n this._videoDtsBase = videoTrack.samples[0].dts;\n }\n\n this._dtsBase = Math.min(this._audioDtsBase, this._videoDtsBase);\n this._dtsBaseInited = true;\n }\n\n getTimestampBase() {\n if (!this._dtsBaseInited) {\n return undefined;\n }\n return this._dtsBase;\n }\n\n flushStashedSamples() {\n let videoSample = this._videoStashedLastSample;\n let audioSample = this._audioStashedLastSample;\n\n let videoTrack = {\n type: 'video',\n id: 1,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (videoSample != null) {\n videoTrack.samples.push(videoSample);\n videoTrack.length = videoSample.length;\n }\n\n let audioTrack = {\n type: 'audio',\n id: 2,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (audioSample != null) {\n audioTrack.samples.push(audioSample);\n audioTrack.length = audioSample.length;\n }\n\n this._videoStashedLastSample = null;\n this._audioStashedLastSample = null;\n\n this._remuxVideo(videoTrack, true);\n this._remuxAudio(audioTrack, true);\n }\n\n _remuxAudio(audioTrack, force) {\n if (this._audioMeta == null) {\n return;\n }\n\n let track = audioTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1, lastPts = -1;\n let refSampleDuration = this._audioMeta.refSampleDuration;\n\n let mpegRawTrack = this._audioMeta.codec === 'mp3' && this._mp3UseMpegAudio;\n let firstSegmentAfterSeek = this._dtsBaseInited && this._audioNextDts === undefined;\n\n let insertPrefixSilentFrame = false;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 0;\n let mdatbox = null;\n let mdatBytes = 0;\n\n // calculate initial mdat size\n if (mpegRawTrack) {\n // for raw mpeg buffer\n offset = 0;\n mdatBytes = track.length;\n } else {\n // for fmp4 mdat box\n offset = 8; // size + type\n mdatBytes = 8 + track.length;\n }\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._audioStashedLastSample != null) {\n let sample = this._audioStashedLastSample;\n this._audioStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._audioStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._audioNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._audioNextDts;\n } else { // this._audioNextDts == undefined\n if (this._audioSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n if (this._fillSilentAfterSeek && !this._videoSegmentInfoList.isEmpty()) {\n if (this._audioMeta.originalCodec !== 'mp3') {\n insertPrefixSilentFrame = true;\n }\n }\n } else {\n let lastSample = this._audioSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n if (insertPrefixSilentFrame) {\n // align audio segment beginDts to match with current video segment's beginDts\n let firstSampleDts = firstSampleOriginalDts - dtsCorrection;\n let videoSegment = this._videoSegmentInfoList.getLastSegmentBefore(firstSampleOriginalDts);\n if (videoSegment != null && videoSegment.beginDts < firstSampleDts) {\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit) {\n let dts = videoSegment.beginDts;\n let silentFrameDuration = firstSampleDts - videoSegment.beginDts;\n Log.v(this.TAG, `InsertPrefixSilentAudio: dts: ${dts}, duration: ${silentFrameDuration}`);\n samples.unshift({ unit: silentUnit, dts: dts, pts: dts });\n mdatBytes += silentUnit.byteLength;\n } // silentUnit == null: Cannot generate, skip\n } else {\n insertPrefixSilentFrame = false;\n }\n }\n\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let unit = sample.unit;\n let originalDts = sample.dts - this._dtsBase;\n let dts = originalDts;\n let needFillSilentFrames = false;\n let silentFrames = null;\n let sampleDuration = 0;\n\n if (originalDts < -0.001) {\n continue; //pass the first sample with the invalid dts\n }\n\n if (this._audioMeta.codec !== 'mp3') {\n // for AAC codec, we need to keep dts increase based on refSampleDuration\n let curRefDts = originalDts;\n const maxAudioFramesDrift = 3;\n if (this._audioNextDts) {\n curRefDts = this._audioNextDts;\n }\n\n dtsCorrection = originalDts - curRefDts;\n if (dtsCorrection <= -maxAudioFramesDrift * refSampleDuration) {\n // If we're overlapping by more than maxAudioFramesDrift number of frame, drop this sample\n Log.w(this.TAG, `Dropping 1 audio frame (originalDts: ${originalDts} ms ,curRefDts: ${curRefDts} ms) due to dtsCorrection: ${dtsCorrection} ms overlap.`);\n continue;\n }\n else if (dtsCorrection >= maxAudioFramesDrift * refSampleDuration && this._fillAudioTimestampGap && !Browser.safari) {\n // Silent frame generation, if large timestamp gap detected && config.fixAudioTimestampGap\n needFillSilentFrames = true;\n // We need to insert silent frames to fill timestamp gap\n let frameCount = Math.floor(dtsCorrection / refSampleDuration);\n Log.w(this.TAG, 'Large audio timestamp gap detected, may cause AV sync to drift. ' +\n 'Silent frames will be generated to avoid unsync.\\n' +\n `originalDts: ${originalDts} ms, curRefDts: ${curRefDts} ms, ` +\n `dtsCorrection: ${Math.round(dtsCorrection)} ms, generate: ${frameCount} frames`);\n\n\n dts = Math.floor(curRefDts);\n sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts;\n\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit == null) {\n Log.w(this.TAG, 'Unable to generate silent frame for ' +\n `${this._audioMeta.originalCodec} with ${this._audioMeta.channelCount} channels, repeat last frame`);\n // Repeat last frame\n silentUnit = unit;\n }\n silentFrames = [];\n\n for (let j = 0; j < frameCount; j++) {\n curRefDts = curRefDts + refSampleDuration;\n let intDts = Math.floor(curRefDts); // change to integer\n let intDuration = Math.floor(curRefDts + refSampleDuration) - intDts;\n let frame = {\n dts: intDts,\n pts: intDts,\n cts: 0,\n unit: silentUnit,\n size: silentUnit.byteLength,\n duration: intDuration, // wait for next sample\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n };\n silentFrames.push(frame);\n mdatBytes += frame.size;;\n\n }\n\n this._audioNextDts = curRefDts + refSampleDuration;\n\n } else {\n\n dts = Math.floor(curRefDts);\n sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts;\n this._audioNextDts = curRefDts + refSampleDuration;\n\n }\n } else {\n // keep the original dts calculate algorithm for mp3\n dts = originalDts - dtsCorrection;\n\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(refSampleDuration);\n }\n }\n this._audioNextDts = dts + sampleDuration;\n }\n\n if (firstDts === -1) {\n firstDts = dts;\n }\n mp4Samples.push({\n dts: dts,\n pts: dts,\n cts: 0,\n unit: sample.unit,\n size: sample.unit.byteLength,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n });\n\n if (needFillSilentFrames) {\n // Silent frames should be inserted after wrong-duration frame\n mp4Samples.push.apply(mp4Samples, silentFrames);\n }\n }\n\n if (mp4Samples.length === 0) {\n //no samples need to remux\n track.samples = [];\n track.length = 0;\n return;\n }\n\n // allocate mdatbox\n if (mpegRawTrack) {\n // allocate for raw mpeg buffer\n mdatbox = new Uint8Array(mdatBytes);\n } else {\n // allocate for fmp4 mdat box\n mdatbox = new Uint8Array(mdatBytes);\n // size field\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n // type field (fourCC)\n mdatbox.set(MP4.types.mdat, 4);\n }\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let unit = mp4Samples[i].unit;\n mdatbox.set(unit, offset);\n offset += unit.byteLength;\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n //this._audioNextDts = lastDts;\n\n // fill media segment info & add to info list\n let info = new MediaSegmentInfo();\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstDts;\n info.endPts = lastDts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n false);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n false);\n if (!this._isLive) {\n this._audioSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n let moofbox = null;\n\n if (mpegRawTrack) {\n // Generate empty buffer, because useless for raw mpeg\n moofbox = new Uint8Array();\n } else {\n // Generate moof for fmp4 segment\n moofbox = MP4.moof(track, firstDts);\n }\n\n track.samples = [];\n track.length = 0;\n\n let segment = {\n type: 'audio',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n };\n\n if (mpegRawTrack && firstSegmentAfterSeek) {\n // For MPEG audio stream in MSE, if seeking occurred, before appending new buffer\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n segment.timestampOffset = firstDts;\n }\n\n this._onMediaSegment('audio', segment);\n }\n\n _remuxVideo(videoTrack, force) {\n if (this._videoMeta == null) {\n return;\n }\n\n let track = videoTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1;\n let firstPts = -1, lastPts = -1;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 8;\n let mdatbox = null;\n let mdatBytes = 8 + videoTrack.length;\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._videoStashedLastSample != null) {\n let sample = this._videoStashedLastSample;\n this._videoStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._videoStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._videoNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._videoNextDts;\n } else { // this._videoNextDts == undefined\n if (this._videoSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n } else {\n let lastSample = this._videoSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n let info = new MediaSegmentInfo();\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let originalDts = sample.dts - this._dtsBase;\n let isKeyframe = sample.isKeyframe;\n let dts = originalDts - dtsCorrection;\n let cts = sample.cts;\n let pts = dts + cts;\n\n if (firstDts === -1) {\n firstDts = dts;\n firstPts = pts;\n }\n\n let sampleDuration = 0;\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(this._videoMeta.refSampleDuration);\n }\n }\n\n if (isKeyframe) {\n let syncPoint = new SampleInfo(dts, pts, sampleDuration, sample.dts, true);\n syncPoint.fileposition = sample.fileposition;\n info.appendSyncPoint(syncPoint);\n }\n\n mp4Samples.push({\n dts: dts,\n pts: pts,\n cts: cts,\n units: sample.units,\n size: sample.length,\n isKeyframe: isKeyframe,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: isKeyframe ? 2 : 1,\n isDependedOn: isKeyframe ? 1 : 0,\n hasRedundancy: 0,\n isNonSync: isKeyframe ? 0 : 1\n }\n });\n }\n\n // allocate mdatbox\n mdatbox = new Uint8Array(mdatBytes);\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n mdatbox.set(MP4.types.mdat, 4);\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let units = mp4Samples[i].units;\n while (units.length) {\n let unit = units.shift();\n let data = unit.data;\n mdatbox.set(data, offset);\n offset += data.byteLength;\n }\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n lastPts = latest.pts + latest.duration;\n this._videoNextDts = lastDts;\n\n // fill media segment info & add to info list\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstPts;\n info.endPts = lastPts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n mp4Samples[0].isKeyframe);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n latest.isKeyframe);\n if (!this._isLive) {\n this._videoSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n // workaround for chrome < 50: force first sample as a random access point\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n if (this._forceFirstIDR) {\n let flags = mp4Samples[0].flags;\n flags.dependsOn = 2;\n flags.isNonSync = 0;\n }\n\n let moofbox = MP4.moof(track, firstDts);\n track.samples = [];\n track.length = 0;\n\n this._onMediaSegment('video', {\n type: 'video',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n });\n }\n\n _mergeBoxes(moof, mdat) {\n let result = new Uint8Array(moof.byteLength + mdat.byteLength);\n result.set(moof, 0);\n result.set(mdat, moof.byteLength);\n return result;\n }\n\n}\n\nexport default MP4Remuxer;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MediaInfo from './media-info.js';\nimport FLVDemuxer from '../demux/flv-demuxer.js';\nimport TSDemuxer from '../demux/ts-demuxer';\nimport MP4Remuxer from '../remux/mp4-remuxer.js';\nimport DemuxErrors from '../demux/demux-errors.js';\nimport IOController from '../io/io-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport {LoaderStatus, LoaderErrors} from '../io/loader.js';\n\n// Transmuxing (IO, Demuxing, Remuxing) controller, with multipart support\nclass TransmuxingController {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'TransmuxingController';\n this._emitter = new EventEmitter();\n\n this._config = config;\n\n // treat single part media as multipart media, which has only one segment\n if (!mediaDataSource.segments) {\n mediaDataSource.segments = [{\n duration: mediaDataSource.duration,\n filesize: mediaDataSource.filesize,\n url: mediaDataSource.url\n }];\n }\n\n // fill in default IO params if not exists\n if (typeof mediaDataSource.cors !== 'boolean') {\n mediaDataSource.cors = true;\n }\n if (typeof mediaDataSource.withCredentials !== 'boolean') {\n mediaDataSource.withCredentials = false;\n }\n\n this._mediaDataSource = mediaDataSource;\n this._currentSegmentIndex = 0;\n let totalDuration = 0;\n\n this._mediaDataSource.segments.forEach((segment) => {\n // timestampBase for each segment, and calculate total duration\n segment.timestampBase = totalDuration;\n totalDuration += segment.duration;\n // params needed by IOController\n segment.cors = mediaDataSource.cors;\n segment.withCredentials = mediaDataSource.withCredentials;\n // referrer policy control, if exist\n if (config.referrerPolicy) {\n segment.referrerPolicy = config.referrerPolicy;\n }\n });\n\n if (!isNaN(totalDuration) && this._mediaDataSource.duration !== totalDuration) {\n this._mediaDataSource.duration = totalDuration;\n }\n\n this._mediaInfo = null;\n this._demuxer = null;\n this._remuxer = null;\n this._ioctl = null;\n\n this._pendingSeekTime = null;\n this._pendingResolveSeekPoint = null;\n\n this._statisticsReporter = null;\n }\n\n destroy() {\n this._mediaInfo = null;\n this._mediaDataSource = null;\n\n if (this._statisticsReporter) {\n this._disableStatisticsReporter();\n }\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n if (this._demuxer) {\n this._demuxer.destroy();\n this._demuxer = null;\n }\n if (this._remuxer) {\n this._remuxer.destroy();\n this._remuxer = null;\n }\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n start() {\n this._loadSegment(0);\n this._enableStatisticsReporter();\n }\n\n _loadSegment(segmentIndex, optionalFrom) {\n this._currentSegmentIndex = segmentIndex;\n let dataSource = this._mediaDataSource.segments[segmentIndex];\n\n let ioctl = this._ioctl = new IOController(dataSource, this._config, segmentIndex);\n ioctl.onError = this._onIOException.bind(this);\n ioctl.onSeeked = this._onIOSeeked.bind(this);\n ioctl.onComplete = this._onIOComplete.bind(this);\n ioctl.onRedirect = this._onIORedirect.bind(this);\n ioctl.onRecoveredEarlyEof = this._onIORecoveredEarlyEof.bind(this);\n\n if (optionalFrom) {\n this._demuxer.bindDataSource(this._ioctl);\n } else {\n ioctl.onDataArrival = this._onInitChunkArrival.bind(this);\n }\n\n ioctl.open(optionalFrom);\n }\n\n stop() {\n this._internalAbort();\n this._disableStatisticsReporter();\n }\n\n _internalAbort() {\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n }\n\n pause() { // take a rest\n if (this._ioctl && this._ioctl.isWorking()) {\n this._ioctl.pause();\n this._disableStatisticsReporter();\n }\n }\n\n resume() {\n if (this._ioctl && this._ioctl.isPaused()) {\n this._ioctl.resume();\n this._enableStatisticsReporter();\n }\n }\n\n seek(milliseconds) {\n if (this._mediaInfo == null || !this._mediaInfo.isSeekable()) {\n return;\n }\n\n let targetSegmentIndex = this._searchSegmentIndexContains(milliseconds);\n\n if (targetSegmentIndex === this._currentSegmentIndex) {\n // intra-segment seeking\n let segmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (segmentInfo == undefined) {\n // current segment loading started, but mediainfo hasn't received yet\n // wait for the metadata loaded, then seek to expected position\n this._pendingSeekTime = milliseconds;\n } else {\n let keyframe = segmentInfo.getNearestKeyframe(milliseconds);\n this._remuxer.seek(keyframe.milliseconds);\n this._ioctl.seek(keyframe.fileposition);\n // Will be resolved in _onRemuxerMediaSegmentArrival()\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n }\n } else {\n // cross-segment seeking\n let targetSegmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (targetSegmentInfo == undefined) {\n // target segment hasn't been loaded. We need metadata then seek to expected time\n this._pendingSeekTime = milliseconds;\n this._internalAbort();\n this._remuxer.seek();\n this._remuxer.insertDiscontinuity();\n this._loadSegment(targetSegmentIndex);\n // Here we wait for the metadata loaded, then seek to expected position\n } else {\n // We have target segment's metadata, direct seek to target position\n let keyframe = targetSegmentInfo.getNearestKeyframe(milliseconds);\n this._internalAbort();\n this._remuxer.seek(milliseconds);\n this._remuxer.insertDiscontinuity();\n this._demuxer.resetMediaInfo();\n this._demuxer.timestampBase = this._mediaDataSource.segments[targetSegmentIndex].timestampBase;\n this._loadSegment(targetSegmentIndex, keyframe.fileposition);\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n this._reportSegmentMediaInfo(targetSegmentIndex);\n }\n }\n\n this._enableStatisticsReporter();\n }\n\n _searchSegmentIndexContains(milliseconds) {\n let segments = this._mediaDataSource.segments;\n let idx = segments.length - 1;\n\n for (let i = 0; i < segments.length; i++) {\n if (milliseconds < segments[i].timestampBase) {\n idx = i - 1;\n break;\n }\n }\n return idx;\n }\n\n _onInitChunkArrival(data, byteStart) {\n let consumed = 0;\n\n if (byteStart > 0) {\n // IOController seeked immediately after opened, byteStart > 0 callback may received\n this._demuxer.bindDataSource(this._ioctl);\n this._demuxer.timestampBase = this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase;\n\n consumed = this._demuxer.parseChunks(data, byteStart);\n } else {\n // byteStart == 0, Initial data, probe it first\n let probeData = null;\n\n // Try probing input data as FLV first\n probeData = FLVDemuxer.probe(data);\n if (probeData.match) {\n // Hit as FLV\n this._setupFLVDemuxerRemuxer(probeData);\n consumed = this._demuxer.parseChunks(data, byteStart);\n }\n\n if (!probeData.match && !probeData.needMoreData) {\n // Non-FLV, try MPEG-TS probe\n probeData = TSDemuxer.probe(data);\n if (probeData.match) {\n // Hit as MPEG-TS\n this._setupTSDemuxerRemuxer(probeData);\n consumed = this._demuxer.parseChunks(data, byteStart);\n }\n }\n\n if (!probeData.match && !probeData.needMoreData) {\n // Both probing as FLV / MPEG-TS failed, report error\n probeData = null;\n Log.e(this.TAG, 'Non MPEG-TS/FLV, Unsupported media type!');\n Promise.resolve().then(() => {\n this._internalAbort();\n });\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, DemuxErrors.FORMAT_UNSUPPORTED, 'Non MPEG-TS/FLV, Unsupported media type!');\n // Leave consumed as 0\n }\n }\n\n return consumed;\n }\n\n _setupFLVDemuxerRemuxer(probeData) {\n this._demuxer = new FLVDemuxer(probeData, this._config);\n\n if (!this._remuxer) {\n this._remuxer = new MP4Remuxer(this._config);\n }\n\n let mds = this._mediaDataSource;\n if (mds.duration != undefined && !isNaN(mds.duration)) {\n this._demuxer.overridedDuration = mds.duration;\n }\n if (typeof mds.hasAudio === 'boolean') {\n this._demuxer.overridedHasAudio = mds.hasAudio;\n }\n if (typeof mds.hasVideo === 'boolean') {\n this._demuxer.overridedHasVideo = mds.hasVideo;\n }\n\n this._demuxer.timestampBase = mds.segments[this._currentSegmentIndex].timestampBase;\n\n this._demuxer.onError = this._onDemuxException.bind(this);\n this._demuxer.onMediaInfo = this._onMediaInfo.bind(this);\n this._demuxer.onMetaDataArrived = this._onMetaDataArrived.bind(this);\n this._demuxer.onScriptDataArrived = this._onScriptDataArrived.bind(this);\n\n this._remuxer.bindDataSource(this._demuxer\n .bindDataSource(this._ioctl\n ));\n\n this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);\n this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);\n }\n\n _setupTSDemuxerRemuxer(probeData) {\n let demuxer = this._demuxer = new TSDemuxer(probeData, this._config);\n\n if (!this._remuxer) {\n this._remuxer = new MP4Remuxer(this._config);\n }\n\n demuxer.onError = this._onDemuxException.bind(this);\n demuxer.onMediaInfo = this._onMediaInfo.bind(this);\n demuxer.onMetaDataArrived = this._onMetaDataArrived.bind(this);\n demuxer.onTimedID3Metadata = this._onTimedID3Metadata.bind(this);\n demuxer.onSMPTE2038Metadata = this._onSMPTE2038Metadata.bind(this);\n demuxer.onSCTE35Metadata = this._onSCTE35Metadata.bind(this);\n demuxer.onPESPrivateDataDescriptor = this._onPESPrivateDataDescriptor.bind(this);\n demuxer.onPESPrivateData = this._onPESPrivateData.bind(this);\n\n this._remuxer.bindDataSource(this._demuxer);\n this._demuxer.bindDataSource(this._ioctl);\n\n this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);\n this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);\n }\n\n _onMediaInfo(mediaInfo) {\n if (this._mediaInfo == null) {\n // Store first segment's mediainfo as global mediaInfo\n this._mediaInfo = Object.assign({}, mediaInfo);\n this._mediaInfo.keyframesIndex = null;\n this._mediaInfo.segments = [];\n this._mediaInfo.segmentCount = this._mediaDataSource.segments.length;\n Object.setPrototypeOf(this._mediaInfo, MediaInfo.prototype);\n }\n\n let segmentInfo = Object.assign({}, mediaInfo);\n Object.setPrototypeOf(segmentInfo, MediaInfo.prototype);\n this._mediaInfo.segments[this._currentSegmentIndex] = segmentInfo;\n\n // notify mediaInfo update\n this._reportSegmentMediaInfo(this._currentSegmentIndex);\n\n if (this._pendingSeekTime != null) {\n Promise.resolve().then(() => {\n let target = this._pendingSeekTime;\n this._pendingSeekTime = null;\n this.seek(target);\n });\n }\n }\n\n _onMetaDataArrived(metadata) {\n this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);\n }\n\n _onScriptDataArrived(data) {\n this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);\n }\n\n _onTimedID3Metadata(timed_id3_metadata) {\n let timestamp_base = this._remuxer.getTimestampBase();\n if (timestamp_base == undefined) { return; }\n\n if (timed_id3_metadata.pts != undefined) {\n timed_id3_metadata.pts -= timestamp_base;\n }\n\n if (timed_id3_metadata.dts != undefined) {\n timed_id3_metadata.dts -= timestamp_base;\n }\n\n this._emitter.emit(TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED, timed_id3_metadata);\n }\n\n _onSMPTE2038Metadata(smpte2038_metadata) {\n let timestamp_base = this._remuxer.getTimestampBase();\n if (timestamp_base == undefined) { return; }\n\n if (smpte2038_metadata.pts != undefined) {\n smpte2038_metadata.pts -= timestamp_base;\n }\n\n if (smpte2038_metadata.dts != undefined) {\n smpte2038_metadata.dts -= timestamp_base;\n }\n\n if (smpte2038_metadata.nearest_pts != undefined) {\n smpte2038_metadata.nearest_pts -= timestamp_base;\n }\n\n this._emitter.emit(TransmuxingEvents.SMPTE2038_METADATA_ARRIVED, smpte2038_metadata);\n }\n\n _onSCTE35Metadata(scte35) {\n let timestamp_base = this._remuxer.getTimestampBase();\n if (timestamp_base == undefined) { return; }\n\n if (scte35.pts != undefined) {\n scte35.pts -= timestamp_base;\n }\n\n if (scte35.nearest_pts != undefined) {\n scte35.nearest_pts -= timestamp_base;\n }\n\n this._emitter.emit(TransmuxingEvents.SCTE35_METADATA_ARRIVED, scte35);\n }\n\n _onPESPrivateDataDescriptor(descriptor) {\n this._emitter.emit(TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR, descriptor);\n }\n\n _onPESPrivateData(private_data) {\n let timestamp_base = this._remuxer.getTimestampBase();\n if (timestamp_base == undefined) { return; }\n\n if (private_data.pts != undefined) {\n private_data.pts -= timestamp_base;\n }\n\n if (private_data.nearest_pts != undefined) {\n private_data.nearest_pts -= timestamp_base;\n }\n\n if (private_data.dts != undefined) {\n private_data.dts -= timestamp_base;\n }\n\n this._emitter.emit(TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED, private_data);\n }\n\n _onIOSeeked() {\n this._remuxer.insertDiscontinuity();\n }\n\n _onIOComplete(extraData) {\n let segmentIndex = extraData;\n let nextSegmentIndex = segmentIndex + 1;\n\n if (nextSegmentIndex < this._mediaDataSource.segments.length) {\n this._internalAbort();\n if (this._remuxer) {\n this._remuxer.flushStashedSamples();\n }\n this._loadSegment(nextSegmentIndex);\n } else {\n if (this._remuxer) {\n this._remuxer.flushStashedSamples();\n }\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n this._disableStatisticsReporter();\n }\n }\n\n _onIORedirect(redirectedURL) {\n let segmentIndex = this._ioctl.extraData;\n this._mediaDataSource.segments[segmentIndex].redirectedURL = redirectedURL;\n }\n\n _onIORecoveredEarlyEof() {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n }\n\n _onIOException(type, info) {\n Log.e(this.TAG, `IOException: type = ${type}, code = ${info.code}, msg = ${info.msg}`);\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n this._disableStatisticsReporter();\n }\n\n _onDemuxException(type, info) {\n Log.e(this.TAG, `DemuxException: type = ${type}, info = ${info}`);\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n }\n\n _onRemuxerInitSegmentArrival(type, initSegment) {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n }\n\n _onRemuxerMediaSegmentArrival(type, mediaSegment) {\n if (this._pendingSeekTime != null) {\n // Media segments after new-segment cross-seeking should be dropped.\n return;\n }\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n\n // Resolve pending seekPoint\n if (this._pendingResolveSeekPoint != null && type === 'video') {\n let syncPoints = mediaSegment.info.syncPoints;\n let seekpoint = this._pendingResolveSeekPoint;\n this._pendingResolveSeekPoint = null;\n\n // Safari: Pass PTS for recommend_seekpoint\n if (Browser.safari && syncPoints.length > 0 && syncPoints[0].originalDts === seekpoint) {\n seekpoint = syncPoints[0].pts;\n }\n // else: use original DTS (keyframe.milliseconds)\n\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, seekpoint);\n }\n }\n\n _enableStatisticsReporter() {\n if (this._statisticsReporter == null) {\n this._statisticsReporter = self.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n }\n\n _disableStatisticsReporter() {\n if (this._statisticsReporter) {\n self.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n _reportSegmentMediaInfo(segmentIndex) {\n let segmentInfo = this._mediaInfo.segments[segmentIndex];\n let exportInfo = Object.assign({}, segmentInfo);\n\n exportInfo.duration = this._mediaInfo.duration;\n exportInfo.segmentCount = this._mediaInfo.segmentCount;\n delete exportInfo.segments;\n delete exportInfo.keyframesIndex;\n\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, exportInfo);\n }\n\n _reportStatisticsInfo() {\n let info = {};\n\n info.url = this._ioctl.currentURL;\n info.hasRedirect = this._ioctl.hasRedirect;\n if (info.hasRedirect) {\n info.redirectedURL = this._ioctl.currentRedirectedURL;\n }\n\n info.speed = this._ioctl.currentSpeed;\n info.loaderType = this._ioctl.loaderType;\n info.currentSegmentIndex = this._currentSegmentIndex;\n info.totalSegmentCount = this._mediaDataSource.segments.length;\n\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, info);\n }\n\n}\n\nexport default TransmuxingController;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Utility class to calculate realtime network I/O speed\nclass SpeedSampler {\n\n constructor() {\n // milliseconds\n this._firstCheckpoint = 0;\n this._lastCheckpoint = 0;\n this._intervalBytes = 0;\n this._totalBytes = 0;\n this._lastSecondBytes = 0;\n\n // compatibility detection\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n }\n\n reset() {\n this._firstCheckpoint = this._lastCheckpoint = 0;\n this._totalBytes = this._intervalBytes = 0;\n this._lastSecondBytes = 0;\n }\n\n addBytes(bytes) {\n if (this._firstCheckpoint === 0) {\n this._firstCheckpoint = this._now();\n this._lastCheckpoint = this._firstCheckpoint;\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else if (this._now() - this._lastCheckpoint < 1000) {\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else { // duration >= 1000\n this._lastSecondBytes = this._intervalBytes;\n this._intervalBytes = bytes;\n this._totalBytes += bytes;\n this._lastCheckpoint = this._now();\n }\n }\n\n get currentKBps() {\n this.addBytes(0);\n\n let durationSeconds = (this._now() - this._lastCheckpoint) / 1000;\n if (durationSeconds == 0) durationSeconds = 1;\n return (this._intervalBytes / durationSeconds) / 1024;\n }\n\n get lastSecondKBps() {\n this.addBytes(0);\n\n if (this._lastSecondBytes !== 0) {\n return this._lastSecondBytes / 1024;\n } else { // lastSecondBytes === 0\n if (this._now() - this._lastCheckpoint >= 500) {\n // if time interval since last checkpoint has exceeded 500ms\n // the speed is nearly accurate\n return this.currentKBps;\n } else {\n // We don't know\n return 0;\n }\n }\n }\n\n get averageKBps() {\n let durationSeconds = (this._now() - this._firstCheckpoint) / 1000;\n return (this._totalBytes / durationSeconds) / 1024;\n }\n\n}\n\nexport default SpeedSampler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n/* fetch + stream IO loader. Currently working on chrome 43+.\n * fetch provides a better alternative http API to XMLHttpRequest\n *\n * fetch spec https://fetch.spec.whatwg.org/\n * stream spec https://streams.spec.whatwg.org/\n */\nclass FetchStreamLoader extends BaseLoader {\n\n static isSupported() {\n try {\n // fetch + stream is broken on Microsoft Edge. Disable before build 15048.\n // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8196907/\n // Fixed in Jan 10, 2017. Build 15048+ removed from blacklist.\n let isWorkWellEdge = Browser.msedge && Browser.version.minor >= 15048;\n let browserNotBlacklisted = Browser.msedge ? isWorkWellEdge : true;\n return (self.fetch && self.ReadableStream && browserNotBlacklisted);\n } catch (e) {\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('fetch-stream-loader');\n this.TAG = 'FetchStreamLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._requestAbort = false;\n this._abortController = null;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n\n let headers = new self.Headers();\n\n if (typeof seekConfig.headers === 'object') {\n let configHeaders = seekConfig.headers;\n for (let key in configHeaders) {\n if (configHeaders.hasOwnProperty(key)) {\n headers.append(key, configHeaders[key]);\n }\n }\n }\n\n let params = {\n method: 'GET',\n headers: headers,\n mode: 'cors',\n cache: 'default',\n // The default policy of Fetch API in the whatwg standard\n // Safari incorrectly indicates 'no-referrer' as default policy, fuck it\n referrerPolicy: 'no-referrer-when-downgrade'\n };\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n for (let key in this._config.headers) {\n headers.append(key, this._config.headers[key]);\n }\n }\n\n // cors is enabled by default\n if (dataSource.cors === false) {\n // no-cors means 'disregard cors policy', which can only be used in ServiceWorker\n params.mode = 'same-origin';\n }\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n params.credentials = 'include';\n }\n\n // referrerPolicy from config\n if (dataSource.referrerPolicy) {\n params.referrerPolicy = dataSource.referrerPolicy;\n }\n\n if (self.AbortController) {\n this._abortController = new self.AbortController();\n params.signal = this._abortController.signal;\n }\n\n this._status = LoaderStatus.kConnecting;\n self.fetch(seekConfig.url, params).then((res) => {\n if (this._requestAbort) {\n this._status = LoaderStatus.kIdle;\n res.body.cancel();\n return;\n }\n if (res.ok && (res.status >= 200 && res.status <= 299)) {\n if (res.url !== seekConfig.url) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(res.url);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n let lengthHeader = res.headers.get('Content-Length');\n if (lengthHeader != null) {\n this._contentLength = parseInt(lengthHeader);\n if (this._contentLength !== 0) {\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n return this._pump.call(this, res.body.getReader());\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: res.status, msg: res.statusText});\n } else {\n throw new RuntimeException('FetchStreamLoader: Http code invalid, ' + res.status + ' ' + res.statusText);\n }\n }\n }).catch((e) => {\n if (this._abortController && this._abortController.signal.aborted) {\n return;\n }\n\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, {code: -1, msg: e.message});\n } else {\n throw e;\n }\n });\n }\n\n abort() {\n this._requestAbort = true;\n\n if (this._status !== LoaderStatus.kBuffering || !Browser.chrome) {\n // Chrome may throw Exception-like things here, avoid using if is buffering\n if (this._abortController) {\n try {\n this._abortController.abort();\n } catch (e) {}\n }\n }\n }\n\n _pump(reader) { // ReadableStreamReader\n return reader.read().then((result) => {\n if (result.done) {\n // First check received length\n if (this._contentLength !== null && this._receivedLength < this._contentLength) {\n // Report Early-EOF\n this._status = LoaderStatus.kError;\n let type = LoaderErrors.EARLY_EOF;\n let info = {code: -1, msg: 'Fetch stream meet Early-EOF'};\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n } else {\n // OK. Download complete\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n } else {\n if (this._abortController && this._abortController.signal.aborted) {\n this._status = LoaderStatus.kComplete;\n return;\n } else if (this._requestAbort === true) {\n this._status = LoaderStatus.kComplete;\n return reader.cancel();\n }\n\n this._status = LoaderStatus.kBuffering;\n\n let chunk = result.value.buffer;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n this._pump(reader);\n }\n }).catch((e) => {\n if (this._abortController && this._abortController.signal.aborted) {\n this._status = LoaderStatus.kComplete;\n return;\n }\n\n if (e.code === 11 && Browser.msedge) { // InvalidStateError on Microsoft Edge\n // Workaround: Edge may throw InvalidStateError after ReadableStreamReader.cancel() call\n // Ignore the unknown exception.\n // Related issue: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11265202/\n return;\n }\n\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if ((e.code === 19 || e.message === 'network error') && // NETWORK_ERR\n (this._contentLength === null ||\n (this._contentLength !== null && this._receivedLength < this._contentLength))) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: e.code, msg: 'Fetch stream meet Early-EOF'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: e.code, msg: e.message};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n });\n }\n\n}\n\nexport default FetchStreamLoader;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For FireFox browser which supports `xhr.responseType = 'moz-chunked-arraybuffer'`\nclass MozChunkedLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n // Firefox 37- requires .open() to be called before setting responseType\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n return (xhr.responseType === 'moz-chunked-arraybuffer');\n } catch (e) {\n Log.w('MozChunkedLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-moz-chunked-loader');\n this.TAG = 'MozChunkedLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._xhr = null;\n this._requestAbort = false;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onloadend = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._requestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onloadend = this._onLoadEnd.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n // cors is auto detected and enabled by xhr\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n this._status = LoaderStatus.kConnecting;\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n if (this._xhr) {\n this._xhr.abort();\n }\n this._status = LoaderStatus.kComplete;\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined && xhr.responseURL !== this._requestURL) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n if (xhr.status !== 0 && (xhr.status < 200 || xhr.status > 299)) {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('MozChunkedLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n } else {\n this._status = LoaderStatus.kBuffering;\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n if (e.total !== null && e.total !== 0) {\n this._contentLength = e.total;\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onLoadEnd(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n } else if (this._status === LoaderStatus.kError) {\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && e.loaded < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'Moz-Chunked stream meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default MozChunkedLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// Universal IO Loader, implemented by adding Range header in xhr's request header\nclass RangeLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'arraybuffer';\n return (xhr.responseType === 'arraybuffer');\n } catch (e) {\n Log.w('RangeLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-range-loader');\n this.TAG = 'RangeLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = false;\n\n this._chunkSizeKBList = [\n 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192\n ];\n this._currentChunkSizeKB = 384;\n this._currentSpeedNormalized = 0;\n this._zeroSpeedChunkCount = 0;\n\n this._xhr = null;\n this._speedSampler = new SpeedSampler();\n\n this._requestAbort = false;\n this._waitForTotalLength = false;\n this._totalLengthReceived = false;\n\n this._currentRequestURL = null;\n this._currentRedirectedURL = null;\n this._currentRequestRange = null;\n this._totalLength = null; // size of the entire file\n this._contentLength = null; // Content-Length of entire request range\n this._receivedLength = 0; // total received bytes\n this._lastTimeLoaded = 0; // received bytes of current request sub-range\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n get currentSpeed() {\n return this._speedSampler.lastSecondKBps;\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n this._status = LoaderStatus.kConnecting;\n\n let useRefTotalLength = false;\n if (this._dataSource.filesize != undefined && this._dataSource.filesize !== 0) {\n useRefTotalLength = true;\n this._totalLength = this._dataSource.filesize;\n }\n\n if (!this._totalLengthReceived && !useRefTotalLength) {\n // We need total filesize\n this._waitForTotalLength = true;\n this._internalOpen(this._dataSource, {from: 0, to: -1});\n } else {\n // We have filesize, start loading\n this._openSubRange();\n }\n }\n\n _openSubRange() {\n let chunkSize = this._currentChunkSizeKB * 1024;\n\n let from = this._range.from + this._receivedLength;\n let to = from + chunkSize;\n\n if (this._contentLength != null) {\n if (to - this._range.from >= this._contentLength) {\n to = this._range.from + this._contentLength - 1;\n }\n }\n\n this._currentRequestRange = {from, to};\n this._internalOpen(this._dataSource, this._currentRequestRange);\n }\n\n _internalOpen(dataSource, range) {\n this._lastTimeLoaded = 0;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL) {\n if (this._currentRedirectedURL != undefined) {\n sourceURL = this._currentRedirectedURL;\n } else if (dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._currentRequestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onload = this._onLoad.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n this._internalAbort();\n this._status = LoaderStatus.kComplete;\n }\n\n _internalAbort() {\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr.abort();\n this._xhr = null;\n }\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined) { // if the browser support this property\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {\n this._currentRedirectedURL = redirectedURL;\n if (this._onURLRedirect) {\n this._onURLRedirect(redirectedURL);\n }\n }\n }\n\n if ((xhr.status >= 200 && xhr.status <= 299)) {\n if (this._waitForTotalLength) {\n return;\n }\n this._status = LoaderStatus.kBuffering;\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('RangeLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n let openNextRange = false;\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n this._totalLengthReceived = true;\n openNextRange = true;\n\n let total = e.total;\n this._internalAbort();\n if (total != null & total !== 0) {\n this._totalLength = total;\n }\n }\n\n // calculate currrent request range's contentLength\n if (this._range.to === -1) {\n this._contentLength = this._totalLength - this._range.from;\n } else { // to !== -1\n this._contentLength = this._range.to - this._range.from + 1;\n }\n\n if (openNextRange) {\n this._openSubRange();\n return;\n }\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n\n let delta = e.loaded - this._lastTimeLoaded;\n this._lastTimeLoaded = e.loaded;\n this._speedSampler.addBytes(delta);\n }\n\n _normalizeSpeed(input) {\n let list = this._chunkSizeKBList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _onLoad(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n return;\n }\n\n this._lastTimeLoaded = 0;\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps === 0) {\n this._zeroSpeedChunkCount++;\n if (this._zeroSpeedChunkCount >= 3) {\n // Try get currentKBps after 3 chunks\n KBps = this._speedSampler.currentKBps;\n }\n }\n\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._currentSpeedNormalized !== normalized) {\n this._currentSpeedNormalized = normalized;\n this._currentChunkSizeKB = normalized;\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n let reportComplete = false;\n\n if (this._contentLength != null && this._receivedLength < this._contentLength) {\n // continue load next chunk\n this._openSubRange();\n } else {\n reportComplete = true;\n }\n\n // dispatch received chunk\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n if (reportComplete) {\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && this._receivedLength > 0\n && this._receivedLength < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'RangeLoader meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default RangeLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For MPEG-TS/FLV over WebSocket live stream\nclass WebSocketLoader extends BaseLoader {\n\n static isSupported() {\n try {\n return (typeof self.WebSocket !== 'undefined');\n } catch (e) {\n return false;\n }\n }\n\n constructor() {\n super('websocket-loader');\n this.TAG = 'WebSocketLoader';\n\n this._needStash = true;\n\n this._ws = null;\n this._requestAbort = false;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this._ws) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource) {\n try {\n let ws = this._ws = new self.WebSocket(dataSource.url);\n ws.binaryType = 'arraybuffer';\n ws.onopen = this._onWebSocketOpen.bind(this);\n ws.onclose = this._onWebSocketClose.bind(this);\n ws.onmessage = this._onWebSocketMessage.bind(this);\n ws.onerror = this._onWebSocketError.bind(this);\n\n this._status = LoaderStatus.kConnecting;\n } catch (e) {\n this._status = LoaderStatus.kError;\n\n let info = {code: e.code, msg: e.message};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n abort() {\n let ws = this._ws;\n if (ws && (ws.readyState === 0 || ws.readyState === 1)) { // CONNECTING || OPEN\n this._requestAbort = true;\n ws.close();\n }\n\n this._ws = null;\n this._status = LoaderStatus.kComplete;\n }\n\n _onWebSocketOpen(e) {\n this._status = LoaderStatus.kBuffering;\n }\n\n _onWebSocketClose(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n\n if (this._onComplete) {\n this._onComplete(0, this._receivedLength - 1);\n }\n }\n\n _onWebSocketMessage(e) {\n if (e.data instanceof ArrayBuffer) {\n this._dispatchArrayBuffer(e.data);\n } else if (e.data instanceof Blob) {\n let reader = new FileReader();\n reader.onload = () => {\n this._dispatchArrayBuffer(reader.result);\n };\n reader.readAsArrayBuffer(e.data);\n } else {\n this._status = LoaderStatus.kError;\n let info = {code: -1, msg: 'Unsupported WebSocket message type: ' + e.data.constructor.name};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n _dispatchArrayBuffer(arraybuffer) {\n let chunk = arraybuffer;\n let byteStart = this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onWebSocketError(e) {\n this._status = LoaderStatus.kError;\n\n let info = {\n code: e.code,\n msg: e.message\n };\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default WebSocketLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass RangeSeekHandler {\n\n constructor(zeroStart) {\n this._zeroStart = zeroStart || false;\n }\n\n getConfig(url, range) {\n let headers = {};\n\n if (range.from !== 0 || range.to !== -1) {\n let param;\n if (range.to !== -1) {\n param = `bytes=${range.from.toString()}-${range.to.toString()}`;\n } else {\n param = `bytes=${range.from.toString()}-`;\n }\n headers['Range'] = param;\n } else if (this._zeroStart) {\n headers['Range'] = 'bytes=0-';\n }\n\n return {\n url: url,\n headers: headers\n };\n }\n\n removeURLParameters(seekedURL) {\n return seekedURL;\n }\n\n}\n\nexport default RangeSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass ParamSeekHandler {\n\n constructor(paramStart, paramEnd) {\n this._startName = paramStart;\n this._endName = paramEnd;\n }\n\n getConfig(baseUrl, range) {\n let url = baseUrl;\n\n if (range.from !== 0 || range.to !== -1) {\n let needAnd = true;\n if (url.indexOf('?') === -1) {\n url += '?';\n needAnd = false;\n }\n\n if (needAnd) {\n url += '&';\n }\n\n url += `${this._startName}=${range.from.toString()}`;\n\n if (range.to !== -1) {\n url += `&${this._endName}=${range.to.toString()}`;\n }\n }\n\n return {\n url: url,\n headers: {}\n };\n }\n\n removeURLParameters(seekedURL) {\n let baseURL = seekedURL.split('?')[0];\n let params = undefined;\n\n let queryIndex = seekedURL.indexOf('?');\n if (queryIndex !== -1) {\n params = seekedURL.substring(queryIndex + 1);\n }\n\n let resultParams = '';\n\n if (params != undefined && params.length > 0) {\n let pairs = params.split('&');\n\n for (let i = 0; i < pairs.length; i++) {\n let pair = pairs[i].split('=');\n let requireAnd = (i > 0);\n\n if (pair[0] !== this._startName && pair[0] !== this._endName) {\n if (requireAnd) {\n resultParams += '&';\n }\n resultParams += pairs[i];\n }\n }\n }\n\n return (resultParams.length === 0) ? baseURL : baseURL + '?' + resultParams;\n }\n\n}\n\nexport default ParamSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {LoaderStatus, LoaderErrors} from './loader.js';\nimport FetchStreamLoader from './fetch-stream-loader.js';\nimport MozChunkedLoader from './xhr-moz-chunked-loader.js';\nimport MSStreamLoader from './xhr-msstream-loader.js';\nimport RangeLoader from './xhr-range-loader.js';\nimport WebSocketLoader from './websocket-loader.js';\nimport RangeSeekHandler from './range-seek-handler.js';\nimport ParamSeekHandler from './param-seek-handler.js';\nimport {RuntimeException, IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n/**\n * DataSource: {\n * url: string,\n * filesize: number,\n * cors: boolean,\n * withCredentials: boolean\n * }\n * \n */\n\n// Manage IO Loaders\nclass IOController {\n\n constructor(dataSource, config, extraData) {\n this.TAG = 'IOController';\n\n this._config = config;\n this._extraData = extraData;\n\n this._stashInitialSize = 64 * 1024; // default initial size: 64KB\n if (config.stashInitialSize != undefined && config.stashInitialSize > 0) {\n // apply from config\n this._stashInitialSize = config.stashInitialSize;\n }\n\n this._stashUsed = 0;\n this._stashSize = this._stashInitialSize;\n this._bufferSize = 1024 * 1024 * 3; // initial size: 3MB\n this._stashBuffer = new ArrayBuffer(this._bufferSize);\n this._stashByteStart = 0;\n this._enableStash = true;\n if (config.enableStashBuffer === false) {\n this._enableStash = false;\n }\n\n this._loader = null;\n this._loaderClass = null;\n this._seekHandler = null;\n\n this._dataSource = dataSource;\n this._isWebSocketURL = /wss?:\\/\\/(.+?)/.test(dataSource.url);\n this._refTotalLength = dataSource.filesize ? dataSource.filesize : null;\n this._totalLength = this._refTotalLength;\n this._fullRequestFlag = false;\n this._currentRange = null;\n this._redirectedURL = null;\n\n this._speedNormalized = 0;\n this._speedSampler = new SpeedSampler();\n this._speedNormalizeList = [32, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096];\n\n this._isEarlyEofReconnecting = false;\n\n this._paused = false;\n this._resumeFrom = 0;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._selectSeekHandler();\n this._selectLoader();\n this._createLoader();\n }\n\n destroy() {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n this._loader.destroy();\n this._loader = null;\n this._loaderClass = null;\n this._dataSource = null;\n this._stashBuffer = null;\n this._stashUsed = this._stashSize = this._bufferSize = this._stashByteStart = 0;\n this._currentRange = null;\n this._speedSampler = null;\n\n this._isEarlyEofReconnecting = false;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._extraData = null;\n }\n\n isWorking() {\n return this._loader && this._loader.isWorking() && !this._paused;\n }\n\n isPaused() {\n return this._paused;\n }\n\n get status() {\n return this._loader.status;\n }\n\n get extraData() {\n return this._extraData;\n }\n\n set extraData(data) {\n this._extraData = data;\n }\n\n // prototype: function onDataArrival(chunks: ArrayBuffer, byteStart: number): number\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onSeeked() {\n return this._onSeeked;\n }\n\n set onSeeked(callback) {\n this._onSeeked = callback;\n }\n\n // prototype: function onError(type: number, info: {code: number, msg: string}): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n get onRedirect() {\n return this._onRedirect;\n }\n\n set onRedirect(callback) {\n this._onRedirect = callback;\n }\n\n get onRecoveredEarlyEof() {\n return this._onRecoveredEarlyEof;\n }\n\n set onRecoveredEarlyEof(callback) {\n this._onRecoveredEarlyEof = callback;\n }\n\n get currentURL() {\n return this._dataSource.url;\n }\n\n get hasRedirect() {\n return (this._redirectedURL != null || this._dataSource.redirectedURL != undefined);\n }\n\n get currentRedirectedURL() {\n return this._redirectedURL || this._dataSource.redirectedURL;\n }\n\n // in KB/s\n get currentSpeed() {\n if (this._loaderClass === RangeLoader) {\n // SpeedSampler is inaccuracy if loader is RangeLoader\n return this._loader.currentSpeed;\n }\n return this._speedSampler.lastSecondKBps;\n }\n\n get loaderType() {\n return this._loader.type;\n }\n\n _selectSeekHandler() {\n let config = this._config;\n\n if (config.seekType === 'range') {\n this._seekHandler = new RangeSeekHandler(this._config.rangeLoadZeroStart);\n } else if (config.seekType === 'param') {\n let paramStart = config.seekParamStart || 'bstart';\n let paramEnd = config.seekParamEnd || 'bend';\n\n this._seekHandler = new ParamSeekHandler(paramStart, paramEnd);\n } else if (config.seekType === 'custom') {\n if (typeof config.customSeekHandler !== 'function') {\n throw new InvalidArgumentException('Custom seekType specified in config but invalid customSeekHandler!');\n }\n this._seekHandler = new config.customSeekHandler();\n } else {\n throw new InvalidArgumentException(`Invalid seekType in config: ${config.seekType}`);\n }\n }\n\n _selectLoader() {\n if (this._config.customLoader != null) {\n this._loaderClass = this._config.customLoader;\n } else if (this._isWebSocketURL) {\n this._loaderClass = WebSocketLoader;\n } else if (FetchStreamLoader.isSupported()) {\n this._loaderClass = FetchStreamLoader;\n } else if (MozChunkedLoader.isSupported()) {\n this._loaderClass = MozChunkedLoader;\n } else if (RangeLoader.isSupported()) {\n this._loaderClass = RangeLoader;\n } else {\n throw new RuntimeException('Your browser doesn\\'t support xhr with arraybuffer responseType!');\n }\n }\n\n _createLoader() {\n this._loader = new this._loaderClass(this._seekHandler, this._config);\n if (this._loader.needStashBuffer === false) {\n this._enableStash = false;\n }\n this._loader.onContentLengthKnown = this._onContentLengthKnown.bind(this);\n this._loader.onURLRedirect = this._onURLRedirect.bind(this);\n this._loader.onDataArrival = this._onLoaderChunkArrival.bind(this);\n this._loader.onComplete = this._onLoaderComplete.bind(this);\n this._loader.onError = this._onLoaderError.bind(this);\n }\n\n open(optionalFrom) {\n this._currentRange = {from: 0, to: -1};\n if (optionalFrom) {\n this._currentRange.from = optionalFrom;\n }\n\n this._speedSampler.reset();\n if (!optionalFrom) {\n this._fullRequestFlag = true;\n }\n\n this._loader.open(this._dataSource, Object.assign({}, this._currentRange));\n }\n\n abort() {\n this._loader.abort();\n\n if (this._paused) {\n this._paused = false;\n this._resumeFrom = 0;\n }\n }\n\n pause() {\n if (this.isWorking()) {\n this._loader.abort();\n\n if (this._stashUsed !== 0) {\n this._resumeFrom = this._stashByteStart;\n this._currentRange.to = this._stashByteStart - 1;\n } else {\n this._resumeFrom = this._currentRange.to + 1;\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._paused = true;\n }\n }\n\n resume() {\n if (this._paused) {\n this._paused = false;\n let bytes = this._resumeFrom;\n this._resumeFrom = 0;\n this._internalSeek(bytes, true);\n }\n }\n\n seek(bytes) {\n this._paused = false;\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._internalSeek(bytes, true);\n }\n\n /**\n * When seeking request is from media seeking, unconsumed stash data should be dropped\n * However, stash data shouldn't be dropped if seeking requested from http reconnection\n *\n * @dropUnconsumed: Ignore and discard all unconsumed data in stash buffer\n */\n _internalSeek(bytes, dropUnconsumed) {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n\n // dispatch & flush stash buffer before seek\n this._flushStashBuffer(dropUnconsumed);\n\n this._loader.destroy();\n this._loader = null;\n\n let requestRange = {from: bytes, to: -1};\n this._currentRange = {from: requestRange.from, to: -1};\n\n this._speedSampler.reset();\n this._stashSize = this._stashInitialSize;\n this._createLoader();\n this._loader.open(this._dataSource, requestRange);\n\n if (this._onSeeked) {\n this._onSeeked();\n }\n }\n\n updateUrl(url) {\n if (!url || typeof url !== 'string' || url.length === 0) {\n throw new InvalidArgumentException('Url must be a non-empty string!');\n }\n\n this._dataSource.url = url;\n\n // TODO: replace with new url\n }\n\n _expandBuffer(expectedBytes) {\n let bufferNewSize = this._stashSize;\n while (bufferNewSize + 1024 * 1024 * 1 < expectedBytes) {\n bufferNewSize *= 2;\n }\n\n bufferNewSize += 1024 * 1024 * 1; // bufferSize = stashSize + 1MB\n if (bufferNewSize === this._bufferSize) {\n return;\n }\n\n let newBuffer = new ArrayBuffer(bufferNewSize);\n\n if (this._stashUsed > 0) { // copy existing data into new buffer\n let stashOldArray = new Uint8Array(this._stashBuffer, 0, this._stashUsed);\n let stashNewArray = new Uint8Array(newBuffer, 0, bufferNewSize);\n stashNewArray.set(stashOldArray, 0);\n }\n\n this._stashBuffer = newBuffer;\n this._bufferSize = bufferNewSize;\n }\n\n _normalizeSpeed(input) {\n let list = this._speedNormalizeList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n // binary search\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _adjustStashSize(normalized) {\n let stashSizeKB = 0;\n\n if (this._config.isLive) {\n // live stream: always use 1/8 normalized speed for size of stashSizeKB\n stashSizeKB = normalized / 8;\n } else {\n if (normalized < 512) {\n stashSizeKB = normalized;\n } else if (normalized >= 512 && normalized <= 1024) {\n stashSizeKB = Math.floor(normalized * 1.5);\n } else {\n stashSizeKB = normalized * 2;\n }\n }\n\n if (stashSizeKB > 8192) {\n stashSizeKB = 8192;\n }\n\n let bufferSize = stashSizeKB * 1024 + 1024 * 1024 * 1; // stashSize + 1MB\n if (this._bufferSize < bufferSize) {\n this._expandBuffer(bufferSize);\n }\n this._stashSize = stashSizeKB * 1024;\n }\n\n _dispatchChunks(chunks, byteStart) {\n this._currentRange.to = byteStart + chunks.byteLength - 1;\n return this._onDataArrival(chunks, byteStart);\n }\n\n _onURLRedirect(redirectedURL) {\n this._redirectedURL = redirectedURL;\n if (this._onRedirect) {\n this._onRedirect(redirectedURL);\n }\n }\n\n _onContentLengthKnown(contentLength) {\n if (contentLength && this._fullRequestFlag) {\n this._totalLength = contentLength;\n this._fullRequestFlag = false;\n }\n }\n\n _onLoaderChunkArrival(chunk, byteStart, receivedLength) {\n if (!this._onDataArrival) {\n throw new IllegalStateException('IOController: No existing consumer (onDataArrival) callback!');\n }\n if (this._paused) {\n return;\n }\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof succeed, notify to upper-layer by callback\n this._isEarlyEofReconnecting = false;\n if (this._onRecoveredEarlyEof) {\n this._onRecoveredEarlyEof();\n }\n }\n\n this._speedSampler.addBytes(chunk.byteLength);\n\n // adjust stash buffer size according to network speed dynamically\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._speedNormalized !== normalized) {\n this._speedNormalized = normalized;\n this._adjustStashSize(normalized);\n }\n }\n\n if (!this._enableStash) { // disable stash\n if (this._stashUsed === 0) {\n // dispatch chunk directly to consumer;\n // check ret value (consumed bytes) and stash unconsumed to stashBuffer\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) { // unconsumed data remain.\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n } else {\n // else: Merge chunk into stashBuffer, and dispatch stashBuffer to consumer.\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n let consumed = this._dispatchChunks(this._stashBuffer.slice(0, this._stashUsed), this._stashByteStart);\n if (consumed < this._stashUsed && consumed > 0) { // unconsumed data remain\n let remainArray = new Uint8Array(this._stashBuffer, consumed);\n stashArray.set(remainArray, 0);\n }\n this._stashUsed -= consumed;\n this._stashByteStart += consumed;\n }\n } else { // enable stash\n if (this._stashUsed === 0 && this._stashByteStart === 0) { // seeked? or init chunk?\n // This is the first chunk after seek action\n this._stashByteStart = byteStart;\n }\n if (this._stashUsed + chunk.byteLength <= this._stashSize) {\n // just stash\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._stashSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stashUsed + chunkSize > stashSize, size limit exceeded\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n if (this._stashUsed > 0) { // There're stash datas in buffer\n // dispatch the whole stashBuffer, and stash remain data\n // then append chunk to stashBuffer (stash)\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n if (consumed < buffer.byteLength) {\n if (consumed > 0) {\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n } else {\n this._stashUsed = 0;\n this._stashByteStart += consumed;\n }\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stash buffer empty, but chunkSize > stashSize (oh, holy shit)\n // dispatch chunk directly and stash remain data\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) {\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n }\n }\n }\n }\n\n _flushStashBuffer(dropUnconsumed) {\n if (this._stashUsed > 0) {\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n let remain = buffer.byteLength - consumed;\n\n if (consumed < buffer.byteLength) {\n if (dropUnconsumed) {\n Log.w(this.TAG, `${remain} bytes unconsumed data remain when flush buffer, dropped`);\n } else {\n if (consumed > 0) {\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n return 0;\n }\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n return remain;\n }\n return 0;\n }\n\n _onLoaderComplete(from, to) {\n // Force-flush stash buffer, and drop unconsumed data\n this._flushStashBuffer(true);\n\n if (this._onComplete) {\n this._onComplete(this._extraData);\n }\n }\n\n _onLoaderError(type, data) {\n Log.e(this.TAG, `Loader error, code = ${data.code}, msg = ${data.msg}`);\n\n this._flushStashBuffer(false);\n\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof failed, throw UnrecoverableEarlyEof error to upper-layer\n this._isEarlyEofReconnecting = false;\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n }\n\n switch (type) {\n case LoaderErrors.EARLY_EOF: {\n if (!this._config.isLive) {\n // Do internal http reconnect if not live stream\n if (this._totalLength) {\n let nextFrom = this._currentRange.to + 1;\n if (nextFrom < this._totalLength) {\n Log.w(this.TAG, 'Connection lost, trying reconnect...');\n this._isEarlyEofReconnecting = true;\n this._internalSeek(nextFrom, false);\n }\n return;\n }\n // else: We don't know totalLength, throw UnrecoverableEarlyEof\n }\n // live stream: throw UnrecoverableEarlyEof error to upper-layer\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n break;\n }\n case LoaderErrors.UNRECOVERABLE_EARLY_EOF:\n case LoaderErrors.CONNECTING_TIMEOUT:\n case LoaderErrors.HTTP_STATUS_CODE_INVALID:\n case LoaderErrors.EXCEPTION:\n break;\n }\n\n if (this._onError) {\n this._onError(type, data);\n } else {\n throw new RuntimeException('IOException: ' + data.msg);\n }\n }\n\n}\n\nexport default IOController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass Polyfill {\n\n static install() {\n // ES6 Object.setPrototypeOf\n Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {\n obj.__proto__ = proto;\n return obj;\n };\n\n // ES6 Object.assign\n Object.assign = Object.assign || function (target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n let output = Object(target);\n for (let i = 1; i < arguments.length; i++) {\n let source = arguments[i];\n if (source !== undefined && source !== null) {\n for (let key in source) {\n if (source.hasOwnProperty(key)) {\n output[key] = source[key];\n }\n }\n }\n }\n return output;\n };\n\n // ES6 Promise (missing support in IE11)\n if (typeof self.Promise !== 'function') {\n require('es6-promise').polyfill();\n }\n }\n\n}\n\nPolyfill.install();\n\nexport default Polyfill;","function webpackBootstrapFunc (modules) {\n/******/ // The module cache\n/******/ var installedModules = {};\n\n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n\n/******/ // Check if module is in cache\n/******/ if(installedModules[moduleId])\n/******/ return installedModules[moduleId].exports;\n\n/******/ // Create a new module (and put it into the cache)\n/******/ var module = installedModules[moduleId] = {\n/******/ i: moduleId,\n/******/ l: false,\n/******/ exports: {}\n/******/ };\n\n/******/ // Execute the module function\n/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ // Flag the module as loaded\n/******/ module.l = true;\n\n/******/ // Return the exports of the module\n/******/ return module.exports;\n/******/ }\n\n/******/ // expose the modules object (__webpack_modules__)\n/******/ __webpack_require__.m = modules;\n\n/******/ // expose the module cache\n/******/ __webpack_require__.c = installedModules;\n\n/******/ // identity function for calling harmony imports with the correct context\n/******/ __webpack_require__.i = function(value) { return value; };\n\n/******/ // define getter function for harmony exports\n/******/ __webpack_require__.d = function(exports, name, getter) {\n/******/ if(!__webpack_require__.o(exports, name)) {\n/******/ Object.defineProperty(exports, name, {\n/******/ configurable: false,\n/******/ enumerable: true,\n/******/ get: getter\n/******/ });\n/******/ }\n/******/ };\n\n/******/ // define __esModule on exports\n/******/ __webpack_require__.r = function(exports) {\n/******/ Object.defineProperty(exports, '__esModule', { value: true });\n/******/ };\n\n/******/ // getDefaultExport function for compatibility with non-harmony modules\n/******/ __webpack_require__.n = function(module) {\n/******/ var getter = module && module.__esModule ?\n/******/ function getDefault() { return module['default']; } :\n/******/ function getModuleExports() { return module; };\n/******/ __webpack_require__.d(getter, 'a', getter);\n/******/ return getter;\n/******/ };\n\n/******/ // Object.prototype.hasOwnProperty.call\n/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n/******/ // __webpack_public_path__\n/******/ __webpack_require__.p = \"/\";\n\n/******/ // on error function for async loading\n/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n var f = __webpack_require__(__webpack_require__.s = ENTRY_MODULE)\n return f.default || f // try to call default if defined to also support babel esmodule exports\n}\n\nvar moduleNameReqExp = '[\\\\.|\\\\-|\\\\+|\\\\w|\\/|@]+'\nvar dependencyRegExp = '\\\\(\\\\s*(\\/\\\\*.*?\\\\*\\/)?\\\\s*.*?(' + moduleNameReqExp + ').*?\\\\)' // additional chars when output.pathinfo is true\n\n// http://stackoverflow.com/a/2593661/130442\nfunction quoteRegExp (str) {\n return (str + '').replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&')\n}\n\nfunction isNumeric(n) {\n return !isNaN(1 * n); // 1 * n converts integers, integers as string (\"123\"), 1e3 and \"1e3\" to integers and strings to NaN\n}\n\nfunction getModuleDependencies (sources, module, queueName) {\n var retval = {}\n retval[queueName] = []\n\n var fnString = module.toString()\n var wrapperSignature = fnString.match(/^function\\s?\\w*\\(\\w+,\\s*\\w+,\\s*(\\w+)\\)/)\n if (!wrapperSignature) return retval\n var webpackRequireName = wrapperSignature[1]\n\n // main bundle deps\n var re = new RegExp('(\\\\\\\\n|\\\\W)' + quoteRegExp(webpackRequireName) + dependencyRegExp, 'g')\n var match\n while ((match = re.exec(fnString))) {\n if (match[3] === 'dll-reference') continue\n retval[queueName].push(match[3])\n }\n\n // dll deps\n re = new RegExp('\\\\(' + quoteRegExp(webpackRequireName) + '\\\\(\"(dll-reference\\\\s(' + moduleNameReqExp + '))\"\\\\)\\\\)' + dependencyRegExp, 'g')\n while ((match = re.exec(fnString))) {\n if (!sources[match[2]]) {\n retval[queueName].push(match[1])\n sources[match[2]] = __webpack_require__(match[1]).m\n }\n retval[match[2]] = retval[match[2]] || []\n retval[match[2]].push(match[4])\n }\n\n // convert 1e3 back to 1000 - this can be important after uglify-js converted 1000 to 1e3\n var keys = Object.keys(retval);\n for (var i = 0; i < keys.length; i++) {\n for (var j = 0; j < retval[keys[i]].length; j++) {\n if (isNumeric(retval[keys[i]][j])) {\n retval[keys[i]][j] = 1 * retval[keys[i]][j];\n }\n }\n }\n\n return retval\n}\n\nfunction hasValuesInQueues (queues) {\n var keys = Object.keys(queues)\n return keys.reduce(function (hasValues, key) {\n return hasValues || queues[key].length > 0\n }, false)\n}\n\nfunction getRequiredModules (sources, moduleId) {\n var modulesQueue = {\n main: [moduleId]\n }\n var requiredModules = {\n main: []\n }\n var seenModules = {\n main: {}\n }\n\n while (hasValuesInQueues(modulesQueue)) {\n var queues = Object.keys(modulesQueue)\n for (var i = 0; i < queues.length; i++) {\n var queueName = queues[i]\n var queue = modulesQueue[queueName]\n var moduleToCheck = queue.pop()\n seenModules[queueName] = seenModules[queueName] || {}\n if (seenModules[queueName][moduleToCheck] || !sources[queueName][moduleToCheck]) continue\n seenModules[queueName][moduleToCheck] = true\n requiredModules[queueName] = requiredModules[queueName] || []\n requiredModules[queueName].push(moduleToCheck)\n var newModules = getModuleDependencies(sources, sources[queueName][moduleToCheck], queueName)\n var newModulesKeys = Object.keys(newModules)\n for (var j = 0; j < newModulesKeys.length; j++) {\n modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]] || []\n modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]].concat(newModules[newModulesKeys[j]])\n }\n }\n }\n\n return requiredModules\n}\n\nmodule.exports = function (moduleId, options) {\n options = options || {}\n var sources = {\n main: __webpack_modules__\n }\n\n var requiredModules = options.all ? { main: Object.keys(sources.main) } : getRequiredModules(sources, moduleId)\n\n var src = ''\n\n Object.keys(requiredModules).filter(function (m) { return m !== 'main' }).forEach(function (module) {\n var entryModule = 0\n while (requiredModules[module][entryModule]) {\n entryModule++\n }\n requiredModules[module].push(entryModule)\n sources[module][entryModule] = '(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })'\n src = src + 'var ' + module + ' = (' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(entryModule)) + ')({' + requiredModules[module].map(function (id) { return '' + JSON.stringify(id) + ': ' + sources[module][id].toString() }).join(',') + '});\\n'\n })\n\n src = src + 'new ((' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(moduleId)) + ')({' + requiredModules.main.map(function (id) { return '' + JSON.stringify(id) + ': ' + sources.main[id].toString() }).join(',') + '}))(self);'\n\n var blob = new window.Blob([src], { type: 'text/javascript' })\n if (options.bare) { return blob }\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL\n\n var workerUrl = URL.createObjectURL(blob)\n var worker = new window.Worker(workerUrl)\n worker.objectURL = workerUrl\n\n return worker\n}\n","// entry/index file\n\n// make it compatible with browserify's umd wrapper\nmodule.exports = require('./mpegts.js').default;\n","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.8+1e68dce6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var vertx = Function('return this')().require('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n var then$$1 = void 0;\n try {\n then$$1 = value.then;\n } catch (error) {\n reject(promise, error);\n return;\n }\n handleMaybeThenable(promise, value, then$$1);\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = true;\n\n if (hasCallback) {\n try {\n value = callback(detail);\n } catch (e) {\n succeeded = false;\n error = e;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (succeeded === false) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = void 0;\n var error = void 0;\n var didError = false;\n try {\n _then = entry.then;\n } catch (e) {\n didError = true;\n error = e;\n }\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n if (didError) {\n reject(promise, error);\n } else {\n handleMaybeThenable(promise, entry, _then);\n }\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n if (isFunction(callback)) {\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n }\n\n return promise.then(callback, callback);\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport Polyfill from '../utils/polyfill.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\n\n/* post message to worker:\n data: {\n cmd: string\n param: any\n }\n\n receive message from worker:\n data: {\n msg: string,\n data: any\n }\n */\n\nlet TransmuxingWorker = function (self) {\n\n let TAG = 'TransmuxingWorker';\n let controller = null;\n let logcatListener = onLogcatCallback.bind(this);\n\n Polyfill.install();\n\n self.addEventListener('message', function (e) {\n switch (e.data.cmd) {\n case 'init':\n controller = new TransmuxingController(e.data.param[0], e.data.param[1]);\n controller.on(TransmuxingEvents.IO_ERROR, onIOError.bind(this));\n controller.on(TransmuxingEvents.DEMUX_ERROR, onDemuxError.bind(this));\n controller.on(TransmuxingEvents.INIT_SEGMENT, onInitSegment.bind(this));\n controller.on(TransmuxingEvents.MEDIA_SEGMENT, onMediaSegment.bind(this));\n controller.on(TransmuxingEvents.LOADING_COMPLETE, onLoadingComplete.bind(this));\n controller.on(TransmuxingEvents.RECOVERED_EARLY_EOF, onRecoveredEarlyEof.bind(this));\n controller.on(TransmuxingEvents.MEDIA_INFO, onMediaInfo.bind(this));\n controller.on(TransmuxingEvents.METADATA_ARRIVED, onMetaDataArrived.bind(this));\n controller.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, onScriptDataArrived.bind(this));\n controller.on(TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED, onTimedID3MetadataArrived.bind(this));\n controller.on(TransmuxingEvents.SMPTE2038_METADATA_ARRIVED, onSMPTE2038MetadataArrived.bind(this));\n controller.on(TransmuxingEvents.SCTE35_METADATA_ARRIVED, onSCTE35MetadataArrived.bind(this));\n controller.on(TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR, onPESPrivateDataDescriptor.bind(this));\n controller.on(TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED, onPESPrivateDataArrived.bind(this));\n controller.on(TransmuxingEvents.STATISTICS_INFO, onStatisticsInfo.bind(this));\n controller.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, onRecommendSeekpoint.bind(this));\n break;\n case 'destroy':\n if (controller) {\n controller.destroy();\n controller = null;\n }\n self.postMessage({msg: 'destroyed'});\n break;\n case 'start':\n controller.start();\n break;\n case 'stop':\n controller.stop();\n break;\n case 'seek':\n controller.seek(e.data.param);\n break;\n case 'pause':\n controller.pause();\n break;\n case 'resume':\n controller.resume();\n break;\n case 'logging_config': {\n let config = e.data.param;\n LoggingControl.applyConfig(config);\n\n if (config.enableCallback === true) {\n LoggingControl.addLogListener(logcatListener);\n } else {\n LoggingControl.removeLogListener(logcatListener);\n }\n break;\n }\n }\n });\n\n function onInitSegment(type, initSegment) {\n let obj = {\n msg: TransmuxingEvents.INIT_SEGMENT,\n data: {\n type: type,\n data: initSegment\n }\n };\n self.postMessage(obj, [initSegment.data]); // data: ArrayBuffer\n }\n\n function onMediaSegment(type, mediaSegment) {\n let obj = {\n msg: TransmuxingEvents.MEDIA_SEGMENT,\n data: {\n type: type,\n data: mediaSegment\n }\n };\n self.postMessage(obj, [mediaSegment.data]); // data: ArrayBuffer\n }\n\n function onLoadingComplete() {\n let obj = {\n msg: TransmuxingEvents.LOADING_COMPLETE\n };\n self.postMessage(obj);\n }\n\n function onRecoveredEarlyEof() {\n let obj = {\n msg: TransmuxingEvents.RECOVERED_EARLY_EOF\n };\n self.postMessage(obj);\n }\n\n function onMediaInfo(mediaInfo) {\n let obj = {\n msg: TransmuxingEvents.MEDIA_INFO,\n data: mediaInfo\n };\n self.postMessage(obj);\n }\n\n function onMetaDataArrived(metadata) {\n let obj = {\n msg: TransmuxingEvents.METADATA_ARRIVED,\n data: metadata\n };\n self.postMessage(obj);\n }\n\n function onScriptDataArrived(data) {\n let obj = {\n msg: TransmuxingEvents.SCRIPTDATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onTimedID3MetadataArrived (data) {\n let obj = {\n msg: TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onSMPTE2038MetadataArrived (data) {\n let obj = {\n msg: TransmuxingEvents.SMPTE2038_METADATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onSCTE35MetadataArrived (data) {\n let obj = {\n msg: TransmuxingEvents.SCTE35_METADATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onPESPrivateDataDescriptor(data) {\n let obj = {\n msg: TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onPESPrivateDataArrived(data) {\n let obj = {\n msg: TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onStatisticsInfo(statInfo) {\n let obj = {\n msg: TransmuxingEvents.STATISTICS_INFO,\n data: statInfo\n };\n self.postMessage(obj);\n }\n\n function onIOError(type, info) {\n self.postMessage({\n msg: TransmuxingEvents.IO_ERROR,\n data: {\n type: type,\n info: info\n }\n });\n }\n\n function onDemuxError(type, info) {\n self.postMessage({\n msg: TransmuxingEvents.DEMUX_ERROR,\n data: {\n type: type,\n info: info\n }\n });\n }\n\n function onRecommendSeekpoint(milliseconds) {\n self.postMessage({\n msg: TransmuxingEvents.RECOMMEND_SEEKPOINT,\n data: milliseconds\n });\n }\n\n function onLogcatCallback(type, str) {\n self.postMessage({\n msg: 'logcat_callback',\n data: {\n type: type,\n logcat: str\n }\n });\n }\n\n};\n\nexport default TransmuxingWorker;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const defaultConfig = {\n enableWorker: false,\n enableStashBuffer: true,\n stashInitialSize: undefined,\n\n isLive: false,\n\n liveBufferLatencyChasing: false,\n liveBufferLatencyMaxLatency: 1.5,\n liveBufferLatencyMinRemain: 0.5,\n\n lazyLoad: true,\n lazyLoadMaxDuration: 3 * 60,\n lazyLoadRecoverDuration: 30,\n deferLoadAfterSourceOpen: true,\n\n // autoCleanupSourceBuffer: default as false, leave unspecified\n autoCleanupMaxBackwardDuration: 3 * 60,\n autoCleanupMinBackwardDuration: 2 * 60,\n\n statisticsInfoReportInterval: 600,\n\n fixAudioTimestampGap: true,\n\n accurateSeek: false,\n seekType: 'range', // [range, param, custom]\n seekParamStart: 'bstart',\n seekParamEnd: 'bend',\n rangeLoadZeroStart: false,\n customSeekHandler: undefined,\n reuseRedirectedURL: false,\n // referrerPolicy: leave as unspecified\n\n headers: undefined,\n customLoader: undefined\n};\n\nexport function createDefaultConfig() {\n return Object.assign({}, defaultConfig);\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport IOController from '../io/io-controller.js';\nimport {createDefaultConfig} from '../config.js';\n\nclass Features {\n\n static supportMSEH264Playback() {\n return window.MediaSource &&\n window.MediaSource.isTypeSupported('video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"');\n }\n\n static supportMSEH265Playback() {\n return window.MediaSource &&\n window.MediaSource.isTypeSupported('video/mp4; codecs=\"hvc1.1.6.L93.B0\"');\n }\n\n static supportNetworkStreamIO() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType == 'fetch-stream-loader' || loaderType == 'xhr-moz-chunked-loader';\n }\n\n static getNetworkLoaderTypeName() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType;\n }\n\n static supportNativeMediaPlayback(mimeType) {\n if (Features.videoElement == undefined) {\n Features.videoElement = window.document.createElement('video');\n }\n let canPlay = Features.videoElement.canPlayType(mimeType);\n return canPlay === 'probably' || canPlay == 'maybe';\n }\n\n static getFeatureList() {\n let features = {\n msePlayback: false,\n mseLivePlayback: false,\n mseH265Playback: false,\n networkStreamIO: false,\n networkLoaderName: '',\n nativeMP4H264Playback: false,\n nativeMP4H265Playback: false,\n nativeWebmVP8Playback: false,\n nativeWebmVP9Playback: false\n };\n\n features.msePlayback = Features.supportMSEH264Playback();\n features.networkStreamIO = Features.supportNetworkStreamIO();\n features.networkLoaderName = Features.getNetworkLoaderTypeName();\n features.mseLivePlayback = features.msePlayback && features.networkStreamIO;\n features.mseH265Playback = Features.supportMSEH265Playback();\n features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"');\n features.nativeMP4H265Playback = Features.supportNativeMediaPlayback('video/mp4; codecs=\"hvc1.1.6.L93.B0\"');\n features.nativeWebmVP8Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp8.0, vorbis\"');\n features.nativeWebmVP9Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp9\"');\n\n return features;\n }\n\n}\n\nexport default Features;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst PlayerEvents = {\n ERROR: 'error',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n METADATA_ARRIVED: 'metadata_arrived',\n SCRIPTDATA_ARRIVED: 'scriptdata_arrived',\n TIMED_ID3_METADATA_ARRIVED: 'timed_id3_metadata_arrived',\n SMPTE2038_METADATA_ARRIVED: 'smpte2038_metadata_arrived',\n SCTE35_METADATA_ARRIVED: 'scte35_metadata_arrived',\n PES_PRIVATE_DATA_DESCRIPTOR: 'pes_private_data_descriptor',\n PES_PRIVATE_DATA_ARRIVED: 'pes_private_data_arrived',\n STATISTICS_INFO: 'statistics_info'\n};\n\nexport default PlayerEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport work from 'webworkify-webpack';\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport TransmuxingWorker from './transmuxing-worker.js';\nimport MediaInfo from './media-info.js';\n\nclass Transmuxer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'Transmuxer';\n this._emitter = new EventEmitter();\n\n if (config.enableWorker && typeof (Worker) !== 'undefined') {\n try {\n this._worker = work(require.resolve('./transmuxing-worker'));\n this._workerDestroying = false;\n this._worker.addEventListener('message', this._onWorkerMessage.bind(this));\n this._worker.postMessage({cmd: 'init', param: [mediaDataSource, config]});\n this.e = {\n onLoggingConfigChanged: this._onLoggingConfigChanged.bind(this)\n };\n LoggingControl.registerListener(this.e.onLoggingConfigChanged);\n this._worker.postMessage({cmd: 'logging_config', param: LoggingControl.getConfig()});\n } catch (error) {\n Log.e(this.TAG, 'Error while initialize transmuxing worker, fallback to inline transmuxing');\n this._worker = null;\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n } else {\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n\n if (this._controller) {\n let ctl = this._controller;\n ctl.on(TransmuxingEvents.IO_ERROR, this._onIOError.bind(this));\n ctl.on(TransmuxingEvents.DEMUX_ERROR, this._onDemuxError.bind(this));\n ctl.on(TransmuxingEvents.INIT_SEGMENT, this._onInitSegment.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_SEGMENT, this._onMediaSegment.bind(this));\n ctl.on(TransmuxingEvents.LOADING_COMPLETE, this._onLoadingComplete.bind(this));\n ctl.on(TransmuxingEvents.RECOVERED_EARLY_EOF, this._onRecoveredEarlyEof.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_INFO, this._onMediaInfo.bind(this));\n ctl.on(TransmuxingEvents.METADATA_ARRIVED, this._onMetaDataArrived.bind(this));\n ctl.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, this._onScriptDataArrived.bind(this));\n ctl.on(TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED, this._onTimedID3MetadataArrived.bind(this));\n ctl.on(TransmuxingEvents.SMPTE2038_METADATA_ARRIVED, this._onSMPTE2038MetadataArrived.bind(this));\n ctl.on(TransmuxingEvents.SCTE35_METADATA_ARRIVED, this._onSCTE35MetadataArrived.bind(this));\n ctl.on(TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR, this._onPESPrivateDataDescriptor.bind(this));\n ctl.on(TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED, this._onPESPrivateDataArrived.bind(this));\n ctl.on(TransmuxingEvents.STATISTICS_INFO, this._onStatisticsInfo.bind(this));\n ctl.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, this._onRecommendSeekpoint.bind(this));\n }\n }\n\n destroy() {\n if (this._worker) {\n if (!this._workerDestroying) {\n this._workerDestroying = true;\n this._worker.postMessage({cmd: 'destroy'});\n LoggingControl.removeListener(this.e.onLoggingConfigChanged);\n this.e = null;\n }\n } else {\n this._controller.destroy();\n this._controller = null;\n }\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n hasWorker() {\n return this._worker != null;\n }\n\n open() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'start'});\n } else {\n this._controller.start();\n }\n }\n\n close() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'stop'});\n } else {\n this._controller.stop();\n }\n }\n\n seek(milliseconds) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'seek', param: milliseconds});\n } else {\n this._controller.seek(milliseconds);\n }\n }\n\n pause() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'pause'});\n } else {\n this._controller.pause();\n }\n }\n\n resume() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'resume'});\n } else {\n this._controller.resume();\n }\n }\n\n _onInitSegment(type, initSegment) {\n // do async invoke\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n });\n }\n\n _onMediaSegment(type, mediaSegment) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n });\n }\n\n _onLoadingComplete() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n });\n }\n\n _onRecoveredEarlyEof() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n });\n }\n\n _onMediaInfo(mediaInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, mediaInfo);\n });\n }\n\n _onMetaDataArrived(metadata) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);\n });\n }\n\n _onScriptDataArrived(data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);\n });\n }\n\n _onTimedID3MetadataArrived (data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED, data);\n })\n }\n\n _onSMPTE2038MetadataArrived (data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.SMPTE2038_METADATA_ARRIVED, data);\n })\n }\n\n _onSCTE35MetadataArrived (data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.SCTE35_METADATA_ARRIVED, data);\n })\n }\n\n _onPESPrivateDataDescriptor(data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR, data);\n });\n }\n\n _onPESPrivateDataArrived(data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED, data);\n });\n }\n\n _onStatisticsInfo(statisticsInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, statisticsInfo);\n });\n }\n\n _onIOError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n });\n }\n\n _onDemuxError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n });\n }\n\n _onRecommendSeekpoint(milliseconds) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, milliseconds);\n });\n }\n\n _onLoggingConfigChanged(config) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'logging_config', param: config});\n }\n }\n\n _onWorkerMessage(e) {\n let message = e.data;\n let data = message.data;\n\n if (message.msg === 'destroyed' || this._workerDestroying) {\n this._workerDestroying = false;\n this._worker.terminate();\n this._worker = null;\n return;\n }\n\n switch (message.msg) {\n case TransmuxingEvents.INIT_SEGMENT:\n case TransmuxingEvents.MEDIA_SEGMENT:\n this._emitter.emit(message.msg, data.type, data.data);\n break;\n case TransmuxingEvents.LOADING_COMPLETE:\n case TransmuxingEvents.RECOVERED_EARLY_EOF:\n this._emitter.emit(message.msg);\n break;\n case TransmuxingEvents.MEDIA_INFO:\n Object.setPrototypeOf(data, MediaInfo.prototype);\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.METADATA_ARRIVED:\n case TransmuxingEvents.SCRIPTDATA_ARRIVED:\n case TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED:\n case TransmuxingEvents.SMPTE2038_METADATA_ARRIVED:\n case TransmuxingEvents.SCTE35_METADATA_ARRIVED:\n case TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR:\n case TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED:\n case TransmuxingEvents.STATISTICS_INFO:\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.IO_ERROR:\n case TransmuxingEvents.DEMUX_ERROR:\n this._emitter.emit(message.msg, data.type, data.info);\n break;\n case TransmuxingEvents.RECOMMEND_SEEKPOINT:\n this._emitter.emit(message.msg, data);\n break;\n case 'logcat_callback':\n Log.emitter.emit('log', data.type, data.logcat);\n break;\n default:\n break;\n }\n }\n\n}\n\nexport default Transmuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst MSEEvents = {\n ERROR: 'error',\n SOURCE_OPEN: 'source_open',\n UPDATE_END: 'update_end',\n BUFFER_FULL: 'buffer_full'\n};\n\nexport default MSEEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MSEEvents from './mse-events.js';\nimport {SampleInfo, IDRSampleList} from './media-segment-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\n// Media Source Extensions controller\nclass MSEController {\n\n constructor(config) {\n this.TAG = 'MSEController';\n\n this._config = config;\n this._emitter = new EventEmitter();\n\n if (this._config.isLive && this._config.autoCleanupSourceBuffer == undefined) {\n // For live stream, do auto cleanup by default\n this._config.autoCleanupSourceBuffer = true;\n }\n\n this.e = {\n onSourceOpen: this._onSourceOpen.bind(this),\n onSourceEnded: this._onSourceEnded.bind(this),\n onSourceClose: this._onSourceClose.bind(this),\n onSourceBufferError: this._onSourceBufferError.bind(this),\n onSourceBufferUpdateEnd: this._onSourceBufferUpdateEnd.bind(this)\n };\n\n this._mediaSource = null;\n this._mediaSourceObjectURL = null;\n this._mediaElement = null;\n\n this._isBufferFull = false;\n this._hasPendingEos = false;\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n\n this._pendingSourceBufferInit = [];\n this._mimeTypes = {\n video: null,\n audio: null\n };\n this._sourceBuffers = {\n video: null,\n audio: null\n };\n this._lastInitSegments = {\n video: null,\n audio: null\n };\n this._pendingSegments = {\n video: [],\n audio: []\n };\n this._pendingRemoveRanges = {\n video: [],\n audio: []\n };\n this._idrList = new IDRSampleList();\n }\n\n destroy() {\n if (this._mediaElement || this._mediaSource) {\n this.detachMediaElement();\n }\n this.e = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n if (this._mediaSource) {\n throw new IllegalStateException('MediaSource has been attached to an HTMLMediaElement!');\n }\n let ms = this._mediaSource = new window.MediaSource();\n ms.addEventListener('sourceopen', this.e.onSourceOpen);\n ms.addEventListener('sourceended', this.e.onSourceEnded);\n ms.addEventListener('sourceclose', this.e.onSourceClose);\n\n this._mediaElement = mediaElement;\n this._mediaSourceObjectURL = window.URL.createObjectURL(this._mediaSource);\n mediaElement.src = this._mediaSourceObjectURL;\n }\n\n detachMediaElement() {\n if (this._mediaSource) {\n let ms = this._mediaSource;\n for (let type in this._sourceBuffers) {\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n this._pendingSegments[type] = null;\n this._pendingRemoveRanges[type] = null;\n this._lastInitSegments[type] = null;\n\n // remove all sourcebuffers\n let sb = this._sourceBuffers[type];\n if (sb) {\n if (ms.readyState !== 'closed') {\n // ms edge can throw an error: Unexpected call to method or property access\n try {\n ms.removeSourceBuffer(sb);\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n sb.removeEventListener('error', this.e.onSourceBufferError);\n sb.removeEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n }\n this._mimeTypes[type] = null;\n this._sourceBuffers[type] = null;\n }\n }\n if (ms.readyState === 'open') {\n try {\n ms.endOfStream();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n ms.removeEventListener('sourceopen', this.e.onSourceOpen);\n ms.removeEventListener('sourceended', this.e.onSourceEnded);\n ms.removeEventListener('sourceclose', this.e.onSourceClose);\n this._pendingSourceBufferInit = [];\n this._isBufferFull = false;\n this._idrList.clear();\n this._mediaSource = null;\n }\n\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement = null;\n }\n if (this._mediaSourceObjectURL) {\n window.URL.revokeObjectURL(this._mediaSourceObjectURL);\n this._mediaSourceObjectURL = null;\n }\n }\n\n appendInitSegment(initSegment, deferred) {\n if (!this._mediaSource || this._mediaSource.readyState !== 'open') {\n // sourcebuffer creation requires mediaSource.readyState === 'open'\n // so we defer the sourcebuffer creation, until sourceopen event triggered\n this._pendingSourceBufferInit.push(initSegment);\n // make sure that this InitSegment is in the front of pending segments queue\n this._pendingSegments[initSegment.type].push(initSegment);\n return;\n }\n\n let is = initSegment;\n let mimeType = `${is.container}`;\n if (is.codec && is.codec.length > 0) {\n mimeType += `;codecs=${is.codec}`;\n }\n\n let firstInitSegment = false;\n\n Log.v(this.TAG, 'Received Initialization Segment, mimeType: ' + mimeType);\n this._lastInitSegments[is.type] = is;\n\n if (mimeType !== this._mimeTypes[is.type]) {\n if (!this._mimeTypes[is.type]) { // empty, first chance create sourcebuffer\n firstInitSegment = true;\n try {\n let sb = this._sourceBuffers[is.type] = this._mediaSource.addSourceBuffer(mimeType);\n sb.addEventListener('error', this.e.onSourceBufferError);\n sb.addEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n } catch (error) {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n return;\n }\n } else {\n Log.v(this.TAG, `Notice: ${is.type} mimeType changed, origin: ${this._mimeTypes[is.type]}, target: ${mimeType}`);\n }\n this._mimeTypes[is.type] = mimeType;\n }\n\n if (!deferred) {\n // deferred means this InitSegment has been pushed to pendingSegments queue\n this._pendingSegments[is.type].push(is);\n }\n if (!firstInitSegment) { // append immediately only if init segment in subsequence\n if (this._sourceBuffers[is.type] && !this._sourceBuffers[is.type].updating) {\n this._doAppendSegments();\n }\n }\n if (Browser.safari && is.container === 'audio/mpeg' && is.mediaDuration > 0) {\n // 'audio/mpeg' track under Safari may cause MediaElement's duration to be NaN\n // Manually correct MediaSource.duration to make progress bar seekable, and report right duration\n this._requireSetMediaDuration = true;\n this._pendingMediaDuration = is.mediaDuration / 1000; // in seconds\n this._updateMediaSourceDuration();\n }\n }\n\n appendMediaSegment(mediaSegment) {\n let ms = mediaSegment;\n this._pendingSegments[ms.type].push(ms);\n\n if (this._config.autoCleanupSourceBuffer && this._needCleanupSourceBuffer()) {\n this._doCleanupSourceBuffer();\n }\n\n let sb = this._sourceBuffers[ms.type];\n if (sb && !sb.updating && !this._hasPendingRemoveRanges()) {\n this._doAppendSegments();\n }\n }\n\n seek(seconds) {\n // remove all appended buffers\n for (let type in this._sourceBuffers) {\n if (!this._sourceBuffers[type]) {\n continue;\n }\n\n // abort current buffer append algorithm\n let sb = this._sourceBuffers[type];\n if (this._mediaSource.readyState === 'open') {\n try {\n // If range removal algorithm is running, InvalidStateError will be throwed\n // Ignore it.\n sb.abort();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n\n // IDRList should be clear\n this._idrList.clear();\n\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n\n if (this._mediaSource.readyState === 'closed') {\n // Parent MediaSource object has been detached from HTMLMediaElement\n continue;\n }\n\n // record ranges to be remove from SourceBuffer\n for (let i = 0; i < sb.buffered.length; i++) {\n let start = sb.buffered.start(i);\n let end = sb.buffered.end(i);\n this._pendingRemoveRanges[type].push({start, end});\n }\n\n // if sb is not updating, let's remove ranges now!\n if (!sb.updating) {\n this._doRemoveRanges();\n }\n\n // Safari 10 may get InvalidStateError in the later appendBuffer() after SourceBuffer.remove() call\n // Internal parser's state may be invalid at this time. Re-append last InitSegment to workaround.\n // Related issue: https://bugs.webkit.org/show_bug.cgi?id=159230\n if (Browser.safari) {\n let lastInitSegment = this._lastInitSegments[type];\n if (lastInitSegment) {\n this._pendingSegments[type].push(lastInitSegment);\n if (!sb.updating) {\n this._doAppendSegments();\n }\n }\n }\n }\n }\n\n endOfStream() {\n let ms = this._mediaSource;\n let sb = this._sourceBuffers;\n if (!ms || ms.readyState !== 'open') {\n if (ms && ms.readyState === 'closed' && this._hasPendingSegments()) {\n // If MediaSource hasn't turned into open state, and there're pending segments\n // Mark pending endOfStream, defer call until all pending segments appended complete\n this._hasPendingEos = true;\n }\n return;\n }\n if (sb.video && sb.video.updating || sb.audio && sb.audio.updating) {\n // If any sourcebuffer is updating, defer endOfStream operation\n // See _onSourceBufferUpdateEnd()\n this._hasPendingEos = true;\n } else {\n this._hasPendingEos = false;\n // Notify media data loading complete\n // This is helpful for correcting total duration to match last media segment\n // Otherwise MediaElement's ended event may not be triggered\n ms.endOfStream();\n }\n }\n\n getNearestKeyframe(dts) {\n return this._idrList.getLastSyncPointBeforeDts(dts);\n }\n\n _needCleanupSourceBuffer() {\n if (!this._config.autoCleanupSourceBuffer) {\n return false;\n }\n\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n if (buffered.length >= 1) {\n if (currentTime - buffered.start(0) >= this._config.autoCleanupMaxBackwardDuration) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n _doCleanupSourceBuffer() {\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n let doRemove = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n\n if (start <= currentTime && currentTime < end + 3) { // padding 3 seconds\n if (currentTime - start >= this._config.autoCleanupMaxBackwardDuration) {\n doRemove = true;\n let removeEnd = currentTime - this._config.autoCleanupMinBackwardDuration;\n this._pendingRemoveRanges[type].push({start: start, end: removeEnd});\n }\n } else if (end < currentTime) {\n doRemove = true;\n this._pendingRemoveRanges[type].push({start: start, end: end});\n }\n }\n\n if (doRemove && !sb.updating) {\n this._doRemoveRanges();\n }\n }\n }\n }\n\n _updateMediaSourceDuration() {\n let sb = this._sourceBuffers;\n if (this._mediaElement.readyState === 0 || this._mediaSource.readyState !== 'open') {\n return;\n }\n if ((sb.video && sb.video.updating) || (sb.audio && sb.audio.updating)) {\n return;\n }\n\n let current = this._mediaSource.duration;\n let target = this._pendingMediaDuration;\n\n if (target > 0 && (isNaN(current) || target > current)) {\n Log.v(this.TAG, `Update MediaSource duration from ${current} to ${target}`);\n this._mediaSource.duration = target;\n }\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n }\n\n _doRemoveRanges() {\n for (let type in this._pendingRemoveRanges) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n let sb = this._sourceBuffers[type];\n let ranges = this._pendingRemoveRanges[type];\n while (ranges.length && !sb.updating) {\n let range = ranges.shift();\n sb.remove(range.start, range.end);\n }\n }\n }\n\n _doAppendSegments() {\n let pendingSegments = this._pendingSegments;\n\n for (let type in pendingSegments) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n\n if (pendingSegments[type].length > 0) {\n let segment = pendingSegments[type].shift();\n\n if (segment.timestampOffset) {\n // For MPEG audio stream in MSE, if unbuffered-seeking occurred\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n let currentOffset = this._sourceBuffers[type].timestampOffset;\n let targetOffset = segment.timestampOffset / 1000; // in seconds\n\n let delta = Math.abs(currentOffset - targetOffset);\n if (delta > 0.1) { // If time delta > 100ms\n Log.v(this.TAG, `Update MPEG audio timestampOffset from ${currentOffset} to ${targetOffset}`);\n this._sourceBuffers[type].timestampOffset = targetOffset;\n }\n delete segment.timestampOffset;\n }\n\n if (!segment.data || segment.data.byteLength === 0) {\n // Ignore empty buffer\n continue;\n }\n\n try {\n this._sourceBuffers[type].appendBuffer(segment.data);\n this._isBufferFull = false;\n if (type === 'video' && segment.hasOwnProperty('info')) {\n this._idrList.appendArray(segment.info.syncPoints);\n }\n } catch (error) {\n this._pendingSegments[type].unshift(segment);\n if (error.code === 22) { // QuotaExceededError\n /* Notice that FireFox may not throw QuotaExceededError if SourceBuffer is full\n * Currently we can only do lazy-load to avoid SourceBuffer become scattered.\n * SourceBuffer eviction policy may be changed in future version of FireFox.\n *\n * Related issues:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1279885\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1280023\n */\n\n // report buffer full, abort network IO\n if (!this._isBufferFull) {\n this._emitter.emit(MSEEvents.BUFFER_FULL);\n }\n this._isBufferFull = true;\n } else {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n }\n }\n }\n }\n }\n\n _onSourceOpen() {\n Log.v(this.TAG, 'MediaSource onSourceOpen');\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n // deferred sourcebuffer creation / initialization\n if (this._pendingSourceBufferInit.length > 0) {\n let pendings = this._pendingSourceBufferInit;\n while (pendings.length) {\n let segment = pendings.shift();\n this.appendInitSegment(segment, true);\n }\n }\n // there may be some pending media segments, append them\n if (this._hasPendingSegments()) {\n this._doAppendSegments();\n }\n this._emitter.emit(MSEEvents.SOURCE_OPEN);\n }\n\n _onSourceEnded() {\n // fired on endOfStream\n Log.v(this.TAG, 'MediaSource onSourceEnded');\n }\n\n _onSourceClose() {\n // fired on detaching from media element\n Log.v(this.TAG, 'MediaSource onSourceClose');\n if (this._mediaSource && this.e != null) {\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n this._mediaSource.removeEventListener('sourceended', this.e.onSourceEnded);\n this._mediaSource.removeEventListener('sourceclose', this.e.onSourceClose);\n }\n }\n\n _hasPendingSegments() {\n let ps = this._pendingSegments;\n return ps.video.length > 0 || ps.audio.length > 0;\n }\n\n _hasPendingRemoveRanges() {\n let prr = this._pendingRemoveRanges;\n return prr.video.length > 0 || prr.audio.length > 0;\n }\n\n _onSourceBufferUpdateEnd() {\n if (this._requireSetMediaDuration) {\n this._updateMediaSourceDuration();\n } else if (this._hasPendingRemoveRanges()) {\n this._doRemoveRanges();\n } else if (this._hasPendingSegments()) {\n this._doAppendSegments();\n } else if (this._hasPendingEos) {\n this.endOfStream();\n }\n this._emitter.emit(MSEEvents.UPDATE_END);\n }\n\n _onSourceBufferError(e) {\n Log.e(this.TAG, `SourceBuffer Error: ${e}`);\n // this error might not always be fatal, just ignore it\n }\n\n}\n\nexport default MSEController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {LoaderErrors} from '../io/loader.js';\nimport DemuxErrors from '../demux/demux-errors.js';\n\nexport const ErrorTypes = {\n NETWORK_ERROR: 'NetworkError',\n MEDIA_ERROR: 'MediaError',\n OTHER_ERROR: 'OtherError'\n};\n\nexport const ErrorDetails = {\n NETWORK_EXCEPTION: LoaderErrors.EXCEPTION,\n NETWORK_STATUS_CODE_INVALID: LoaderErrors.HTTP_STATUS_CODE_INVALID,\n NETWORK_TIMEOUT: LoaderErrors.CONNECTING_TIMEOUT,\n NETWORK_UNRECOVERABLE_EARLY_EOF: LoaderErrors.UNRECOVERABLE_EARLY_EOF,\n\n MEDIA_MSE_ERROR: 'MediaMSEError',\n\n MEDIA_FORMAT_ERROR: DemuxErrors.FORMAT_ERROR,\n MEDIA_FORMAT_UNSUPPORTED: DemuxErrors.FORMAT_UNSUPPORTED,\n MEDIA_CODEC_UNSUPPORTED: DemuxErrors.CODEC_UNSUPPORTED\n};","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport PlayerEvents from './player-events.js';\nimport Transmuxer from '../core/transmuxer.js';\nimport TransmuxingEvents from '../core/transmuxing-events.js';\nimport MSEController from '../core/mse-controller.js';\nimport MSEEvents from '../core/mse-events.js';\nimport {ErrorTypes, ErrorDetails} from './player-errors.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\nclass MSEPlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'MSEPlayer';\n this._type = 'MSEPlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n let typeLowerCase = mediaDataSource.type.toLowerCase();\n if (typeLowerCase !== 'mse'\n && typeLowerCase !== 'mpegts'\n && typeLowerCase !== 'm2ts'\n && typeLowerCase !== 'flv') {\n throw new InvalidArgumentException('MSEPlayer requires an mpegts/m2ts/flv MediaDataSource input!');\n }\n\n if (mediaDataSource.isLive === true) {\n this._config.isLive = true;\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this),\n onvSeeking: this._onvSeeking.bind(this),\n onvCanPlay: this._onvCanPlay.bind(this),\n onvStalled: this._onvStalled.bind(this),\n onvProgress: this._onvProgress.bind(this)\n };\n\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n\n this._pendingSeekTime = null; // in seconds\n this._requestSetTime = false;\n this._seekpointRecord = null;\n this._progressChecker = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n this._msectl = null;\n this._transmuxer = null;\n\n this._mseSourceOpened = false;\n this._hasPendingLoad = false;\n this._receivedCanPlay = false;\n\n this._mediaInfo = null;\n this._statisticsInfo = null;\n\n let chromeNeedIDRFix = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661)));\n this._alwaysSeekKeyframe = (chromeNeedIDRFix || Browser.msedge || Browser.msie) ? true : false;\n\n if (this._alwaysSeekKeyframe) {\n this._config.accurateSeek = false;\n }\n }\n\n destroy() {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n if (this._transmuxer) {\n this.unload();\n }\n if (this._mediaElement) {\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._statisticsInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n mediaElement.addEventListener('seeking', this.e.onvSeeking);\n mediaElement.addEventListener('canplay', this.e.onvCanPlay);\n mediaElement.addEventListener('stalled', this.e.onvStalled);\n mediaElement.addEventListener('progress', this.e.onvProgress);\n\n this._msectl = new MSEController(this._config);\n\n this._msectl.on(MSEEvents.UPDATE_END, this._onmseUpdateEnd.bind(this));\n this._msectl.on(MSEEvents.BUFFER_FULL, this._onmseBufferFull.bind(this));\n this._msectl.on(MSEEvents.SOURCE_OPEN, () => {\n this._mseSourceOpened = true;\n if (this._hasPendingLoad) {\n this._hasPendingLoad = false;\n this.load();\n }\n });\n this._msectl.on(MSEEvents.ERROR, (info) => {\n this._emitter.emit(PlayerEvents.ERROR,\n ErrorTypes.MEDIA_ERROR,\n ErrorDetails.MEDIA_MSE_ERROR,\n info\n );\n });\n\n this._msectl.attachMediaElement(mediaElement);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // We can defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._msectl.detachMediaElement();\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement.removeEventListener('seeking', this.e.onvSeeking);\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n this._mediaElement.removeEventListener('stalled', this.e.onvStalled);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n this._mediaElement = null;\n }\n if (this._msectl) {\n this._msectl.destroy();\n this._msectl = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n if (this._transmuxer) {\n throw new IllegalStateException('MSEPlayer.load() has been called, please call unload() first!');\n }\n if (this._hasPendingLoad) {\n return;\n }\n\n if (this._config.deferLoadAfterSourceOpen && this._mseSourceOpened === false) {\n this._hasPendingLoad = true;\n return;\n }\n\n if (this._mediaElement.readyState > 0) {\n this._requestSetTime = true;\n // IE11 may throw InvalidStateError if readyState === 0\n this._mediaElement.currentTime = 0;\n }\n\n this._transmuxer = new Transmuxer(this._mediaDataSource, this._config);\n\n this._transmuxer.on(TransmuxingEvents.INIT_SEGMENT, (type, is) => {\n this._msectl.appendInitSegment(is);\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_SEGMENT, (type, ms) => {\n this._msectl.appendMediaSegment(ms);\n\n // lazyLoad check\n if (this._config.lazyLoad && !this._config.isLive) {\n let currentTime = this._mediaElement.currentTime;\n if (ms.info.endDts >= (currentTime + this._config.lazyLoadMaxDuration) * 1000) {\n if (this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n }\n });\n this._transmuxer.on(TransmuxingEvents.LOADING_COMPLETE, () => {\n this._msectl.endOfStream();\n this._emitter.emit(PlayerEvents.LOADING_COMPLETE);\n });\n this._transmuxer.on(TransmuxingEvents.RECOVERED_EARLY_EOF, () => {\n this._emitter.emit(PlayerEvents.RECOVERED_EARLY_EOF);\n });\n this._transmuxer.on(TransmuxingEvents.IO_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.NETWORK_ERROR, detail, info);\n });\n this._transmuxer.on(TransmuxingEvents.DEMUX_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.MEDIA_ERROR, detail, {code: -1, msg: info});\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_INFO, (mediaInfo) => {\n this._mediaInfo = mediaInfo;\n this._emitter.emit(PlayerEvents.MEDIA_INFO, Object.assign({}, mediaInfo));\n });\n this._transmuxer.on(TransmuxingEvents.METADATA_ARRIVED, (metadata) => {\n this._emitter.emit(PlayerEvents.METADATA_ARRIVED, metadata);\n });\n this._transmuxer.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, (data) => {\n this._emitter.emit(PlayerEvents.SCRIPTDATA_ARRIVED, data);\n });\n this._transmuxer.on(TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED, (timed_id3_metadata) => {\n this._emitter.emit(PlayerEvents.TIMED_ID3_METADATA_ARRIVED, timed_id3_metadata);\n });\n this._transmuxer.on(TransmuxingEvents.SMPTE2038_METADATA_ARRIVED, (smpte2038_metadata) => {\n this._emitter.emit(PlayerEvents.SMPTE2038_METADATA_ARRIVED, smpte2038_metadata);\n });\n this._transmuxer.on(TransmuxingEvents.SCTE35_METADATA_ARRIVED, (scte35_metadata) => {\n this._emitter.emit(PlayerEvents.SCTE35_METADATA_ARRIVED, scte35_metadata);\n });\n this._transmuxer.on(TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR, (descriptor) => {\n this._emitter.emit(PlayerEvents.PES_PRIVATE_DATA_DESCRIPTOR, descriptor);\n });\n this._transmuxer.on(TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED, (private_data) => {\n this._emitter.emit(PlayerEvents.PES_PRIVATE_DATA_ARRIVED, private_data);\n });\n this._transmuxer.on(TransmuxingEvents.STATISTICS_INFO, (statInfo) => {\n this._statisticsInfo = this._fillStatisticsInfo(statInfo);\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, Object.assign({}, this._statisticsInfo));\n });\n this._transmuxer.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, (milliseconds) => {\n if (this._mediaElement && !this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = milliseconds / 1000;\n }\n });\n\n this._transmuxer.open();\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.pause();\n }\n if (this._msectl) {\n this._msectl.seek(0);\n }\n if (this._transmuxer) {\n this._transmuxer.close();\n this._transmuxer.destroy();\n this._transmuxer = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._internalSeek(seconds);\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n return Object.assign({}, this._mediaInfo);\n }\n\n get statisticsInfo() {\n if (this._statisticsInfo == null) {\n this._statisticsInfo = {};\n }\n this._statisticsInfo = this._fillStatisticsInfo(this._statisticsInfo);\n return Object.assign({}, this._statisticsInfo);\n }\n\n _fillStatisticsInfo(statInfo) {\n statInfo.playerType = this._type;\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return statInfo;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n statInfo.decodedFrames = decoded;\n statInfo.droppedFrames = dropped;\n }\n\n return statInfo;\n }\n\n _onmseUpdateEnd() {\n let buffered = this._mediaElement.buffered;\n let currentTime = this._mediaElement.currentTime;\n\n if (this._config.isLive\n && this._config.liveBufferLatencyChasing\n && buffered.length > 0\n && !this._mediaElement.paused) {\n let buffered_end = buffered.end(buffered.length - 1);\n if (buffered_end > this._config.liveBufferLatencyMaxLatency) {\n // Ensure there's enough buffered data\n if (buffered_end - currentTime > this._config.liveBufferLatencyMaxLatency) {\n // if remained data duration has larger than config.liveBufferLatencyMaxLatency\n let target_time = buffered_end - this._config.liveBufferLatencyMinRemain;\n this.currentTime = target_time;\n }\n }\n }\n\n if (!this._config.lazyLoad || this._config.isLive) {\n return;\n }\n\n let currentRangeStart = 0;\n let currentRangeEnd = 0;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n if (start <= currentTime && currentTime < end) {\n currentRangeStart = start;\n currentRangeEnd = end;\n break;\n }\n }\n\n if (currentRangeEnd >= currentTime + this._config.lazyLoadMaxDuration && this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n\n _onmseBufferFull() {\n Log.v(this.TAG, 'MSE SourceBuffer is full, suspend transmuxing task');\n if (this._progressChecker == null) {\n this._suspendTransmuxer();\n }\n }\n\n _suspendTransmuxer() {\n if (this._transmuxer) {\n this._transmuxer.pause();\n\n if (this._progressChecker == null) {\n this._progressChecker = window.setInterval(this._checkProgressAndResume.bind(this), 1000);\n }\n }\n }\n\n _checkProgressAndResume() {\n let currentTime = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n let needResume = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (currentTime >= from && currentTime < to) {\n if (currentTime >= to - this._config.lazyLoadRecoverDuration) {\n needResume = true;\n }\n break;\n }\n }\n\n if (needResume) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n if (needResume) {\n Log.v(this.TAG, 'Continue loading from paused position');\n this._transmuxer.resume();\n }\n }\n }\n\n _isTimepointBuffered(seconds) {\n let buffered = this._mediaElement.buffered;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (seconds >= from && seconds < to) {\n return true;\n }\n }\n return false;\n }\n\n _internalSeek(seconds) {\n let directSeek = this._isTimepointBuffered(seconds);\n\n let directSeekBegin = false;\n let directSeekBeginTime = 0;\n\n if (seconds < 1.0 && this._mediaElement.buffered.length > 0) {\n let videoBeginTime = this._mediaElement.buffered.start(0);\n if ((videoBeginTime < 1.0 && seconds < videoBeginTime) || Browser.safari) {\n directSeekBegin = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n directSeekBeginTime = Browser.safari ? 0.1 : videoBeginTime;\n }\n }\n\n if (directSeekBegin) { // seek to video begin, set currentTime directly if beginPTS buffered\n this._requestSetTime = true;\n this._mediaElement.currentTime = directSeekBeginTime;\n } else if (directSeek) { // buffered position\n if (!this._alwaysSeekKeyframe) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n } else {\n let idr = this._msectl.getNearestKeyframe(Math.floor(seconds * 1000));\n this._requestSetTime = true;\n if (idr != null) {\n this._mediaElement.currentTime = idr.dts / 1000;\n } else {\n this._mediaElement.currentTime = seconds;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n } else {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n this._msectl.seek(seconds);\n this._transmuxer.seek(Math.floor(seconds * 1000)); // in milliseconds\n // no need to set mediaElement.currentTime if non-accurateSeek,\n // just wait for the recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n }\n }\n }\n\n _checkAndApplyUnbufferedSeekpoint() {\n if (this._seekpointRecord) {\n if (this._seekpointRecord.recordTime <= this._now() - 100) {\n let target = this._mediaElement.currentTime;\n this._seekpointRecord = null;\n if (!this._isTimepointBuffered(target)) {\n if (this._progressChecker != null) {\n window.clearTimeout(this._progressChecker);\n this._progressChecker = null;\n }\n // .currentTime is consists with .buffered timestamp\n // Chrome/Edge use DTS, while FireFox/Safari use PTS\n this._msectl.seek(target);\n this._transmuxer.seek(Math.floor(target * 1000));\n // set currentTime if accurateSeek, or wait for recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = target;\n }\n }\n } else {\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n }\n }\n\n _checkAndResumeStuckPlayback(stalled) {\n let media = this._mediaElement;\n if (stalled || !this._receivedCanPlay || media.readyState < 2) { // HAVE_CURRENT_DATA\n let buffered = media.buffered;\n if (buffered.length > 0 && media.currentTime < buffered.start(0)) {\n Log.w(this.TAG, `Playback seems stuck at ${media.currentTime}, seek to ${buffered.start(0)}`);\n this._requestSetTime = true;\n this._mediaElement.currentTime = buffered.start(0);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n } else {\n // Playback didn't stuck, remove progress event listener\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n }\n\n _onvSeeking(e) { // handle seeking request from browser's progress bar\n let target = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n if (this._requestSetTime) {\n this._requestSetTime = false;\n return;\n }\n\n if (target < 1.0 && buffered.length > 0) {\n // seek to video begin, set currentTime directly if beginPTS buffered\n let videoBeginTime = buffered.start(0);\n if ((videoBeginTime < 1.0 && target < videoBeginTime) || Browser.safari) {\n this._requestSetTime = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n this._mediaElement.currentTime = Browser.safari ? 0.1 : videoBeginTime;\n return;\n }\n }\n\n if (this._isTimepointBuffered(target)) {\n if (this._alwaysSeekKeyframe) {\n let idr = this._msectl.getNearestKeyframe(Math.floor(target * 1000));\n if (idr != null) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = idr.dts / 1000;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n return;\n }\n\n this._seekpointRecord = {\n seekPoint: target,\n recordTime: this._now()\n };\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n\n _onvCanPlay(e) {\n this._receivedCanPlay = true;\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n }\n\n _onvStalled(e) {\n this._checkAndResumeStuckPlayback(true);\n }\n\n _onvProgress(e) {\n this._checkAndResumeStuckPlayback();\n }\n\n}\n\nexport default MSEPlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport PlayerEvents from './player-events.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\n// Player wrapper for browser's native player (HTMLVideoElement) without MediaSource src. \nclass NativePlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'NativePlayer';\n this._type = 'NativePlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n let typeLowerCase = mediaDataSource.type.toLowerCase();\n\n if (typeLowerCase === 'mse'\n || typeLowerCase === 'mpegts'\n || typeLowerCase === 'm2ts'\n || typeLowerCase === 'flv') {\n throw new InvalidArgumentException('NativePlayer does\\'t support mse/mpegts/m2ts/flv MediaDataSource input!');\n }\n if (mediaDataSource.hasOwnProperty('segments')) {\n throw new InvalidArgumentException(`NativePlayer(${mediaDataSource.type}) doesn't support multipart playback!`);\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this)\n };\n\n this._pendingSeekTime = null;\n this._statisticsReporter = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n }\n\n destroy() {\n if (this._mediaElement) {\n this.unload();\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) { // HAVE_NOTHING\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // Defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement = null;\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n this._mediaElement.src = this._mediaDataSource.url;\n\n if (this._mediaElement.readyState > 0) {\n this._mediaElement.currentTime = 0;\n }\n\n this._mediaElement.preload = 'auto';\n this._mediaElement.load();\n this._statisticsReporter = window.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._mediaElement.currentTime = seconds;\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n let mediaPrefix = (this._mediaElement instanceof HTMLAudioElement) ? 'audio/' : 'video/';\n let info = {\n mimeType: mediaPrefix + this._mediaDataSource.type\n };\n if (this._mediaElement) {\n info.duration = Math.floor(this._mediaElement.duration * 1000);\n if (this._mediaElement instanceof HTMLVideoElement) {\n info.width = this._mediaElement.videoWidth;\n info.height = this._mediaElement.videoHeight;\n }\n }\n return info;\n }\n\n get statisticsInfo() {\n let info = {\n playerType: this._type,\n url: this._mediaDataSource.url\n };\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return info;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n info.decodedFrames = decoded;\n info.droppedFrames = dropped;\n }\n \n return info;\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n }\n\n _reportStatisticsInfo() {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n }\n\n}\n\nexport default NativePlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Polyfill from './utils/polyfill.js';\nimport Features from './core/features.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './io/loader.js';\nimport MSEPlayer from './player/mse-player.js';\nimport NativePlayer from './player/native-player.js';\nimport PlayerEvents from './player/player-events.js';\nimport {ErrorTypes, ErrorDetails} from './player/player-errors.js';\nimport LoggingControl from './utils/logging-control.js';\nimport {InvalidArgumentException} from './utils/exception.js';\n\n// here are all the interfaces\n\n// install polyfills\nPolyfill.install();\n\n\n// factory method\nfunction createPlayer(mediaDataSource, optionalConfig) {\n let mds = mediaDataSource;\n if (mds == null || typeof mds !== 'object') {\n throw new InvalidArgumentException('MediaDataSource must be an javascript object!');\n }\n\n if (!mds.hasOwnProperty('type')) {\n throw new InvalidArgumentException('MediaDataSource must has type field to indicate video file type!');\n }\n\n switch (mds.type) {\n case 'mse':\n case 'mpegts':\n case 'm2ts':\n case 'flv':\n return new MSEPlayer(mds, optionalConfig);\n default:\n return new NativePlayer(mds, optionalConfig);\n }\n}\n\n\n// feature detection\nfunction isSupported() {\n return Features.supportMSEH264Playback();\n}\n\nfunction getFeatureList() {\n return Features.getFeatureList();\n}\n\n\n// interfaces\nlet mpegts = {};\n\nmpegts.createPlayer = createPlayer;\nmpegts.isSupported = isSupported;\nmpegts.getFeatureList = getFeatureList;\n\nmpegts.BaseLoader = BaseLoader;\nmpegts.LoaderStatus = LoaderStatus;\nmpegts.LoaderErrors = LoaderErrors;\n\nmpegts.Events = PlayerEvents;\nmpegts.ErrorTypes = ErrorTypes;\nmpegts.ErrorDetails = ErrorDetails;\n\nmpegts.MSEPlayer = MSEPlayer;\nmpegts.NativePlayer = NativePlayer;\nmpegts.LoggingControl = LoggingControl;\n\nObject.defineProperty(mpegts, 'version', {\n enumerable: true,\n get: function () {\n // replaced by webpack.DefinePlugin\n return __VERSION__;\n }\n});\n\nexport default mpegts;\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://mpegts/webpack/universalModuleDefinition","webpack://mpegts/webpack/bootstrap","webpack://mpegts/./src/utils/logger.js","webpack://mpegts/./src/core/transmuxing-events.js","webpack://mpegts/./src/io/loader.js","webpack://mpegts/./src/utils/exception.js","webpack://mpegts/./src/utils/browser.js","webpack://mpegts/./src/demux/demux-errors.js","webpack://mpegts/./node_modules/events/events.js","webpack://mpegts/./src/core/media-segment-info.js","webpack://mpegts/./src/core/media-info.js","webpack://mpegts/./src/utils/logging-control.js","webpack://mpegts/./src/utils/utf8-conv.js","webpack://mpegts/./src/demux/amf-parser.js","webpack://mpegts/./src/demux/exp-golomb.js","webpack://mpegts/./src/demux/sps-parser.js","webpack://mpegts/./src/demux/h265-parser.js","webpack://mpegts/./src/utils/typedarray-equality.ts","webpack://mpegts/./src/demux/flv-demuxer.js","webpack://mpegts/./src/demux/pat-pmt-pes.ts","webpack://mpegts/./src/demux/base-demuxer.ts","webpack://mpegts/./src/demux/h264.ts","webpack://mpegts/./src/demux/mpeg4-audio.ts","webpack://mpegts/./src/demux/scte35.ts","webpack://mpegts/./src/demux/aac.ts","webpack://mpegts/./src/demux/pes-private-data.ts","webpack://mpegts/./src/demux/h265.ts","webpack://mpegts/./src/demux/smpte2038.ts","webpack://mpegts/./src/demux/mp3.ts","webpack://mpegts/./src/demux/ac3.ts","webpack://mpegts/./src/demux/ts-demuxer.ts","webpack://mpegts/./src/remux/mp4-generator.js","webpack://mpegts/./src/remux/aac-silent.js","webpack://mpegts/./src/remux/mp4-remuxer.js","webpack://mpegts/./src/core/transmuxing-controller.js","webpack://mpegts/./src/io/speed-sampler.js","webpack://mpegts/./src/io/fetch-stream-loader.js","webpack://mpegts/./src/io/xhr-moz-chunked-loader.js","webpack://mpegts/./src/io/xhr-range-loader.js","webpack://mpegts/./src/io/websocket-loader.js","webpack://mpegts/./src/io/range-seek-handler.js","webpack://mpegts/./src/io/param-seek-handler.js","webpack://mpegts/./src/io/io-controller.js","webpack://mpegts/./src/utils/polyfill.js","webpack://mpegts/./node_modules/webworkify-webpack/index.js","webpack://mpegts/./src/index.js","webpack://mpegts/./node_modules/es6-promise/dist/es6-promise.js","webpack://mpegts/./node_modules/process/browser.js","webpack://mpegts/(webpack)/buildin/global.js","webpack://mpegts/./src/core/transmuxing-worker.js","webpack://mpegts/./src/config.js","webpack://mpegts/./src/core/features.js","webpack://mpegts/./src/player/player-events.js","webpack://mpegts/./src/core/transmuxer.js","webpack://mpegts/./src/core/mse-events.js","webpack://mpegts/./src/core/mse-controller.js","webpack://mpegts/./src/player/player-errors.js","webpack://mpegts/./src/player/mse-player.js","webpack://mpegts/./src/player/native-player.js","webpack://mpegts/./src/mpegts.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","e","tag","msg","Log","FORCE_GLOBAL_TAG","GLOBAL_TAG","str","ENABLE_CALLBACK","emitter","emit","ENABLE_ERROR","console","error","warn","log","ENABLE_INFO","info","w","ENABLE_WARN","ENABLE_DEBUG","debug","v","ENABLE_VERBOSE","IO_ERROR","DEMUX_ERROR","INIT_SEGMENT","MEDIA_SEGMENT","LOADING_COMPLETE","RECOVERED_EARLY_EOF","MEDIA_INFO","METADATA_ARRIVED","SCRIPTDATA_ARRIVED","TIMED_ID3_METADATA_ARRIVED","SMPTE2038_METADATA_ARRIVED","SCTE35_METADATA_ARRIVED","PES_PRIVATE_DATA_DESCRIPTOR","PES_PRIVATE_DATA_ARRIVED","STATISTICS_INFO","RECOMMEND_SEEKPOINT","LoaderStatus","kIdle","kConnecting","kBuffering","kError","kComplete","LoaderErrors","OK","EXCEPTION","HTTP_STATUS_CODE_INVALID","CONNECTING_TIMEOUT","EARLY_EOF","UNRECOVERABLE_EARLY_EOF","typeName","this","_type","_status","_needStash","_onContentLengthKnown","_onURLRedirect","_onDataArrival","_onError","_onComplete","destroy","isWorking","callback","open","dataSource","range","abort","message","_message","toString","RuntimeException","Browser","ua","self","navigator","userAgent","toLowerCase","match","exec","indexOf","platform_match","matched","browser","version","majorVersion","platform","versionArray","split","major","parseInt","string","length","minor","build","chrome","opr","safari","webkit","rv","iemobile","edge","android","assign","detect","FORMAT_ERROR","FORMAT_UNSUPPORTED","CODEC_UNSUPPORTED","ReflectOwnKeys","R","Reflect","ReflectApply","apply","target","receiver","args","Function","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","concat","NumberIsNaN","Number","isNaN","EventEmitter","init","once","Promise","resolve","reject","errorListener","err","removeListener","resolver","slice","arguments","eventTargetAgnosticAddListener","handler","flags","on","addErrorHandlerIfEventEmitter","_events","undefined","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","TypeError","_getMaxListeners","that","_addListener","type","prepend","events","existing","warning","newListener","unshift","push","warned","Error","String","count","onceWrapper","fired","wrapFn","_onceWrap","state","wrapped","_listeners","unwrap","evlistener","arr","ret","Array","unwrapListeners","arrayClone","listenerCount","copy","addEventListener","wrapListener","arg","removeEventListener","set","RangeError","getPrototypeOf","setMaxListeners","getMaxListeners","doError","er","context","len","listeners","addListener","prependListener","prependOnceListener","list","position","originalListener","shift","index","pop","spliceOne","off","removeAllListeners","keys","rawListeners","eventNames","dts","pts","duration","originalDts","isSync","isSyncPoint","fileposition","beginDts","endDts","beginPts","endPts","originalBeginDts","originalEndDts","syncPoints","firstSample","lastSample","appendSyncPoint","sampleInfo","_list","clear","appendArray","getLastSyncPointBeforeDts","idx","last","mid","lbound","ubound","Math","floor","_lastAppendLocation","isEmpty","_searchNearestSegmentBefore","_searchNearestSegmentAfter","append","mediaSegmentInfo","msi","lastAppendIdx","insertIdx","splice","getLastSegmentBefore","getLastSampleBefore","segment","getLastSyncPointBefore","segmentIdx","mimeType","hasAudio","hasVideo","audioCodec","videoCodec","audioDataRate","videoDataRate","audioSampleRate","audioChannelCount","width","height","fps","profile","level","refFrames","chromaFormat","sarNum","sarDen","metadata","segments","segmentCount","hasKeyframesIndex","keyframesIndex","isComplete","audioInfoComplete","videoInfoComplete","isSeekable","getNearestKeyframe","milliseconds","table","keyframeIdx","_search","times","filepositions","enable","LoggingControl","_notifyChange","getConfig","globalTag","forceGlobalTag","enableVerbose","enableDebug","enableInfo","enableWarn","enableError","enableCallback","applyConfig","config","registerListener","addLogListener","removeLogListener","checkContinuation","uint8array","start","checkLength","array","buf","out","input","fromCharCode","ucs4","join","ArrayBuffer","DataView","setInt16","Int16Array","parseScriptData","arrayBuffer","dataOffset","dataSize","data","AMF","parseValue","size","parseObject","parseString","isObjectEnd","objectEnd","parseVariable","getUint16","Uint8Array","parseLongString","getUint32","parseDate","timestamp","getFloat64","localTimeOffset","getInt16","Date","offset","getUint8","amfstr","terminal","amfobj","amfvar","strictArrayLength","val","date","amfLongStr","TAG","_buffer","_buffer_index","_total_bytes","byteLength","_total_bits","_current_word","_current_word_bits_left","_fillCurrentWord","buffer_bytes_left","bytes_read","min","word","subarray","buffer","readBits","bits","result","bits_need_left","bits_read_next","result2","readBool","readByte","_skipLeadingZero","zero_count","readUEG","leading_zeros","readSEG","_ebsp2rbsp","src","src_length","dst","dst_idx","parseSPS","codec_array","codec_mimetype","j","h","rbsp","SPSParser","gb","profile_idc","level_idc","profile_string","getProfileString","level_string","getLevelString","chroma_format_idc","chroma_format","bit_depth_luma","bit_depth_chroma","scaling_list_count","_skipScalingList","pic_order_cnt_type","num_ref_frames_in_pic_order_cnt_cycle","ref_frames","pic_width_in_mbs_minus1","pic_height_in_map_units_minus1","frame_mbs_only_flag","frame_crop_left_offset","frame_crop_right_offset","frame_crop_top_offset","frame_crop_bottom_offset","sar_width","sar_height","fps_fixed","fps_num","fps_den","aspect_ratio_idc","num_units_in_tick","time_scale","sarScale","crop_unit_x","crop_unit_y","codec_width","codec_height","present_width","ceil","bit_depth","chroma_format_string","getChromaFormatString","frame_rate","fixed","sar_ratio","codec_size","present_size","last_scale","next_scale","toFixed","chroma","parseVPS","H265NaluParser","num_temporal_layers","temporal_id_nested","left_offset","right_offset","top_offset","bottom_offset","max_sub_layers_minus1","general_profile_space","general_tier_flag","general_profile_idc","general_profile_compatibility_flags_1","general_profile_compatibility_flags_2","general_profile_compatibility_flags_3","general_profile_compatibility_flags_4","general_constraint_indicator_flags_1","general_constraint_indicator_flags_2","general_constraint_indicator_flags_3","general_constraint_indicator_flags_4","general_constraint_indicator_flags_5","general_constraint_indicator_flags_6","general_level_idc","sub_layer_profile_present_flag","sub_layer_level_present_flag","pic_width_in_luma_samples","pic_height_in_luma_samples","bit_depth_luma_minus8","bit_depth_chroma_minus8","log2_max_pic_order_cnt_lsb_minus4","sizeId","matrixId","coefNum","num_short_term_ref_pic_sets","num_delta_pocs","inter_ref_pic_set_prediction_flag","next_num_delta_pocs","used_by_curr_pic_flag","use_delta_flag","num_negative_pics","num_positive_pics","num_long_term_ref_pics_sps","min_spatial_segmentation_idc","nal_hrd_parameters_present_flag","vcl_hrd_parameters_present_flag","sub_pic_hrd_params_present_flag","fixed_pic_rate_general_flag","fixed_pic_rate_within_cvs_flag","cpbCnt","low_delay_hrd_flag","sar_scale","constant_frame_rate","parsePPS","tiles_enabled_flag","entropy_coding_sync_enabled_flag","parallelismType","chroma_idc","isAligned16","a","byteOffset","isAligned32","compareArray","b","Uint32Array","equal32","Uint16Array","equal16","equal8","StreamType","probeData","_config","_onMediaInfo","_onMetaDataArrived","_onScriptDataArrived","_onTrackMetadata","_onDataAvailable","_dataOffset","_firstParse","_dispatch","_hasAudio","hasAudioTrack","_hasVideo","hasVideoTrack","_hasAudioFlagOverrided","_hasVideoFlagOverrided","_audioInitialMetadataDispatched","_videoInitialMetadataDispatched","_mediaInfo","_metadata","_audioMetadata","_videoMetadata","_naluLengthSize","_timestampBase","_timescale","_duration","_durationOverrided","_referenceFrameRate","_flvSoundRateTable","_mpegSamplingRates","_mpegAudioV10SampleRateTable","_mpegAudioV20SampleRateTable","_mpegAudioV25SampleRateTable","_mpegAudioL1BitRateTable","_mpegAudioL2BitRateTable","_mpegAudioL3BitRateTable","_videoTrack","id","sequenceNumber","samples","_audioTrack","_littleEndian","probe","needMoreData","mismatch","consumed","bindDataSource","loader","onDataArrival","parseChunks","base","resetMediaInfo","_isInitialMetadataDispatched","chunk","byteStart","le","FLVDemuxer","tagType","ts2","ts1","_parseAudioData","_parseVideoData","_parseScriptData","prevTagSize","scriptData","onMetaData","audiodatarate","videodatarate","framerate","keyframes","_parseKeyframesIndex","time","tagTimestamp","soundSpec","soundFormat","soundRate","soundRateIndex","soundType","meta","track","timescale","channelCount","aacData","_parseAACAudioData","packetType","misc","samplingRate","codec","originalCodec","refSampleDuration","mi","aacSample","unit","_parseMP3AudioData","bitRate","mp3Sample","_parseAACAudioSpecificConfig","originalAudioObjectType","samplingIndex","audioObjectType","extensionSamplingIndex","samplingFrequence","channelConfig","requestHeader","ver","layer","bitrate_index","sampling_freq_index","channel_count","sample_rate","bit_rate","tagPosition","spec","frameType","fourcc","_parseEnhancedHEVCVideoPacket","codecId","_parseAVCVideoPacket","_parseHEVCVideoPacket","cts","_parseAVCDecoderConfigurationRecord","_parseAVCVideoData","_parseHEVCDecoderConfigurationRecord","_parseHEVCVideoData","avcc","new_avcc","avcProfile","spsCount","sps","codecWidth","codecHeight","presentWidth","presentHeight","bitDepth","sarRatio","frameRate","codecArray","codecString","ppsCount","hvcc","new_hvcc","hevcProfile","numOfArrays","nalUnitType","numNalus","units","lengthSize","keyframe","naluSize","unitType","avcSample","isKeyframe","hevcSample","onError","onMediaInfo","onMetaDataArrived","onTrackMetadata","onDataAvailable","onTimedID3Metadata","onSMPTE2038Metadata","onSCTE35Metadata","onPESPrivateData","onPESPrivateDataDescriptor","program_pmt_pid","H264NaluType","pid_stream_type","common_pids","h264","h265","adts_aac","loas_aac","opus","ac3","mp3","pes_private_data_pids","timed_id3_pids","scte_35_pids","smpte2038_pids","slices","total_length","expected_length","file_position","MPEG4AudioObjectTypes","MPEG4SamplingFrequencyIndex","nalu","nalu_size","setUint32","current_startcode_offset_","eof_flag_","data_","findNextStartCodeOffset","start_offset","uint32","uint24","readNextNaluPayload","nalu_payload","nalu_type","forbidden_bit","next_startcode_offset","kReserved0","payload_data","H264NaluPayload","pps","sps_details","need_extra_fields","sps_length","pps_length","getData","SCTE35CommandType","MPEG4SamplingFrequencies","AACFrame","current_syncword_offset_","findNextSyncwordOffset","syncword_offset","readNextAACFrame","aac_frame","ID","protection_absent","sampling_frequency_index","channel_configuration","aac_frame_length","has_last_incomplete_data","adts_header_length","adts_frame_payload_length","next_syncword_offset","frame_data","audio_object_type","sampling_frequency","channel_config","hasIncompleteData","getIncompleteData","getLATMValue","bytesForValue","privious","audioMuxLengthBytes","streamMuxConfig","audioMuxVersion","fillBits","frameLengthType","otherDataPresent","otherDataLenBits","otherDataLenEsc","LOASAACFrame","other_data_present","tmp","aac_data","frame","original_audio_object_type","sampling_index","extension_sampling_index","sampling_rate","original_codec_mimetype","H265NaluType","parseSpliceTime","reader","time_specified_flag","pts_time","parseBreakDuration","auto_return","parseSpliceInsertComponent","splice_immediate_flag","component_tag","splice_time","parseSpliceScheduleEventComponent","utc_splice_time","parseSpliceScheduleEvent","splice_event_id","splice_event_cancel_indicator","spliceScheduleEvent","out_of_network_indicator","program_splice_flag","duration_flag","component_count","components","break_duration","unique_program_id","avail_num","avails_expected","parseAvailDescriptor","descriptor_tag","descriptor_length","identifier","provider_avail_id","parseDTMFDescriptor","preroll","dtmf_count","DTMF_char","parseSegmentationDescriptorComponent","pts_offset","parseSegmentationDescriptor","segmentation_event_id","segmentation_event_cancel_indicator","segmentationDescriptor","program_segmentation_flag","segmentation_duration_flag","delivery_not_restricted_flag","web_delivery_allowed_flag","no_regional_blackout_flag","archive_allowed_flag","device_restrictions","segmentation_duration","segmentation_upid_type","segmentation_upid_length","upid","segmentation_upid","segmentation_type_id","segment_num","segments_expected","sub_segment_num","sub_segments_expected","parseTimeDescriptor","TAI_seconds","TAI_ns","UTC_offset","parseAudioDescriptorComponent","ISO_code","Bit_Stream_Mode","Num_Channels","Full_Srvc_Audio","parseAudioDescriptor","audio_count","readSCTE35","table_id","section_syntax_indicator","private_indicator","section_length","protocol_version","encrypted_packet","encryption_algorithm","pts_adjustment","cw_index","tier","splice_command_length","splice_command_type","splice_command","kSpliceNull","kSpliceSchedule","splice_count","parseSpliceSchedule","kSpliceInsert","spliceInsert","parseSpliceInsert","kTimeSignal","parseTimeSignal","kBandwidthReservation","kPrivateCommand","private_data","parsePrivateCommand","splice_descriptors","descriptor_loop_length","detail","E_CRC32","CRC32","duraiton","timeSignal","H265NaluPayload","vps","kSliceVPS","kSliceSPS","kSlicePPS","frame_size_code_table","readNextAC3Frame","ac3_frame","sampling_rate_code","frame_size_code","frame_size","bit_stream_identification","bit_stream_mode","channel_mode","lfe_skip","low_frequency_effects_channel_on","AC3Frame","probe_data","first_parse_","media_info_","timescale_","duration_","current_pmt_pid_","program_pmt_map_","pes_slice_queues_","section_slice_queues_","video_metadata_","details","audio_metadata_","aac_last_sample_pts_","aac_last_incomplete_data_","has_video_","has_audio_","video_init_segment_dispatched_","audio_init_segment_dispatched_","video_metadata_changed_","audio_metadata_changed_","loas_previous_frame","video_track_","audio_track_","ts_packet_size_","ts_packet_size","sync_offset_","sync_offset","config_","scan_window","byte_start","sync_byte","payload_unit_start_indicator","pid","adaptation_field_control","continuity_conunter","adaptation_field_info","ts_payload_start_index","adaptation_field_length","parseAdaptationField","pmt_","kSCTE35","ts_payload_length","handleSectionSlice","random_access_indicator","stream_type","handlePESSlice","dispatchAudioVideoMediaSegment","discontinuity_indicator","elementary_stream_priority_indicator","slice_queue","pointer_field","remain_section","emitSectionSlices","clearSlices","SliceQueue","packet_start_code_prefix","PES_packet_length","emitPESSlices","section_data","SectionData","parseSection","pes_data","PESData","parsePES","parsePAT","parsePMT","parseSCTE35","stream_id","PTS_DTS_flags","PES_header_data_length","payload_start_index","payload_length","payload","kMPEG1Audio","kMPEG2Audio","parseMP3Payload","kPESPrivateData","parseOpusPayload","parseAC3Payload","parseSMPTE2038MetadataPayload","parsePESPrivateDataPayload","kADTSAAC","parseADTSAACPayload","kLOASAAC","parseLOASAACPayload","kAC3","kID3","parseTimedID3MetadataPayload","kH264","parseH264Payload","kH265","parseH265Payload","version_number","current_next_indicator","section_number","pat","PAT","pat_","program_bytes","first_program_number","first_pmt_pid","program_number","network_pid","JSON","stringify","current_program_","pmt","PMT","program_info_length","info_start_index","info_bytes","elementary_PID","ES_info_length","already_has_video","already_has_audio","registration","from","channel_config_code","sample","dispatchAudioInitSegment","detectAudioMetadataChange","dispatchAudioMediaSegment","descriptors","dispatchPESPrivateDataDescriptor","scte35","pts_ms","nearest_pts","annexb_parser","nalu_avc1","H264NaluAVC1","detectVideoMetadataChange","dispatchVideoMediaSegment","dispatchVideoInitSegment","kSliceIDR","kSliceNonIDR","dts_ms","avc_sample","nalu_hvc1","H265NaluHVC1","kSliceIDR_W_RADL","kSliceIDR_N_LP","kSliceCRA_NUT","hvc_sample","new_sps","new_details","old_size","new_size","isInitSegmentDispatched","vps_without_header","sps_without_header","pps_without_header","HEVCDecoderConfigurationRecord","AVCDecoderConfigurationRecord","ref_sample_duration","base_pts_ms","new_pts_ms","abs","last_sample_pts_ms","adts_parser","sample_pts_ms","audio_sample","sample_pts_ms_int","aac_sample","loas_parser","ac3_sample","opus_pending_trim_start","trim_end","opus_sample","object_type","MP3Data","mp3_sample","audio_specific_config","ac3_config","AC3Config","channelConfigCode","descriptor","desc","PESPrivateDataDescriptor","PESPrivateData","timed_id3_metadata","smpte2038_data","SMPTE2038Data","ancillaries","YC_indicator","line_number","horizontal_offset","data_ID","data_SDID","data_count","user_data","user_data_word","description","yc_indicator","did","sdid","information","smpte2038parse","MP4","types","avc1","avcC","btrt","dinf","dref","esds","ftyp","hdlr","hvc1","hvcC","mdat","mdhd","mdia","mfhd","minf","moof","moov","mp4a","mvex","mvhd","sdtp","stbl","stco","stsc","stsd","stsz","stts","tfdt","tfhd","traf","trak","trun","trex","tkhd","vmhd","smhd","Opus","dOps","dac3","charCodeAt","constants","FTYP","STSD_PREFIX","STTS","STSC","STCO","STSZ","HDLR_VIDEO","HDLR_AUDIO","DREF","SMHD","VMHD","box","datas","arrayCount","generateInitSegment","trackId","xmhd","startsWith","sampleRate","configSize","mapping","baseMediaDecodeTime","sampleCount","isLeading","dependsOn","isDependedOn","hasRedundancy","isNonSync","getSilentFrame","_isLive","isLive","_dtsBase","_dtsBaseInited","_audioDtsBase","Infinity","_videoDtsBase","_audioNextDts","_videoNextDts","_audioStashedLastSample","_videoStashedLastSample","_audioMeta","_videoMeta","_audioSegmentInfoList","_videoSegmentInfoList","_onInitSegment","_onMediaSegment","_forceFirstIDR","_fillSilentAfterSeek","msedge","msie","_mp3UseMpegAudio","firefox","_fillAudioTimestampGap","fixAudioTimestampGap","producer","remux","_onTrackMetadataReceived","insertDiscontinuity","seek","audioTrack","videoTrack","_calculateDtsBase","_remuxVideo","_remuxAudio","metabox","container","mediaDuration","getTimestampBase","flushStashedSamples","videoSample","audioSample","force","lastDts","dtsCorrection","firstDts","mpegRawTrack","firstSegmentAfterSeek","insertPrefixSilentFrame","mdatbox","mdatBytes","firstSampleOriginalDts","distance","firstSampleDts","videoSegment","silentUnit","silentFrameDuration","mp4Samples","needFillSilentFrames","silentFrames","sampleDuration","curRefDts","frameCount","round","intDts","intDuration","latest","moofbox","_mergeBoxes","timestampOffset","lastPts","firstPts","syncPoint","mediaDataSource","_emitter","filesize","url","cors","withCredentials","_mediaDataSource","_currentSegmentIndex","totalDuration","forEach","timestampBase","referrerPolicy","_demuxer","_remuxer","_ioctl","_pendingSeekTime","_pendingResolveSeekPoint","_statisticsReporter","_disableStatisticsReporter","event","_loadSegment","_enableStatisticsReporter","segmentIndex","optionalFrom","ioctl","_onIOException","onSeeked","_onIOSeeked","onComplete","_onIOComplete","onRedirect","_onIORedirect","onRecoveredEarlyEof","_onIORecoveredEarlyEof","_onInitChunkArrival","stop","_internalAbort","pause","resume","isPaused","targetSegmentIndex","_searchSegmentIndexContains","segmentInfo","targetSegmentInfo","_reportSegmentMediaInfo","_setupFLVDemuxerRemuxer","_setupTSDemuxerRemuxer","then","mds","overridedDuration","overridedHasAudio","overridedHasVideo","_onDemuxException","onScriptDataArrived","onInitSegment","_onRemuxerInitSegmentArrival","onMediaSegment","_onRemuxerMediaSegmentArrival","demuxer","_onTimedID3Metadata","_onSMPTE2038Metadata","_onSCTE35Metadata","_onPESPrivateDataDescriptor","_onPESPrivateData","mediaInfo","setPrototypeOf","timestamp_base","smpte2038_metadata","extraData","nextSegmentIndex","redirectedURL","code","initSegment","mediaSegment","seekpoint","setInterval","_reportStatisticsInfo","statisticsInfoReportInterval","clearInterval","exportInfo","currentURL","hasRedirect","currentRedirectedURL","speed","currentSpeed","loaderType","currentSegmentIndex","totalSegmentCount","_firstCheckpoint","_lastCheckpoint","_intervalBytes","_totalBytes","_lastSecondBytes","performance","now","_now","reset","addBytes","bytes","durationSeconds","currentKBps","seekHandler","_seekHandler","_requestAbort","_abortController","_contentLength","_receivedLength","isSupported","isWorkWellEdge","browserNotBlacklisted","fetch","ReadableStream","_dataSource","_range","sourceURL","reuseRedirectedURL","seekConfig","headers","Headers","configHeaders","params","method","cache","credentials","AbortController","signal","res","body","cancel","ok","status","removeURLParameters","lengthHeader","_pump","getReader","statusText","catch","aborted","read","done","_xhr","xhr","XMLHttpRequest","responseType","onreadystatechange","onprogress","onloadend","onerror","_requestURL","_onReadyStateChange","_onProgress","_onLoadEnd","_onXhrError","setRequestHeader","send","readyState","responseURL","total","response","loaded","constructor","_chunkSizeKBList","_currentChunkSizeKB","_currentSpeedNormalized","_zeroSpeedChunkCount","_speedSampler","_waitForTotalLength","_totalLengthReceived","_currentRequestURL","_currentRedirectedURL","_currentRequestRange","_totalLength","_lastTimeLoaded","onload","lastSecondKBps","useRefTotalLength","_openSubRange","_internalOpen","to","chunkSize","_onLoad","openNextRange","delta","_normalizeSpeed","KBps","normalized","reportComplete","_ws","WebSocket","ws","binaryType","onopen","_onWebSocketOpen","onclose","_onWebSocketClose","onmessage","_onWebSocketMessage","_onWebSocketError","close","_dispatchArrayBuffer","Blob","FileReader","readAsArrayBuffer","arraybuffer","zeroStart","_zeroStart","param","seekedURL","paramStart","paramEnd","_startName","_endName","baseUrl","needAnd","baseURL","queryIndex","substring","resultParams","pairs","pair","requireAnd","_extraData","_stashInitialSize","stashInitialSize","_stashUsed","_stashSize","_bufferSize","_stashBuffer","_stashByteStart","_enableStash","enableStashBuffer","_loader","_loaderClass","_isWebSocketURL","test","_refTotalLength","_fullRequestFlag","_currentRange","_redirectedURL","_speedNormalized","_speedNormalizeList","_isEarlyEofReconnecting","_paused","_resumeFrom","_onSeeked","_onRedirect","_onRecoveredEarlyEof","_selectSeekHandler","_selectLoader","_createLoader","seekType","rangeLoadZeroStart","seekParamStart","seekParamEnd","customSeekHandler","customLoader","needStashBuffer","onContentLengthKnown","onURLRedirect","_onLoaderChunkArrival","_onLoaderComplete","_onLoaderError","_internalSeek","dropUnconsumed","_flushStashBuffer","requestRange","updateUrl","_expandBuffer","expectedBytes","bufferNewSize","newBuffer","stashOldArray","_adjustStashSize","stashSizeKB","bufferSize","_dispatchChunks","chunks","contentLength","receivedLength","stashArray","remainArray","remain","nextFrom","install","obj","proto","__proto__","output","source","polyfill","Polyfill","webpackBootstrapFunc","configurable","oe","f","ENTRY_MODULE","default","quoteRegExp","replace","getModuleDependencies","sources","queueName","retval","fnString","wrapperSignature","webpackRequireName","re","RegExp","hasValuesInQueues","queues","reduce","hasValues","options","main","requiredModules","all","modulesQueue","seenModules","moduleToCheck","newModules","newModulesKeys","getRequiredModules","filter","entryModule","map","blob","bare","workerUrl","URL","webkitURL","mozURL","msURL","createObjectURL","worker","Worker","objectURL","isFunction","x","isArray","vertxNext","customSchedulerFn","asap","queue","flush","scheduleFlush","browserWindow","browserGlobal","BrowserMutationObserver","MutationObserver","WebKitMutationObserver","isNode","process","isWorker","Uint8ClampedArray","importScripts","MessageChannel","useSetTimeout","globalSetTimeout","setTimeout","channel","iterations","observer","node","onFulfillment","onRejection","parent","child","noop","PROMISE_ID","makePromise","_state","invokeCallback","_result","subscribe","resolve$1","promise","nextTick","document","createTextNode","observe","characterData","port1","port2","postMessage","vertx","require","runOnLoop","runOnContext","attemptVertx","random","handleMaybeThenable","maybeThenable","then$$1","thenable","fulfill","reason","handleOwnThenable","sealed","fulfillmentHandler","rejectionHandler","tryThen","_label","handleForeignThenable","publishRejection","_onerror","publish","_subscribers","subscribers","settled","hasCallback","succeeded","Enumerator","Constructor","_instanceConstructor","_remaining","_enumerate","_eachEntry","entry","resolve$$1","_then","didError","_settledAt","Promise$1","_willSettleAt","enumerator","needsResolver","initializePromise","needsNew","finally","entries","race","_","_setScheduler","scheduleFn","_setAsap","asapFn","_asap","local","global","P","promiseToString","cast","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","marker","runClearTimeout","Item","title","env","argv","versions","binding","cwd","chdir","dir","umask","g","controller","logcatListener","logcat","onLoadingComplete","onTimedID3MetadataArrived","onSMPTE2038MetadataArrived","onSCTE35MetadataArrived","onPESPrivateDataArrived","onStatisticsInfo","statInfo","onIOError","onDemuxError","onRecommendSeekpoint","cmd","defaultConfig","enableWorker","liveBufferLatencyChasing","liveBufferLatencyMaxLatency","liveBufferLatencyMinRemain","lazyLoad","lazyLoadMaxDuration","lazyLoadRecoverDuration","deferLoadAfterSourceOpen","autoCleanupMaxBackwardDuration","autoCleanupMinBackwardDuration","accurateSeek","createDefaultConfig","supportMSEH264Playback","MediaSource","isTypeSupported","supportMSEH265Playback","supportNetworkStreamIO","getNetworkLoaderTypeName","supportNativeMediaPlayback","Features","videoElement","createElement","canPlay","canPlayType","getFeatureList","features","msePlayback","mseLivePlayback","mseH265Playback","networkStreamIO","networkLoaderName","nativeMP4H264Playback","nativeMP4H265Playback","nativeWebmVP8Playback","nativeWebmVP9Playback","ERROR","_worker","_workerDestroying","_onWorkerMessage","onLoggingConfigChanged","_onLoggingConfigChanged","_controller","ctl","_onIOError","_onDemuxError","_onLoadingComplete","_onTimedID3MetadataArrived","_onSMPTE2038MetadataArrived","_onSCTE35MetadataArrived","_onPESPrivateDataArrived","_onStatisticsInfo","_onRecommendSeekpoint","hasWorker","statisticsInfo","terminate","SOURCE_OPEN","UPDATE_END","BUFFER_FULL","autoCleanupSourceBuffer","onSourceOpen","_onSourceOpen","onSourceEnded","_onSourceEnded","onSourceClose","_onSourceClose","onSourceBufferError","_onSourceBufferError","onSourceBufferUpdateEnd","_onSourceBufferUpdateEnd","_mediaSource","_mediaSourceObjectURL","_mediaElement","_isBufferFull","_hasPendingEos","_requireSetMediaDuration","_pendingMediaDuration","_pendingSourceBufferInit","_mimeTypes","video","audio","_sourceBuffers","_lastInitSegments","_pendingSegments","_pendingRemoveRanges","_idrList","detachMediaElement","attachMediaElement","mediaElement","ms","ps","sb","removeSourceBuffer","endOfStream","removeAttribute","revokeObjectURL","appendInitSegment","deferred","is","firstInitSegment","addSourceBuffer","updating","_doAppendSegments","_updateMediaSourceDuration","appendMediaSegment","_needCleanupSourceBuffer","_doCleanupSourceBuffer","_hasPendingRemoveRanges","seconds","buffered","end","_doRemoveRanges","lastInitSegment","_hasPendingSegments","currentTime","doRemove","removeEnd","current","ranges","remove","pendingSegments","currentOffset","targetOffset","appendBuffer","pendings","prr","ErrorTypes","NETWORK_ERROR","MEDIA_ERROR","OTHER_ERROR","ErrorDetails","NETWORK_EXCEPTION","NETWORK_STATUS_CODE_INVALID","NETWORK_TIMEOUT","NETWORK_UNRECOVERABLE_EARLY_EOF","MEDIA_MSE_ERROR","MEDIA_FORMAT_ERROR","MEDIA_FORMAT_UNSUPPORTED","MEDIA_CODEC_UNSUPPORTED","typeLowerCase","onvLoadedMetadata","_onvLoadedMetadata","onvSeeking","_onvSeeking","onvCanPlay","_onvCanPlay","onvStalled","_onvStalled","onvProgress","_onvProgress","_requestSetTime","_seekpointRecord","_progressChecker","_msectl","_transmuxer","_mseSourceOpened","_hasPendingLoad","_receivedCanPlay","_statisticsInfo","chromeNeedIDRFix","_alwaysSeekKeyframe","unload","_onmseUpdateEnd","_onmseBufferFull","load","_suspendTransmuxer","scte35_metadata","_fillStatisticsInfo","play","volume","muted","playerType","HTMLVideoElement","hasQualityInfo","decoded","dropped","getVideoPlaybackQuality","quality","totalVideoFrames","droppedVideoFrames","webkitDecodedFrameCount","webkitDroppedFrameCount","decodedFrames","droppedFrames","paused","buffered_end","target_time","currentRangeEnd","_checkProgressAndResume","needResume","_isTimepointBuffered","directSeek","directSeekBegin","directSeekBeginTime","videoBeginTime","idr","_checkAndApplyUnbufferedSeekpoint","recordTime","_checkAndResumeStuckPlayback","stalled","media","seekPoint","preload","HTMLAudioElement","videoWidth","videoHeight","mpegts","optionalConfig","BaseLoader","Events","MSEPlayer","NativePlayer"],"mappings":"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","file":"mpegts.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"mpegts\"] = factory();\n\telse\n\t\troot[\"mpegts\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 14);\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\n\nclass Log {\n\n static e(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'error', str);\n }\n\n if (!Log.ENABLE_ERROR) {\n return;\n }\n\n if (console.error) {\n console.error(str);\n } else if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static i(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'info', str);\n }\n\n if (!Log.ENABLE_INFO) {\n return;\n }\n\n if (console.info) {\n console.info(str);\n } else {\n console.log(str);\n }\n }\n\n static w(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'warn', str);\n }\n\n if (!Log.ENABLE_WARN) {\n return;\n }\n\n if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static d(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'debug', str);\n }\n\n if (!Log.ENABLE_DEBUG) {\n return;\n }\n\n if (console.debug) {\n console.debug(str);\n } else {\n console.log(str);\n }\n }\n\n static v(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'verbose', str);\n }\n\n if (!Log.ENABLE_VERBOSE) {\n return;\n }\n\n console.log(str);\n }\n\n}\n\nLog.GLOBAL_TAG = 'mpegts.js';\nLog.FORCE_GLOBAL_TAG = false;\nLog.ENABLE_ERROR = true;\nLog.ENABLE_INFO = true;\nLog.ENABLE_WARN = true;\nLog.ENABLE_DEBUG = true;\nLog.ENABLE_VERBOSE = true;\n\nLog.ENABLE_CALLBACK = false;\n\nLog.emitter = new EventEmitter();\n\nexport default Log;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst TransmuxingEvents = {\n IO_ERROR: 'io_error',\n DEMUX_ERROR: 'demux_error',\n INIT_SEGMENT: 'init_segment',\n MEDIA_SEGMENT: 'media_segment',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n METADATA_ARRIVED: 'metadata_arrived',\n SCRIPTDATA_ARRIVED: 'scriptdata_arrived',\n TIMED_ID3_METADATA_ARRIVED: 'timed_id3_metadata_arrived',\n SMPTE2038_METADATA_ARRIVED: 'smpte2038_metadata_arrived',\n SCTE35_METADATA_ARRIVED: 'scte35_metadata_arrived',\n PES_PRIVATE_DATA_DESCRIPTOR: 'pes_private_data_descriptor',\n PES_PRIVATE_DATA_ARRIVED: 'pes_private_data_arrived',\n STATISTICS_INFO: 'statistics_info',\n RECOMMEND_SEEKPOINT: 'recommend_seekpoint'\n};\n\nexport default TransmuxingEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {NotImplementedException} from '../utils/exception.js';\n\nexport const LoaderStatus = {\n kIdle: 0,\n kConnecting: 1,\n kBuffering: 2,\n kError: 3,\n kComplete: 4\n};\n\nexport const LoaderErrors = {\n OK: 'OK',\n EXCEPTION: 'Exception',\n HTTP_STATUS_CODE_INVALID: 'HttpStatusCodeInvalid',\n CONNECTING_TIMEOUT: 'ConnectingTimeout',\n EARLY_EOF: 'EarlyEof',\n UNRECOVERABLE_EARLY_EOF: 'UnrecoverableEarlyEof'\n};\n\n/* Loader has callbacks which have following prototypes:\n * function onContentLengthKnown(contentLength: number): void\n * function onURLRedirect(url: string): void\n * function onDataArrival(chunk: ArrayBuffer, byteStart: number, receivedLength: number): void\n * function onError(errorType: number, errorInfo: {code: number, msg: string}): void\n * function onComplete(rangeFrom: number, rangeTo: number): void\n */\nexport class BaseLoader {\n\n constructor(typeName) {\n this._type = typeName || 'undefined';\n this._status = LoaderStatus.kIdle;\n this._needStash = false;\n // callbacks\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n destroy() {\n this._status = LoaderStatus.kIdle;\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n isWorking() {\n return this._status === LoaderStatus.kConnecting || this._status === LoaderStatus.kBuffering;\n }\n\n get type() {\n return this._type;\n }\n\n get status() {\n return this._status;\n }\n\n get needStashBuffer() {\n return this._needStash;\n }\n\n get onContentLengthKnown() {\n return this._onContentLengthKnown;\n }\n\n set onContentLengthKnown(callback) {\n this._onContentLengthKnown = callback;\n }\n\n get onURLRedirect() {\n return this._onURLRedirect;\n }\n\n set onURLRedirect(callback) {\n this._onURLRedirect = callback;\n }\n\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n // pure virtual\n open(dataSource, range) {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n abort() {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class RuntimeException {\n\n constructor(message) {\n this._message = message;\n }\n\n get name() {\n return 'RuntimeException';\n }\n\n get message() {\n return this._message;\n }\n\n toString() {\n return this.name + ': ' + this.message;\n }\n\n}\n\nexport class IllegalStateException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'IllegalStateException';\n }\n\n}\n\nexport class InvalidArgumentException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'InvalidArgumentException';\n }\n\n}\n\nexport class NotImplementedException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'NotImplementedException';\n }\n\n}\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nlet Browser = {};\n\nfunction detect() {\n // modified from jquery-browser-plugin\n\n let ua = self.navigator.userAgent.toLowerCase();\n\n let match = /(edge)\\/([\\w.]+)/.exec(ua) ||\n /(opr)[\\/]([\\w.]+)/.exec(ua) ||\n /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\n /(iemobile)[\\/]([\\w.]+)/.exec(ua) ||\n /(version)(applewebkit)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+).*(version)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\n /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\n /(msie) ([\\w.]+)/.exec(ua) ||\n ua.indexOf('trident') >= 0 && /(rv)(?::| )([\\w.]+)/.exec(ua) ||\n ua.indexOf('compatible') < 0 && /(firefox)[ \\/]([\\w.]+)/.exec(ua) ||\n [];\n\n let platform_match = /(ipad)/.exec(ua) ||\n /(ipod)/.exec(ua) ||\n /(windows phone)/.exec(ua) ||\n /(iphone)/.exec(ua) ||\n /(kindle)/.exec(ua) ||\n /(android)/.exec(ua) ||\n /(windows)/.exec(ua) ||\n /(mac)/.exec(ua) ||\n /(linux)/.exec(ua) ||\n /(cros)/.exec(ua) ||\n [];\n\n let matched = {\n browser: match[5] || match[3] || match[1] || '',\n version: match[2] || match[4] || '0',\n majorVersion: match[4] || match[2] || '0',\n platform: platform_match[0] || ''\n };\n\n let browser = {};\n if (matched.browser) {\n browser[matched.browser] = true;\n\n let versionArray = matched.majorVersion.split('.');\n browser.version = {\n major: parseInt(matched.majorVersion, 10),\n string: matched.version\n };\n if (versionArray.length > 1) {\n browser.version.minor = parseInt(versionArray[1], 10);\n }\n if (versionArray.length > 2) {\n browser.version.build = parseInt(versionArray[2], 10);\n }\n }\n\n if (matched.platform) {\n browser[matched.platform] = true;\n }\n\n if (browser.chrome || browser.opr || browser.safari) {\n browser.webkit = true;\n }\n\n // MSIE. IE11 has 'rv' identifer\n if (browser.rv || browser.iemobile) {\n if (browser.rv) {\n delete browser.rv;\n }\n let msie = 'msie';\n matched.browser = msie;\n browser[msie] = true;\n }\n\n // Microsoft Edge\n if (browser.edge) {\n delete browser.edge;\n let msedge = 'msedge';\n matched.browser = msedge;\n browser[msedge] = true;\n }\n\n // Opera 15+\n if (browser.opr) {\n let opera = 'opera';\n matched.browser = opera;\n browser[opera] = true;\n }\n\n // Stock android browsers are marked as Safari\n if (browser.safari && browser.android) {\n let android = 'android';\n matched.browser = android;\n browser[android] = true;\n }\n\n browser.name = matched.browser;\n browser.platform = matched.platform;\n\n for (let key in Browser) {\n if (Browser.hasOwnProperty(key)) {\n delete Browser[key];\n }\n }\n Object.assign(Browser, browser);\n}\n\ndetect();\n\nexport default Browser;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DemuxErrors = {\n OK: 'OK',\n FORMAT_ERROR: 'FormatError',\n FORMAT_UNSUPPORTED: 'FormatUnsupported',\n CODEC_UNSUPPORTED: 'CodecUnsupported'\n};\n\nexport default DemuxErrors;","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Represents an media sample (audio / video)\nexport class SampleInfo {\n\n constructor(dts, pts, duration, originalDts, isSync) {\n this.dts = dts;\n this.pts = pts;\n this.duration = duration;\n this.originalDts = originalDts;\n this.isSyncPoint = isSync;\n this.fileposition = null;\n }\n\n}\n\n// Media Segment concept is defined in Media Source Extensions spec.\n// Particularly in ISO BMFF format, an Media Segment contains a moof box followed by a mdat box.\nexport class MediaSegmentInfo {\n\n constructor() {\n this.beginDts = 0;\n this.endDts = 0;\n this.beginPts = 0;\n this.endPts = 0;\n this.originalBeginDts = 0;\n this.originalEndDts = 0;\n this.syncPoints = []; // SampleInfo[n], for video IDR frames only\n this.firstSample = null; // SampleInfo\n this.lastSample = null; // SampleInfo\n }\n\n appendSyncPoint(sampleInfo) { // also called Random Access Point\n sampleInfo.isSyncPoint = true;\n this.syncPoints.push(sampleInfo);\n }\n\n}\n\n// Ordered list for recording video IDR frames, sorted by originalDts\nexport class IDRSampleList {\n\n constructor() {\n this._list = [];\n }\n\n clear() {\n this._list = [];\n }\n\n appendArray(syncPoints) {\n let list = this._list;\n\n if (syncPoints.length === 0) {\n return;\n }\n\n if (list.length > 0 && syncPoints[0].originalDts < list[list.length - 1].originalDts) {\n this.clear();\n }\n\n Array.prototype.push.apply(list, syncPoints);\n }\n\n getLastSyncPointBeforeDts(dts) {\n if (this._list.length == 0) {\n return null;\n }\n\n let list = this._list;\n let idx = 0;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (dts < list[0].dts) {\n idx = 0;\n lbound = ubound + 1;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (dts >= list[mid].dts && dts < list[mid + 1].dts)) {\n idx = mid;\n break;\n } else if (list[mid].dts < dts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return this._list[idx];\n }\n\n}\n\n// Data structure for recording information of media segments in single track.\nexport class MediaSegmentInfoList {\n\n constructor(type) {\n this._type = type;\n this._list = [];\n this._lastAppendLocation = -1; // cached last insert location\n }\n\n get type() {\n return this._type;\n }\n\n get length() {\n return this._list.length;\n }\n\n isEmpty() {\n return this._list.length === 0;\n }\n\n clear() {\n this._list = [];\n this._lastAppendLocation = -1;\n }\n\n _searchNearestSegmentBefore(originalBeginDts) {\n let list = this._list;\n if (list.length === 0) {\n return -2;\n }\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n let idx = 0;\n\n if (originalBeginDts < list[0].originalBeginDts) {\n idx = -1;\n return idx;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (originalBeginDts > list[mid].lastSample.originalDts &&\n (originalBeginDts < list[mid + 1].originalBeginDts))) {\n idx = mid;\n break;\n } else if (list[mid].originalBeginDts < originalBeginDts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return idx;\n }\n\n _searchNearestSegmentAfter(originalBeginDts) {\n return this._searchNearestSegmentBefore(originalBeginDts) + 1;\n }\n\n append(mediaSegmentInfo) {\n let list = this._list;\n let msi = mediaSegmentInfo;\n let lastAppendIdx = this._lastAppendLocation;\n let insertIdx = 0;\n\n if (lastAppendIdx !== -1 && lastAppendIdx < list.length &&\n msi.originalBeginDts >= list[lastAppendIdx].lastSample.originalDts &&\n ((lastAppendIdx === list.length - 1) ||\n (lastAppendIdx < list.length - 1 &&\n msi.originalBeginDts < list[lastAppendIdx + 1].originalBeginDts))) {\n insertIdx = lastAppendIdx + 1; // use cached location idx\n } else {\n if (list.length > 0) {\n insertIdx = this._searchNearestSegmentBefore(msi.originalBeginDts) + 1;\n }\n }\n\n this._lastAppendLocation = insertIdx;\n this._list.splice(insertIdx, 0, msi);\n }\n\n getLastSegmentBefore(originalBeginDts) {\n let idx = this._searchNearestSegmentBefore(originalBeginDts);\n if (idx >= 0) {\n return this._list[idx];\n } else { // -1\n return null;\n }\n }\n\n getLastSampleBefore(originalBeginDts) {\n let segment = this.getLastSegmentBefore(originalBeginDts);\n if (segment != null) {\n return segment.lastSample;\n } else {\n return null;\n }\n }\n\n getLastSyncPointBefore(originalBeginDts) {\n let segmentIdx = this._searchNearestSegmentBefore(originalBeginDts);\n let syncPoints = this._list[segmentIdx].syncPoints;\n while (syncPoints.length === 0 && segmentIdx > 0) {\n segmentIdx--;\n syncPoints = this._list[segmentIdx].syncPoints;\n }\n if (syncPoints.length > 0) {\n return syncPoints[syncPoints.length - 1];\n } else {\n return null;\n }\n }\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass MediaInfo {\n\n constructor() {\n this.mimeType = null;\n this.duration = null;\n\n this.hasAudio = null;\n this.hasVideo = null;\n this.audioCodec = null;\n this.videoCodec = null;\n this.audioDataRate = null;\n this.videoDataRate = null;\n\n this.audioSampleRate = null;\n this.audioChannelCount = null;\n\n this.width = null;\n this.height = null;\n this.fps = null;\n this.profile = null;\n this.level = null;\n this.refFrames = null;\n this.chromaFormat = null;\n this.sarNum = null;\n this.sarDen = null;\n\n this.metadata = null;\n this.segments = null; // MediaInfo[]\n this.segmentCount = null;\n this.hasKeyframesIndex = null;\n this.keyframesIndex = null;\n }\n\n isComplete() {\n let audioInfoComplete = (this.hasAudio === false) ||\n (this.hasAudio === true &&\n this.audioCodec != null &&\n this.audioSampleRate != null &&\n this.audioChannelCount != null);\n\n let videoInfoComplete = (this.hasVideo === false) ||\n (this.hasVideo === true &&\n this.videoCodec != null &&\n this.width != null &&\n this.height != null &&\n this.fps != null &&\n this.profile != null &&\n this.level != null &&\n this.refFrames != null &&\n this.chromaFormat != null &&\n this.sarNum != null &&\n this.sarDen != null);\n\n // keyframesIndex may not be present\n return this.mimeType != null &&\n audioInfoComplete &&\n videoInfoComplete;\n }\n\n isSeekable() {\n return this.hasKeyframesIndex === true;\n }\n\n getNearestKeyframe(milliseconds) {\n if (this.keyframesIndex == null) {\n return null;\n }\n\n let table = this.keyframesIndex;\n let keyframeIdx = this._search(table.times, milliseconds);\n\n return {\n index: keyframeIdx,\n milliseconds: table.times[keyframeIdx],\n fileposition: table.filepositions[keyframeIdx]\n };\n }\n\n _search(list, value) {\n let idx = 0;\n\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (value < list[0]) {\n idx = 0;\n lbound = ubound + 1; // skip search\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (value >= list[mid] && value < list[mid + 1])) {\n idx = mid;\n break;\n } else if (list[mid] < value) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n\n return idx;\n }\n\n}\n\nexport default MediaInfo;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from './logger.js';\n\nclass LoggingControl {\n\n static get forceGlobalTag() {\n return Log.FORCE_GLOBAL_TAG;\n }\n\n static set forceGlobalTag(enable) {\n Log.FORCE_GLOBAL_TAG = enable;\n LoggingControl._notifyChange();\n }\n\n static get globalTag() {\n return Log.GLOBAL_TAG;\n }\n\n static set globalTag(tag) {\n Log.GLOBAL_TAG = tag;\n LoggingControl._notifyChange();\n }\n\n static get enableAll() {\n return Log.ENABLE_VERBOSE\n && Log.ENABLE_DEBUG\n && Log.ENABLE_INFO\n && Log.ENABLE_WARN\n && Log.ENABLE_ERROR;\n }\n\n static set enableAll(enable) {\n Log.ENABLE_VERBOSE = enable;\n Log.ENABLE_DEBUG = enable;\n Log.ENABLE_INFO = enable;\n Log.ENABLE_WARN = enable;\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableDebug() {\n return Log.ENABLE_DEBUG;\n }\n\n static set enableDebug(enable) {\n Log.ENABLE_DEBUG = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableVerbose() {\n return Log.ENABLE_VERBOSE;\n }\n\n static set enableVerbose(enable) {\n Log.ENABLE_VERBOSE = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableInfo() {\n return Log.ENABLE_INFO;\n }\n\n static set enableInfo(enable) {\n Log.ENABLE_INFO = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableWarn() {\n return Log.ENABLE_WARN;\n }\n\n static set enableWarn(enable) {\n Log.ENABLE_WARN = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableError() {\n return Log.ENABLE_ERROR;\n }\n\n static set enableError(enable) {\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static getConfig() {\n return {\n globalTag: Log.GLOBAL_TAG,\n forceGlobalTag: Log.FORCE_GLOBAL_TAG,\n enableVerbose: Log.ENABLE_VERBOSE,\n enableDebug: Log.ENABLE_DEBUG,\n enableInfo: Log.ENABLE_INFO,\n enableWarn: Log.ENABLE_WARN,\n enableError: Log.ENABLE_ERROR,\n enableCallback: Log.ENABLE_CALLBACK\n };\n }\n\n static applyConfig(config) {\n Log.GLOBAL_TAG = config.globalTag;\n Log.FORCE_GLOBAL_TAG = config.forceGlobalTag;\n Log.ENABLE_VERBOSE = config.enableVerbose;\n Log.ENABLE_DEBUG = config.enableDebug;\n Log.ENABLE_INFO = config.enableInfo;\n Log.ENABLE_WARN = config.enableWarn;\n Log.ENABLE_ERROR = config.enableError;\n Log.ENABLE_CALLBACK = config.enableCallback;\n }\n\n static _notifyChange() {\n let emitter = LoggingControl.emitter;\n\n if (emitter.listenerCount('change') > 0) {\n let config = LoggingControl.getConfig();\n emitter.emit('change', config);\n }\n }\n\n static registerListener(listener) {\n LoggingControl.emitter.addListener('change', listener);\n }\n\n static removeListener(listener) {\n LoggingControl.emitter.removeListener('change', listener);\n }\n\n static addLogListener(listener) {\n Log.emitter.addListener('log', listener);\n if (Log.emitter.listenerCount('log') > 0) {\n Log.ENABLE_CALLBACK = true;\n LoggingControl._notifyChange();\n }\n }\n\n static removeLogListener(listener) {\n Log.emitter.removeListener('log', listener);\n if (Log.emitter.listenerCount('log') === 0) {\n Log.ENABLE_CALLBACK = false;\n LoggingControl._notifyChange();\n }\n }\n\n}\n\nLoggingControl.emitter = new EventEmitter();\n\nexport default LoggingControl;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from C++ project libWinTF8 (https://github.com/m13253/libWinTF8)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction checkContinuation(uint8array, start, checkLength) {\n let array = uint8array;\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80)\n return false;\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction decodeUTF8(uint8array) {\n let out = [];\n let input = uint8array;\n let i = 0;\n let length = uint8array.length;\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]));\n ++i;\n continue;\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (checkContinuation(input, i, 1)) {\n let ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F);\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 2;\n continue;\n }\n }\n } else if (input[i] < 0xF0) {\n if (checkContinuation(input, i, 2)) {\n let ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F;\n if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 3;\n continue;\n }\n }\n } else if (input[i] < 0xF8) {\n if (checkContinuation(input, i, 3)) {\n let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12\n | (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F);\n if (ucs4 > 0x10000 && ucs4 < 0x110000) {\n ucs4 -= 0x10000;\n out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800));\n out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00));\n i += 4;\n continue;\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD));\n ++i;\n }\n\n return out.join('');\n}\n\nexport default decodeUTF8;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport decodeUTF8 from '../utils/utf8-conv.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\nlet le = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n})();\n\nclass AMF {\n\n static parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let data = {};\n\n try {\n let name = AMF.parseValue(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n\n data[name.data] = value.data;\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return data;\n }\n\n static parseObject(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 3) {\n throw new IllegalStateException('Data not enough when parse ScriptDataObject');\n }\n let name = AMF.parseString(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n let isObjectEnd = value.objectEnd;\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n objectEnd: isObjectEnd\n };\n }\n\n static parseVariable(arrayBuffer, dataOffset, dataSize) {\n return AMF.parseObject(arrayBuffer, dataOffset, dataSize);\n }\n\n static parseString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 2) {\n throw new IllegalStateException('Data not enough when parse String');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint16(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 2, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 2 + length\n };\n }\n\n static parseLongString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 4) {\n throw new IllegalStateException('Data not enough when parse LongString');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint32(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 4, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 4 + length\n };\n }\n\n static parseDate(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 10) {\n throw new IllegalStateException('Data size invalid when parse Date');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let timestamp = v.getFloat64(0, !le);\n let localTimeOffset = v.getInt16(8, !le);\n timestamp += localTimeOffset * 60 * 1000; // get UTC time\n\n return {\n data: new Date(timestamp),\n size: 8 + 2\n };\n }\n\n static parseValue(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 1) {\n throw new IllegalStateException('Data not enough when parse Value');\n }\n\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let offset = 1;\n let type = v.getUint8(0);\n let value;\n let objectEnd = false;\n\n try {\n switch (type) {\n case 0: // Number(Double) type\n value = v.getFloat64(1, !le);\n offset += 8;\n break;\n case 1: { // Boolean type\n let b = v.getUint8(1);\n value = b ? true : false;\n offset += 1;\n break;\n }\n case 2: { // String type\n let amfstr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfstr.data;\n offset += amfstr.size;\n break;\n }\n case 3: { // Object(s) type\n value = {};\n let terminal = 0; // workaround for malformed Objects which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n let amfobj = AMF.parseObject(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfobj.objectEnd)\n break;\n value[amfobj.data.name] = amfobj.data.value;\n offset += amfobj.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 8: { // ECMA array type (Mixed array)\n value = {};\n offset += 4; // ECMAArrayLength(UI32)\n let terminal = 0; // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n let amfvar = AMF.parseVariable(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfvar.objectEnd)\n break;\n value[amfvar.data.name] = amfvar.data.value;\n offset += amfvar.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 9: // ScriptDataObjectEnd\n value = undefined;\n offset = 1;\n objectEnd = true;\n break;\n case 10: { // Strict array type\n // ScriptDataValue[n]. NOTE: according to video_file_format_spec_v10_1.pdf\n value = [];\n let strictArrayLength = v.getUint32(1, !le);\n offset += 4;\n for (let i = 0; i < strictArrayLength; i++) {\n let val = AMF.parseValue(arrayBuffer, dataOffset + offset, dataSize - offset);\n value.push(val.data);\n offset += val.size;\n }\n break;\n }\n case 11: { // Date type\n let date = AMF.parseDate(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = date.data;\n offset += date.size;\n break;\n }\n case 12: { // Long string type\n let amfLongStr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfLongStr.data;\n offset += amfLongStr.size;\n break;\n }\n default:\n // ignore and skip\n offset = dataSize;\n Log.w('AMF', 'Unsupported AMF value type ' + type);\n }\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return {\n data: value,\n size: offset,\n objectEnd: objectEnd\n };\n }\n\n}\n\nexport default AMF;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n// Exponential-Golomb buffer decoder\nclass ExpGolomb {\n\n constructor(uint8array) {\n this.TAG = 'ExpGolomb';\n\n this._buffer = uint8array;\n this._buffer_index = 0;\n this._total_bytes = uint8array.byteLength;\n this._total_bits = uint8array.byteLength * 8;\n this._current_word = 0;\n this._current_word_bits_left = 0;\n }\n\n destroy() {\n this._buffer = null;\n }\n\n _fillCurrentWord() {\n let buffer_bytes_left = this._total_bytes - this._buffer_index;\n if (buffer_bytes_left <= 0)\n throw new IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available');\n\n let bytes_read = Math.min(4, buffer_bytes_left);\n let word = new Uint8Array(4);\n word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));\n this._current_word = new DataView(word.buffer).getUint32(0, false);\n\n this._buffer_index += bytes_read;\n this._current_word_bits_left = bytes_read * 8;\n }\n\n readBits(bits) {\n if (bits > 32)\n throw new InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!');\n\n if (bits <= this._current_word_bits_left) {\n let result = this._current_word >>> (32 - bits);\n this._current_word <<= bits;\n this._current_word_bits_left -= bits;\n return result;\n }\n\n let result = this._current_word_bits_left ? this._current_word : 0;\n result = result >>> (32 - this._current_word_bits_left);\n let bits_need_left = bits - this._current_word_bits_left;\n\n this._fillCurrentWord();\n let bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);\n\n let result2 = this._current_word >>> (32 - bits_read_next);\n this._current_word <<= bits_read_next;\n this._current_word_bits_left -= bits_read_next;\n\n result = (result << bits_read_next) | result2;\n return result;\n }\n\n readBool() {\n return this.readBits(1) === 1;\n }\n\n readByte() {\n return this.readBits(8);\n }\n\n _skipLeadingZero() {\n let zero_count;\n for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {\n if (0 !== (this._current_word & (0x80000000 >>> zero_count))) {\n this._current_word <<= zero_count;\n this._current_word_bits_left -= zero_count;\n return zero_count;\n }\n }\n this._fillCurrentWord();\n return zero_count + this._skipLeadingZero();\n }\n\n readUEG() { // unsigned exponential golomb\n let leading_zeros = this._skipLeadingZero();\n return this.readBits(leading_zeros + 1) - 1;\n }\n\n readSEG() { // signed exponential golomb\n let value = this.readUEG();\n if (value & 0x01) {\n return (value + 1) >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n\n}\n\nexport default ExpGolomb;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExpGolomb from './exp-golomb.js';\n\nclass SPSParser {\n\n static _ebsp2rbsp(uint8array) {\n let src = uint8array;\n let src_length = src.byteLength;\n let dst = new Uint8Array(src_length);\n let dst_idx = 0;\n\n for (let i = 0; i < src_length; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dst_idx] = src[i];\n dst_idx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dst_idx);\n }\n\n static parseSPS(uint8array) {\n let codec_array = uint8array.subarray(1, 4);\n let codec_mimetype = 'avc1.';\n for (let j = 0; j < 3; j++) {\n let h = codec_array[j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codec_mimetype += h;\n }\n\n let rbsp = SPSParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n gb.readByte();\n let profile_idc = gb.readByte(); // profile_idc\n gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]\n let level_idc = gb.readByte(); // level_idc\n gb.readUEG(); // seq_parameter_set_id\n\n let profile_string = SPSParser.getProfileString(profile_idc);\n let level_string = SPSParser.getLevelString(level_idc);\n let chroma_format_idc = 1;\n let chroma_format = 420;\n let chroma_format_table = [0, 420, 422, 444];\n let bit_depth_luma = 8;\n let bit_depth_chroma = 8;\n\n if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 ||\n profile_idc === 244 || profile_idc === 44 || profile_idc === 83 ||\n profile_idc === 86 || profile_idc === 118 || profile_idc === 128 ||\n profile_idc === 138 || profile_idc === 144) {\n\n chroma_format_idc = gb.readUEG();\n if (chroma_format_idc === 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n if (chroma_format_idc <= 3) {\n chroma_format = chroma_format_table[chroma_format_idc];\n }\n\n bit_depth_luma = gb.readUEG() + 8; // bit_depth_luma_minus8\n bit_depth_chroma = gb.readUEG() + 8; // bit_depth_chroma_minus8\n gb.readBits(1); // qpprime_y_zero_transform_bypass_flag\n if (gb.readBool()) { // seq_scaling_matrix_present_flag\n let scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12;\n for (let i = 0; i < scaling_list_count; i++) {\n if (gb.readBool()) { // seq_scaling_list_present_flag\n if (i < 6) {\n SPSParser._skipScalingList(gb, 16);\n } else {\n SPSParser._skipScalingList(gb, 64);\n }\n }\n }\n }\n }\n gb.readUEG(); // log2_max_frame_num_minus4\n let pic_order_cnt_type = gb.readUEG();\n if (pic_order_cnt_type === 0) {\n gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4\n } else if (pic_order_cnt_type === 1) {\n gb.readBits(1); // delta_pic_order_always_zero_flag\n gb.readSEG(); // offset_for_non_ref_pic\n gb.readSEG(); // offset_for_top_to_bottom_field\n let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();\n for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {\n gb.readSEG(); // offset_for_ref_frame\n }\n }\n let ref_frames = gb.readUEG(); // max_num_ref_frames\n gb.readBits(1); // gaps_in_frame_num_value_allowed_flag\n\n let pic_width_in_mbs_minus1 = gb.readUEG();\n let pic_height_in_map_units_minus1 = gb.readUEG();\n\n let frame_mbs_only_flag = gb.readBits(1);\n if (frame_mbs_only_flag === 0) {\n gb.readBits(1); // mb_adaptive_frame_field_flag\n }\n gb.readBits(1); // direct_8x8_inference_flag\n\n let frame_crop_left_offset = 0;\n let frame_crop_right_offset = 0;\n let frame_crop_top_offset = 0;\n let frame_crop_bottom_offset = 0;\n\n let frame_cropping_flag = gb.readBool();\n if (frame_cropping_flag) {\n frame_crop_left_offset = gb.readUEG();\n frame_crop_right_offset = gb.readUEG();\n frame_crop_top_offset = gb.readUEG();\n frame_crop_bottom_offset = gb.readUEG();\n }\n\n let sar_width = 1, sar_height = 1;\n let fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0;\n\n let vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n if (gb.readBool()) { // aspect_ratio_info_present_flag\n let aspect_ratio_idc = gb.readByte();\n let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n sar_width = sar_w_table[aspect_ratio_idc - 1];\n sar_height = sar_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n sar_width = gb.readByte() << 8 | gb.readByte();\n sar_height = gb.readByte() << 8 | gb.readByte();\n }\n }\n\n if (gb.readBool()) { // overscan_info_present_flag\n gb.readBool(); // overscan_appropriate_flag\n }\n if (gb.readBool()) { // video_signal_type_present_flag\n gb.readBits(4); // video_format & video_full_range_flag\n if (gb.readBool()) { // colour_description_present_flag\n gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients\n }\n }\n if (gb.readBool()) { // chroma_loc_info_present_flag\n gb.readUEG(); // chroma_sample_loc_type_top_field\n gb.readUEG(); // chroma_sample_loc_type_bottom_field\n }\n if (gb.readBool()) { // timing_info_present_flag\n let num_units_in_tick = gb.readBits(32);\n let time_scale = gb.readBits(32);\n fps_fixed = gb.readBool(); // fixed_frame_rate_flag\n\n fps_num = time_scale;\n fps_den = num_units_in_tick * 2;\n fps = fps_num / fps_den;\n }\n }\n\n let sarScale = 1;\n if (sar_width !== 1 || sar_height !== 1) {\n sarScale = sar_width / sar_height;\n }\n\n let crop_unit_x = 0, crop_unit_y = 0;\n if (chroma_format_idc === 0) {\n crop_unit_x = 1;\n crop_unit_y = 2 - frame_mbs_only_flag;\n } else {\n let sub_wc = (chroma_format_idc === 3) ? 1 : 2;\n let sub_hc = (chroma_format_idc === 1) ? 2 : 1;\n crop_unit_x = sub_wc;\n crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);\n }\n\n let codec_width = (pic_width_in_mbs_minus1 + 1) * 16;\n let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);\n\n codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;\n codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;\n\n let present_width = Math.ceil(codec_width * sarScale);\n\n gb.destroy();\n gb = null;\n\n return {\n codec_mimetype,\n profile_idc,\n level_idc,\n profile_string, // baseline, high, high10, ...\n level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...\n chroma_format_idc,\n bit_depth: bit_depth_luma, // 8bit, 10bit, ...\n bit_depth_luma,\n bit_depth_chroma,\n ref_frames,\n chroma_format, // 4:2:0, 4:2:2, ...\n chroma_format_string: SPSParser.getChromaFormatString(chroma_format),\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps,\n fps_den: fps_den,\n fps_num: fps_num\n },\n\n sar_ratio: {\n width: sar_width,\n height: sar_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: present_width,\n height: codec_height\n }\n };\n }\n\n static _skipScalingList(gb, count) {\n let last_scale = 8, next_scale = 8;\n let delta_scale = 0;\n for (let i = 0; i < count; i++) {\n if (next_scale !== 0) {\n delta_scale = gb.readSEG();\n next_scale = (last_scale + delta_scale + 256) % 256;\n }\n last_scale = (next_scale === 0) ? last_scale : next_scale;\n }\n }\n\n static getProfileString(profile_idc) {\n switch (profile_idc) {\n case 66:\n return 'Baseline';\n case 77:\n return 'Main';\n case 88:\n return 'Extended';\n case 100:\n return 'High';\n case 110:\n return 'High10';\n case 122:\n return 'High422';\n case 244:\n return 'High444';\n default:\n return 'Unknown';\n }\n }\n\n static getLevelString(level_idc) {\n return (level_idc / 10).toFixed(1);\n }\n\n static getChromaFormatString(chroma) {\n switch (chroma) {\n case 420:\n return '4:2:0';\n case 422:\n return '4:2:2';\n case 444:\n return '4:4:4';\n default:\n return 'Unknown';\n }\n }\n\n}\n\nexport default SPSParser;","/*\n * Copyright (C) 2022 もにょてっく. All Rights Reserved.\n *\n * @author もにょ〜ん \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExpGolomb from './exp-golomb.js';\n\nclass H265NaluParser {\n\n static _ebsp2rbsp(uint8array) {\n let src = uint8array;\n let src_length = src.byteLength;\n let dst = new Uint8Array(src_length);\n let dst_idx = 0;\n\n for (let i = 0; i < src_length; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dst_idx] = src[i];\n dst_idx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dst_idx);\n }\n\n static parseVPS(uint8array) {\n let rbsp = H265NaluParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n /* remove NALu Header */\n gb.readByte();\n gb.readByte();\n\n // VPS\n let video_parameter_set_id = gb.readBits(4);\n gb.readBits(2);\n let max_layers_minus1 = gb.readBits(6);\n let max_sub_layers_minus1 = gb.readBits(3);\n let temporal_id_nesting_flag = gb.readBool();\n // and more ...\n\n return {\n num_temporal_layers: max_sub_layers_minus1 + 1,\n temporal_id_nested: temporal_id_nesting_flag\n }\n }\n\n static parseSPS(uint8array) {\n let rbsp = H265NaluParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n /* remove NALu Header */\n gb.readByte();\n gb.readByte();\n\n let left_offset = 0, right_offset = 0, top_offset = 0, bottom_offset = 0;\n\n // SPS\n let video_paramter_set_id = gb.readBits(4);\n let max_sub_layers_minus1 = gb.readBits(3);\n let temporal_id_nesting_flag = gb.readBool();\n\n // profile_tier_level begin\n let general_profile_space = gb.readBits(2);\n let general_tier_flag = gb.readBool();\n let general_profile_idc = gb.readBits(5);\n let general_profile_compatibility_flags_1 = gb.readByte();\n let general_profile_compatibility_flags_2 = gb.readByte();\n let general_profile_compatibility_flags_3 = gb.readByte();\n let general_profile_compatibility_flags_4 = gb.readByte();\n let general_constraint_indicator_flags_1 = gb.readByte();\n let general_constraint_indicator_flags_2 = gb.readByte();\n let general_constraint_indicator_flags_3 = gb.readByte();\n let general_constraint_indicator_flags_4 = gb.readByte();\n let general_constraint_indicator_flags_5 = gb.readByte();\n let general_constraint_indicator_flags_6 = gb.readByte();\n let general_level_idc = gb.readByte();\n let sub_layer_profile_present_flag = [];\n let sub_layer_level_present_flag = [];\n for (let i = 0; i < max_sub_layers_minus1; i++) {\n sub_layer_profile_present_flag.push(gb.readBool());\n sub_layer_level_present_flag.push(gb.readBool());\n }\n if (max_sub_layers_minus1 > 0) {\n for (let i = max_sub_layers_minus1; i < 8; i++) { gb.readBits(2); }\n }\n for (let i = 0; i < max_sub_layers_minus1; i++) {\n if (sub_layer_profile_present_flag[i]) {\n gb.readByte(); // sub_layer_profile_space, sub_layer_tier_flag, sub_layer_profile_idc\n gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte(); // sub_layer_profile_compatibility_flag\n gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte();\n }\n if (sub_layer_level_present_flag[i]) {\n gb.readByte();\n }\n }\n // profile_tier_level end\n\n let seq_parameter_set_id = gb.readUEG();\n let chroma_format_idc = gb.readUEG();\n if (chroma_format_idc == 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n let pic_width_in_luma_samples = gb.readUEG();\n let pic_height_in_luma_samples = gb.readUEG();\n let conformance_window_flag = gb.readBool();\n if (conformance_window_flag) {\n left_offset += gb.readUEG();\n right_offset += gb.readUEG();\n top_offset += gb.readUEG();\n bottom_offset += gb.readUEG();\n }\n let bit_depth_luma_minus8 = gb.readUEG();\n let bit_depth_chroma_minus8 = gb.readUEG();\n let log2_max_pic_order_cnt_lsb_minus4 = gb.readUEG();\n let sub_layer_ordering_info_present_flag = gb.readBool();\n for (let i = sub_layer_ordering_info_present_flag ? 0 : max_sub_layers_minus1; i <= max_sub_layers_minus1; i++) {\n gb.readUEG(); // max_dec_pic_buffering_minus1[i]\n gb.readUEG(); // max_num_reorder_pics[i]\n gb.readUEG(); // max_latency_increase_plus1[i]\n }\n let log2_min_luma_coding_block_size_minus3 = gb.readUEG();\n let log2_diff_max_min_luma_coding_block_size = gb.readUEG();\n let log2_min_transform_block_size_minus2 = gb.readUEG();\n let log2_diff_max_min_transform_block_size = gb.readUEG();\n let max_transform_hierarchy_depth_inter = gb.readUEG();\n let max_transform_hierarchy_depth_intra = gb.readUEG();\n let scaling_list_enabled_flag = gb.readBool();\n if (scaling_list_enabled_flag) {\n let sps_scaling_list_data_present_flag = gb.readBool();\n if (sps_scaling_list_data_present_flag) {\n for (let sizeId = 0; sizeId < 4; sizeId++) {\n for(let matrixId = 0; matrixId < ((sizeId === 3) ? 2 : 6); matrixId++){\n let scaling_list_pred_mode_flag = gb.readBool();\n if (!scaling_list_pred_mode_flag) {\n gb.readUEG(); // scaling_list_pred_matrix_id_delta\n } else {\n let coefNum = Math.min(64, (1 << (4 + (sizeId << 1))));\n if (sizeId > 1) { gb.readSEG() }\n for (let i = 0; i < coefNum; i++) { gb.readSEG(); }\n }\n }\n }\n }\n }\n let amp_enabled_flag = gb.readBool();\n let sample_adaptive_offset_enabled_flag = gb.readBool();\n let pcm_enabled_flag = gb.readBool();\n if (pcm_enabled_flag) {\n gb.readByte();\n gb.readUEG();\n gb.readUEG();\n gb.readBool();\n }\n let num_short_term_ref_pic_sets = gb.readUEG();\n let num_delta_pocs = 0;\n for (let i = 0; i < num_short_term_ref_pic_sets; i++) {\n let inter_ref_pic_set_prediction_flag = false;\n if (i !== 0) { inter_ref_pic_set_prediction_flag = gb.readBool(); }\n if (inter_ref_pic_set_prediction_flag) {\n if (i === num_short_term_ref_pic_sets) { gb.readUEG(); }\n gb.readBool();\n gb.readUEG();\n let next_num_delta_pocs = 0;\n for (let j = 0; j <= num_delta_pocs; j++) {\n let used_by_curr_pic_flag = gb.readBool();\n let use_delta_flag = false;\n if (!used_by_curr_pic_flag) {\n use_delta_flag = gb.readBool();\n }\n if (used_by_curr_pic_flag || use_delta_flag) {\n next_num_delta_pocs++;\n }\n }\n num_delta_pocs = next_num_delta_pocs;\n } else {\n let num_negative_pics = gb.readUEG();\n let num_positive_pics = gb.readUEG();\n num_delta_pocs = num_negative_pics + num_positive_pics;\n for (let j = 0; j < num_negative_pics; j++) {\n gb.readUEG();\n gb.readBool();\n }\n for (let j = 0; j < num_positive_pics; j++) {\n gb.readUEG();\n gb.readBool();\n }\n }\n }\n let long_term_ref_pics_present_flag = gb.readBool();\n if (long_term_ref_pics_present_flag) {\n let num_long_term_ref_pics_sps = gb.readUEG();\n for (let i = 0; i < num_long_term_ref_pics_sps; i++) {\n for (let j = 0; j < (log2_max_pic_order_cnt_lsb_minus4 + 4); j++) { gb.readBits(1); }\n gb.readBits(1);\n }\n }\n //*\n let default_display_window_flag = false; // for calc offset\n let min_spatial_segmentation_idc = 0; // for hvcC\n let sar_width = 1, sar_height = 1;\n let fps_fixed = false, fps_den = 1, fps_num = 1;\n //*/\n let sps_temporal_mvp_enabled_flag = gb.readBool();\n let strong_intra_smoothing_enabled_flag = gb.readBool();\n let vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n let aspect_ratio_info_present_flag = gb.readBool();\n if (aspect_ratio_info_present_flag) {\n let aspect_ratio_idc = gb.readByte();\n\n let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc <= 16) {\n sar_width = sar_w_table[aspect_ratio_idc - 1];\n sar_height = sar_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n sar_width = gb.readBits(16);\n sar_height = gb.readBits(16);\n }\n }\n let overscan_info_present_flag = gb.readBool();\n if (overscan_info_present_flag) {\n gb.readBool();\n }\n let video_signal_type_present_flag = gb.readBool();\n if (video_signal_type_present_flag) {\n gb.readBits(3);\n gb.readBool();\n let colour_description_present_flag = gb.readBool();\n if (colour_description_present_flag) {\n gb.readByte();\n gb.readByte();\n gb.readByte();\n }\n }\n let chroma_loc_info_present_flag = gb.readBool();\n if (chroma_loc_info_present_flag) {\n gb.readUEG();\n gb.readUEG();\n }\n let neutral_chroma_indication_flag = gb.readBool();\n let field_seq_flag = gb.readBool();\n let frame_field_info_present_flag = gb.readBool();\n default_display_window_flag = gb.readBool();\n if (default_display_window_flag) {\n gb.readUEG();\n gb.readUEG();\n gb.readUEG();\n gb.readUEG();\n }\n let vui_timing_info_present_flag = gb.readBool();\n if (vui_timing_info_present_flag) {\n fps_den = gb.readBits(32);\n fps_num = gb.readBits(32);\n let vui_poc_proportional_to_timing_flag = gb.readBool();\n if (vui_poc_proportional_to_timing_flag) {\n gb.readUEG();\n let vui_hrd_parameters_present_flag = gb.readBool();\n if (vui_hrd_parameters_present_flag) {\n let commonInfPresentFlag = 1;\n let nal_hrd_parameters_present_flag = false;\n let vcl_hrd_parameters_present_flag = false;\n let sub_pic_hrd_params_present_flag = false;\n if (commonInfPresentFlag) {\n nal_hrd_parameters_present_flag = gb.readBool();\n vcl_hrd_parameters_present_flag = gb.readBool();\n if( nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag ){\n sub_pic_hrd_params_present_flag = gb.readBool();\n if (sub_pic_hrd_params_present_flag) {\n gb.readByte();\n gb.readBits(5);\n gb.readBool();\n gb.readBits(5);\n }\n let bit_rate_scale = gb.readBits(4);\n let cpb_size_scale = gb.readBits(4);\n if (sub_pic_hrd_params_present_flag) {\n gb.readBits(4);\n }\n gb.readBits(5);\n gb.readBits(5);\n gb.readBits(5);\n }\n }\n for (let i = 0; i <= max_sub_layers_minus1; i++) {\n let fixed_pic_rate_general_flag = gb.readBool();\n fps_fixed = fixed_pic_rate_general_flag;\n let fixed_pic_rate_within_cvs_flag = false;\n let cpbCnt = 1;\n if (!fixed_pic_rate_general_flag) {\n fixed_pic_rate_within_cvs_flag = gb.readBool();\n }\n let low_delay_hrd_flag = false;\n if (fixed_pic_rate_within_cvs_flag) {\n gb.readSEG();\n } else {\n low_delay_hrd_flag = gb.readBool();\n }\n if (!low_delay_hrd_flag) {\n cpbCnt = gb.readUEG() + 1;\n }\n if (nal_hrd_parameters_present_flag) {\n for (let j = 0; j < cpbCnt; j++) {\n gb.readUEG(); gb.readUEG();\n if (sub_pic_hrd_params_present_flag) {\n gb.readUEG(); gb.readUEG();\n }\n }\n }\n if (vcl_hrd_parameters_present_flag) {\n for (let j = 0; j < cpbCnt; j++) {\n gb.readUEG(); gb.readUEG();\n if (sub_pic_hrd_params_present_flag) {\n gb.readUEG(); gb.readUEG();\n }\n }\n }\n }\n }\n }\n }\n let bitstream_restriction_flag = gb.readBool();\n if (bitstream_restriction_flag) {\n let tiles_fixed_structure_flag = gb.readBool()\n let motion_vectors_over_pic_boundaries_flag = gb.readBool()\n let restricted_ref_pic_lists_flag = gb.readBool();\n min_spatial_segmentation_idc = gb.readUEG();\n let max_bytes_per_pic_denom = gb.readUEG();\n let max_bits_per_min_cu_denom = gb.readUEG();\n let log2_max_mv_length_horizontal = gb.readUEG();\n let log2_max_mv_length_vertical = gb.readUEG();\n }\n }\n let sps_extension_flag = gb.readBool(); // ignore...\n\n // for meta data\n let codec_mimetype = `hvc1.${general_profile_idc}.1.L${general_level_idc}.B0`;\n\n let sub_wc = (chroma_format_idc === 1 || chroma_format_idc === 2) ? 2 : 1;\n let sub_hc = (chroma_format_idc === 1) ? 2 : 1;\n let codec_width = pic_width_in_luma_samples - (left_offset + right_offset) * sub_wc;\n let codec_height = pic_height_in_luma_samples - (top_offset + bottom_offset) * sub_hc;\n let sar_scale = 1;\n if (sar_width !== 1 && sar_height !== 1) {\n sar_scale = sar_width / sar_height;\n }\n\n gb.destroy();\n gb = null;\n\n return {\n codec_mimetype,\n level_string: H265NaluParser.getLevelString(general_level_idc),\n profile_idc: general_profile_idc,\n bit_depth: bit_depth_luma_minus8 + 8,\n ref_frames: 1, // FIXME!!!\n chroma_format: chroma_format_idc,\n chroma_format_string: H265NaluParser.getChromaFormatString(chroma_format_idc),\n\n general_level_idc,\n general_profile_space,\n general_tier_flag,\n general_profile_idc,\n general_profile_compatibility_flags_1,\n general_profile_compatibility_flags_2,\n general_profile_compatibility_flags_3,\n general_profile_compatibility_flags_4,\n general_constraint_indicator_flags_1,\n general_constraint_indicator_flags_2,\n general_constraint_indicator_flags_3,\n general_constraint_indicator_flags_4,\n general_constraint_indicator_flags_5,\n general_constraint_indicator_flags_6,\n min_spatial_segmentation_idc,\n constant_frame_rate: 0 /* FIXME!! fps_fixed ? 1 : 0? */,\n chroma_format_idc,\n bit_depth_luma_minus8,\n bit_depth_chroma_minus8,\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps_num / fps_den,\n fps_den: fps_den,\n fps_num: fps_num,\n },\n\n sar_ratio: {\n width: sar_width,\n height: sar_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: codec_width * sar_scale,\n height: codec_height\n }\n };\n }\n\n static parsePPS(uint8array) {\n let rbsp = H265NaluParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n /* remove NALu Header */\n gb.readByte();\n gb.readByte();\n\n let pic_parameter_set_id = gb.readUEG();\n let seq_parameter_set_id = gb.readUEG();\n let dependent_slice_segments_enabled_flag = gb.readBool();\n let output_flag_present_flag = gb.readBool();\n let num_extra_slice_header_bits = gb.readBits(3);\n let sign_data_hiding_enabled_flag = gb.readBool();\n let cabac_init_present_flag = gb.readBool();\n let num_ref_idx_l0_default_active_minus1 = gb.readUEG();\n let num_ref_idx_l1_default_active_minus1 = gb.readUEG();\n let init_qp_minus26 = gb.readSEG();\n let constrained_intra_pred_flag = gb.readBool();\n let transform_skip_enabled_flag = gb.readBool();\n let cu_qp_delta_enabled_flag = gb.readBool();\n if (cu_qp_delta_enabled_flag) {\n let diff_cu_qp_delta_depth = gb.readUEG();\n }\n let cb_qp_offset = gb.readSEG();\n let cr_qp_offset = gb.readSEG();\n let pps_slice_chroma_qp_offsets_present_flag = gb.readBool();\n let weighted_pred_flag = gb.readBool();\n let weighted_bipred_flag = gb.readBool();\n let transquant_bypass_enabled_flag = gb.readBool();\n let tiles_enabled_flag = gb.readBool();\n let entropy_coding_sync_enabled_flag = gb.readBool();\n // and more ...\n\n // needs hvcC\n let parallelismType = 1; // slice-based parallel decoding\n if (entropy_coding_sync_enabled_flag && tiles_enabled_flag) {\n parallelismType = 0; // mixed-type parallel decoding\n } else if (entropy_coding_sync_enabled_flag) {\n parallelismType = 3; // wavefront-based parallel decoding\n } else if (tiles_enabled_flag) {\n parallelismType = 2; // tile-based parallel decoding\n }\n\n return {\n parallelismType\n }\n }\n\n static getChromaFormatString(chroma_idc) {\n switch (chroma_idc) {\n case 0: return '4:0:0';\n case 1: return '4:2:0';\n case 2: return '4:2:2';\n case 3: return '4:4:4';\n default: return 'Unknown';\n }\n }\n\n static getProfileString(profile_idc) {\n switch (profile_idc) {\n case 1: return 'Main';\n case 2: return 'Main10';\n case 3: return 'MainSP';\n case 4: return 'Rext';\n case 9: return 'SCC';\n default: return 'Unknown';\n }\n }\n\n static getLevelString(level_idc) {\n return (level_idc / 30).toFixed(1);\n }\n}\n\nexport default H265NaluParser;\n","/*\n * Copyright (C) 2022 magicxqq. All Rights Reserved.\n *\n * @author magicxqq \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction isAligned16(a: Uint8Array) : boolean {\n return a.byteOffset % 2 === 0 && a.byteLength % 2 === 0;\n}\n\nfunction isAligned32(a: Uint8Array) : boolean {\n return a.byteOffset % 4 === 0 && a.byteLength % 4 === 0;\n}\n\nfunction compareArray(a: Uint8Array | Uint16Array | Uint32Array,\n b: Uint8Array | Uint16Array | Uint32Array): boolean {\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction equal8(a: Uint8Array, b: Uint8Array) : boolean {\n return compareArray(a, b);\n}\n\nfunction equal16(a: Uint8Array, b: Uint8Array) : boolean {\n let a16 = new Uint16Array(a.buffer, a.byteOffset, a.byteLength / 2);\n let b16 = new Uint16Array(b.buffer, b.byteOffset, b.byteLength / 2);\n return compareArray(a16, b16);\n}\n\nfunction equal32(a: Uint8Array, b: Uint8Array) : boolean {\n let a32 = new Uint32Array(a.buffer, a.byteOffset, a.byteLength / 4);\n let b32 = new Uint32Array(b.buffer, b.byteOffset, b.byteLength / 4);\n return compareArray(a32, b32);\n}\n\nfunction buffersAreEqual(a: Uint8Array, b: Uint8Array) : boolean {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n\n if (isAligned32(a) && isAligned32(b)) {\n return equal32(a, b);\n }\n\n if (isAligned16(a) && isAligned16(b)) {\n return equal16(a, b);\n }\n\n return equal8(a, b);\n}\n\nexport default buffersAreEqual;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport AMF from './amf-parser.js';\nimport SPSParser from './sps-parser.js';\nimport DemuxErrors from './demux-errors.js';\nimport MediaInfo from '../core/media-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\nimport H265Parser from './h265-parser.js';\nimport buffersAreEqual from '../utils/typedarray-equality.ts';\n\nfunction Swap16(src) {\n return (((src >>> 8) & 0xFF) |\n ((src & 0xFF) << 8));\n}\n\nfunction Swap32(src) {\n return (((src & 0xFF000000) >>> 24) |\n ((src & 0x00FF0000) >>> 8) |\n ((src & 0x0000FF00) << 8) |\n ((src & 0x000000FF) << 24));\n}\n\nfunction ReadBig32(array, index) {\n return ((array[index] << 24) |\n (array[index + 1] << 16) |\n (array[index + 2] << 8) |\n (array[index + 3]));\n}\n\n\nclass FLVDemuxer {\n\n constructor(probeData, config) {\n this.TAG = 'FLVDemuxer';\n\n this._config = config;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onMetaDataArrived = null;\n this._onScriptDataArrived = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n\n this._dataOffset = probeData.dataOffset;\n this._firstParse = true;\n this._dispatch = false;\n\n this._hasAudio = probeData.hasAudioTrack;\n this._hasVideo = probeData.hasVideoTrack;\n\n this._hasAudioFlagOverrided = false;\n this._hasVideoFlagOverrided = false;\n\n this._audioInitialMetadataDispatched = false;\n this._videoInitialMetadataDispatched = false;\n\n this._mediaInfo = new MediaInfo();\n this._mediaInfo.hasAudio = this._hasAudio;\n this._mediaInfo.hasVideo = this._hasVideo;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n\n this._naluLengthSize = 4;\n this._timestampBase = 0; // int32, in milliseconds\n this._timescale = 1000;\n this._duration = 0; // int32, in milliseconds\n this._durationOverrided = false;\n this._referenceFrameRate = {\n fixed: true,\n fps: 23.976,\n fps_num: 23976,\n fps_den: 1000\n };\n\n this._flvSoundRateTable = [5500, 11025, 22050, 44100, 48000];\n\n this._mpegSamplingRates = [\n 96000, 88200, 64000, 48000, 44100, 32000,\n 24000, 22050, 16000, 12000, 11025, 8000, 7350\n ];\n\n this._mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0];\n this._mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0];\n this._mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0];\n\n this._mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1];\n this._mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1];\n this._mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];\n\n this._videoTrack = {type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0};\n this._audioTrack = {type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0};\n\n this._littleEndian = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n })();\n }\n\n destroy() {\n this._mediaInfo = null;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n this._videoTrack = null;\n this._audioTrack = null;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onMetaDataArrived = null;\n this._onScriptDataArrived = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n }\n\n static probe(buffer) {\n let data = new Uint8Array(buffer);\n if (data.byteLength < 9) {\n return {needMoreData: true};\n }\n\n let mismatch = {match: false};\n\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return mismatch;\n }\n\n let hasAudio = ((data[4] & 4) >>> 2) !== 0;\n let hasVideo = (data[4] & 1) !== 0;\n\n let offset = ReadBig32(data, 5);\n\n if (offset < 9) {\n return mismatch;\n }\n\n return {\n match: true,\n consumed: offset,\n dataOffset: offset,\n hasAudioTrack: hasAudio,\n hasVideoTrack: hasVideo\n };\n }\n\n bindDataSource(loader) {\n loader.onDataArrival = this.parseChunks.bind(this);\n return this;\n }\n\n // prototype: function(type: string, metadata: any): void\n get onTrackMetadata() {\n return this._onTrackMetadata;\n }\n\n set onTrackMetadata(callback) {\n this._onTrackMetadata = callback;\n }\n\n // prototype: function(mediaInfo: MediaInfo): void\n get onMediaInfo() {\n return this._onMediaInfo;\n }\n\n set onMediaInfo(callback) {\n this._onMediaInfo = callback;\n }\n\n get onMetaDataArrived() {\n return this._onMetaDataArrived;\n }\n\n set onMetaDataArrived(callback) {\n this._onMetaDataArrived = callback;\n }\n\n get onScriptDataArrived() {\n return this._onScriptDataArrived;\n }\n\n set onScriptDataArrived(callback) {\n this._onScriptDataArrived = callback;\n }\n\n // prototype: function(type: number, info: string): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n // prototype: function(videoTrack: any, audioTrack: any): void\n get onDataAvailable() {\n return this._onDataAvailable;\n }\n\n set onDataAvailable(callback) {\n this._onDataAvailable = callback;\n }\n\n // timestamp base for output samples, must be in milliseconds\n get timestampBase() {\n return this._timestampBase;\n }\n\n set timestampBase(base) {\n this._timestampBase = base;\n }\n\n get overridedDuration() {\n return this._duration;\n }\n\n // Force-override media duration. Must be in milliseconds, int32\n set overridedDuration(duration) {\n this._durationOverrided = true;\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n\n // Force-override audio track present flag, boolean\n set overridedHasAudio(hasAudio) {\n this._hasAudioFlagOverrided = true;\n this._hasAudio = hasAudio;\n this._mediaInfo.hasAudio = hasAudio;\n }\n\n // Force-override video track present flag, boolean\n set overridedHasVideo(hasVideo) {\n this._hasVideoFlagOverrided = true;\n this._hasVideo = hasVideo;\n this._mediaInfo.hasVideo = hasVideo;\n }\n\n resetMediaInfo() {\n this._mediaInfo = new MediaInfo();\n }\n\n _isInitialMetadataDispatched() {\n if (this._hasAudio && this._hasVideo) { // both audio & video\n return this._audioInitialMetadataDispatched && this._videoInitialMetadataDispatched;\n }\n if (this._hasAudio && !this._hasVideo) { // audio only\n return this._audioInitialMetadataDispatched;\n }\n if (!this._hasAudio && this._hasVideo) { // video only\n return this._videoInitialMetadataDispatched;\n }\n return false;\n }\n\n // function parseChunks(chunk: ArrayBuffer, byteStart: number): number;\n parseChunks(chunk, byteStart) {\n if (!this._onError || !this._onMediaInfo || !this._onTrackMetadata || !this._onDataAvailable) {\n throw new IllegalStateException('Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified');\n }\n\n let offset = 0;\n let le = this._littleEndian;\n\n if (byteStart === 0) { // buffer with FLV header\n if (chunk.byteLength > 13) {\n let probeData = FLVDemuxer.probe(chunk);\n offset = probeData.dataOffset;\n } else {\n return 0;\n }\n }\n\n if (this._firstParse) { // handle PreviousTagSize0 before Tag1\n this._firstParse = false;\n if (byteStart + offset !== this._dataOffset) {\n Log.w(this.TAG, 'First time parsing but chunk byteStart invalid!');\n }\n\n let v = new DataView(chunk, offset);\n let prevTagSize0 = v.getUint32(0, !le);\n if (prevTagSize0 !== 0) {\n Log.w(this.TAG, 'PrevTagSize0 !== 0 !!!');\n }\n offset += 4;\n }\n\n while (offset < chunk.byteLength) {\n this._dispatch = true;\n\n let v = new DataView(chunk, offset);\n\n if (offset + 11 + 4 > chunk.byteLength) {\n // data not enough for parsing an flv tag\n break;\n }\n\n let tagType = v.getUint8(0);\n let dataSize = v.getUint32(0, !le) & 0x00FFFFFF;\n\n if (offset + 11 + dataSize + 4 > chunk.byteLength) {\n // data not enough for parsing actual data body\n break;\n }\n\n if (tagType !== 8 && tagType !== 9 && tagType !== 18) {\n Log.w(this.TAG, `Unsupported tag type ${tagType}, skipped`);\n // consume the whole tag (skip it)\n offset += 11 + dataSize + 4;\n continue;\n }\n\n let ts2 = v.getUint8(4);\n let ts1 = v.getUint8(5);\n let ts0 = v.getUint8(6);\n let ts3 = v.getUint8(7);\n\n let timestamp = ts0 | (ts1 << 8) | (ts2 << 16) | (ts3 << 24);\n\n let streamId = v.getUint32(7, !le) & 0x00FFFFFF;\n if (streamId !== 0) {\n Log.w(this.TAG, 'Meet tag which has StreamID != 0!');\n }\n\n let dataOffset = offset + 11;\n\n switch (tagType) {\n case 8: // Audio\n this._parseAudioData(chunk, dataOffset, dataSize, timestamp);\n break;\n case 9: // Video\n this._parseVideoData(chunk, dataOffset, dataSize, timestamp, byteStart + offset);\n break;\n case 18: // ScriptDataObject\n this._parseScriptData(chunk, dataOffset, dataSize);\n break;\n }\n\n let prevTagSize = v.getUint32(11 + dataSize, !le);\n if (prevTagSize !== 11 + dataSize) {\n Log.w(this.TAG, `Invalid PrevTagSize ${prevTagSize}`);\n }\n\n offset += 11 + dataSize + 4; // tagBody + dataSize + prevTagSize\n }\n\n // dispatch parsed frames to consumer (typically, the remuxer)\n if (this._isInitialMetadataDispatched()) {\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n }\n\n return offset; // consumed bytes, just equals latest offset index\n }\n\n _parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let scriptData = AMF.parseScriptData(arrayBuffer, dataOffset, dataSize);\n\n if (scriptData.hasOwnProperty('onMetaData')) {\n if (scriptData.onMetaData == null || typeof scriptData.onMetaData !== 'object') {\n Log.w(this.TAG, 'Invalid onMetaData structure!');\n return;\n }\n if (this._metadata) {\n Log.w(this.TAG, 'Found another onMetaData tag!');\n }\n this._metadata = scriptData;\n let onMetaData = this._metadata.onMetaData;\n\n if (this._onMetaDataArrived) {\n this._onMetaDataArrived(Object.assign({}, onMetaData));\n }\n\n if (typeof onMetaData.hasAudio === 'boolean') { // hasAudio\n if (this._hasAudioFlagOverrided === false) {\n this._hasAudio = onMetaData.hasAudio;\n this._mediaInfo.hasAudio = this._hasAudio;\n }\n }\n if (typeof onMetaData.hasVideo === 'boolean') { // hasVideo\n if (this._hasVideoFlagOverrided === false) {\n this._hasVideo = onMetaData.hasVideo;\n this._mediaInfo.hasVideo = this._hasVideo;\n }\n }\n if (typeof onMetaData.audiodatarate === 'number') { // audiodatarate\n this._mediaInfo.audioDataRate = onMetaData.audiodatarate;\n }\n if (typeof onMetaData.videodatarate === 'number') { // videodatarate\n this._mediaInfo.videoDataRate = onMetaData.videodatarate;\n }\n if (typeof onMetaData.width === 'number') { // width\n this._mediaInfo.width = onMetaData.width;\n }\n if (typeof onMetaData.height === 'number') { // height\n this._mediaInfo.height = onMetaData.height;\n }\n if (typeof onMetaData.duration === 'number') { // duration\n if (!this._durationOverrided) {\n let duration = Math.floor(onMetaData.duration * this._timescale);\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n } else {\n this._mediaInfo.duration = 0;\n }\n if (typeof onMetaData.framerate === 'number') { // framerate\n let fps_num = Math.floor(onMetaData.framerate * 1000);\n if (fps_num > 0) {\n let fps = fps_num / 1000;\n this._referenceFrameRate.fixed = true;\n this._referenceFrameRate.fps = fps;\n this._referenceFrameRate.fps_num = fps_num;\n this._referenceFrameRate.fps_den = 1000;\n this._mediaInfo.fps = fps;\n }\n }\n if (typeof onMetaData.keyframes === 'object') { // keyframes\n this._mediaInfo.hasKeyframesIndex = true;\n let keyframes = onMetaData.keyframes;\n this._mediaInfo.keyframesIndex = this._parseKeyframesIndex(keyframes);\n onMetaData.keyframes = null; // keyframes has been extracted, remove it\n } else {\n this._mediaInfo.hasKeyframesIndex = false;\n }\n this._dispatch = false;\n this._mediaInfo.metadata = onMetaData;\n Log.v(this.TAG, 'Parsed onMetaData');\n if (this._mediaInfo.isComplete()) {\n this._onMediaInfo(this._mediaInfo);\n }\n }\n\n if (Object.keys(scriptData).length > 0) {\n if (this._onScriptDataArrived) {\n this._onScriptDataArrived(Object.assign({}, scriptData));\n }\n }\n }\n\n _parseKeyframesIndex(keyframes) {\n let times = [];\n let filepositions = [];\n\n // ignore first keyframe which is actually AVC/HEVC Sequence Header (AVCDecoderConfigurationRecord or HEVCDecoderConfigurationRecord)\n for (let i = 1; i < keyframes.times.length; i++) {\n let time = this._timestampBase + Math.floor(keyframes.times[i] * 1000);\n times.push(time);\n filepositions.push(keyframes.filepositions[i]);\n }\n\n return {\n times: times,\n filepositions: filepositions\n };\n }\n\n _parseAudioData(arrayBuffer, dataOffset, dataSize, tagTimestamp) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid audio packet, missing SoundData payload!');\n return;\n }\n\n if (this._hasAudioFlagOverrided === true && this._hasAudio === false) {\n // If hasAudio: false indicated explicitly in MediaDataSource,\n // Ignore all the audio packets\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let soundSpec = v.getUint8(0);\n\n let soundFormat = soundSpec >>> 4;\n if (soundFormat !== 2 && soundFormat !== 10) { // MP3 or AAC\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, 'Flv: Unsupported audio codec idx: ' + soundFormat);\n return;\n }\n\n let soundRate = 0;\n let soundRateIndex = (soundSpec & 12) >>> 2;\n if (soundRateIndex >= 0 && soundRateIndex <= 4) {\n soundRate = this._flvSoundRateTable[soundRateIndex];\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid audio sample rate idx: ' + soundRateIndex);\n return;\n }\n\n let soundSize = (soundSpec & 2) >>> 1; // unused\n let soundType = (soundSpec & 1);\n\n\n let meta = this._audioMetadata;\n let track = this._audioTrack;\n\n if (!meta) {\n if (this._hasAudio === false && this._hasAudioFlagOverrided === false) {\n this._hasAudio = true;\n this._mediaInfo.hasAudio = true;\n }\n\n // initial metadata\n meta = this._audioMetadata = {};\n meta.type = 'audio';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n meta.audioSampleRate = soundRate;\n meta.channelCount = (soundType === 0 ? 1 : 2);\n }\n\n if (soundFormat === 10) { // AAC\n let aacData = this._parseAACAudioData(arrayBuffer, dataOffset + 1, dataSize - 1);\n if (aacData == undefined) {\n return;\n }\n\n if (aacData.packetType === 0) { // AAC sequence header (AudioSpecificConfig)\n if (meta.config) {\n if (buffersAreEqual(aacData.data.config, meta.config)) {\n // If AudioSpecificConfig is not changed, ignore it to avoid generating initialization segment repeatedly\n return;\n } else {\n Log.w(this.TAG, 'AudioSpecificConfig has been changed, re-generate initialization segment');\n }\n }\n let misc = aacData.data;\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n meta.config = misc.config;\n // The decode result of an aac sample is 1024 PCM samples\n meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed AudioSpecificConfig');\n\n if (this._isInitialMetadataDispatched()) {\n // Non-initial metadata, force dispatch (or flush) parsed frames to remuxer\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._audioInitialMetadataDispatched = true;\n }\n // then notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.originalCodec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n } else if (aacData.packetType === 1) { // AAC raw frame data\n let dts = this._timestampBase + tagTimestamp;\n let aacSample = {unit: aacData.data, length: aacData.data.byteLength, dts: dts, pts: dts};\n track.samples.push(aacSample);\n track.length += aacData.data.length;\n } else {\n Log.e(this.TAG, `Flv: Unsupported AAC data type ${aacData.packetType}`);\n }\n } else if (soundFormat === 2) { // MP3\n if (!meta.codec) {\n // We need metadata for mp3 audio track, extract info from frame header\n let misc = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, true);\n if (misc == undefined) {\n return;\n }\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n // The decode result of an mp3 sample is 1152 PCM samples\n meta.refSampleDuration = 1152 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed MPEG Audio Frame Header');\n\n this._audioInitialMetadataDispatched = true;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.codec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n mi.audioDataRate = misc.bitRate;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n // This packet is always a valid audio packet, extract it\n let data = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, false);\n if (data == undefined) {\n return;\n }\n let dts = this._timestampBase + tagTimestamp;\n let mp3Sample = {unit: data, length: data.byteLength, dts: dts, pts: dts};\n track.samples.push(mp3Sample);\n track.length += data.length;\n }\n }\n\n _parseAACAudioData(arrayBuffer, dataOffset, dataSize) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid AAC packet, missing AACPacketType or/and Data!');\n return;\n }\n\n let result = {};\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n\n result.packetType = array[0];\n\n if (array[0] === 0) {\n result.data = this._parseAACAudioSpecificConfig(arrayBuffer, dataOffset + 1, dataSize - 1);\n } else {\n result.data = array.subarray(1);\n }\n\n return result;\n }\n\n _parseAACAudioSpecificConfig(arrayBuffer, dataOffset, dataSize) {\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let config = null;\n\n /* Audio Object Type:\n 0: Null\n 1: AAC Main\n 2: AAC LC\n 3: AAC SSR (Scalable Sample Rate)\n 4: AAC LTP (Long Term Prediction)\n 5: HE-AAC / SBR (Spectral Band Replication)\n 6: AAC Scalable\n */\n\n let audioObjectType = 0;\n let originalAudioObjectType = 0;\n let audioExtensionObjectType = null;\n let samplingIndex = 0;\n let extensionSamplingIndex = null;\n\n // 5 bits\n audioObjectType = originalAudioObjectType = array[0] >>> 3;\n // 4 bits\n samplingIndex = ((array[0] & 0x07) << 1) | (array[1] >>> 7);\n if (samplingIndex < 0 || samplingIndex >= this._mpegSamplingRates.length) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid sampling frequency index!');\n return;\n }\n\n let samplingFrequence = this._mpegSamplingRates[samplingIndex];\n\n // 4 bits\n let channelConfig = (array[1] & 0x78) >>> 3;\n if (channelConfig < 0 || channelConfig >= 8) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid channel configuration');\n return;\n }\n\n if (audioObjectType === 5) { // HE-AAC?\n // 4 bits\n extensionSamplingIndex = ((array[1] & 0x07) << 1) | (array[2] >>> 7);\n // 5 bits\n audioExtensionObjectType = (array[2] & 0x7C) >>> 2;\n }\n\n // workarounds for various browsers\n let userAgent = self.navigator.userAgent.toLowerCase();\n\n if (userAgent.indexOf('firefox') !== -1) {\n // firefox: use SBR (HE-AAC) if freq less than 24kHz\n if (samplingIndex >= 6) {\n audioObjectType = 5;\n config = new Array(4);\n extensionSamplingIndex = samplingIndex - 3;\n } else { // use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n } else if (userAgent.indexOf('android') !== -1) {\n // android: always use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n } else {\n // for other browsers, e.g. chrome...\n // Always use HE-AAC to make it easier to switch aac codec profile\n audioObjectType = 5;\n extensionSamplingIndex = samplingIndex;\n config = new Array(4);\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3;\n } else if (channelConfig === 1) { // Mono channel\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n }\n\n config[0] = audioObjectType << 3;\n config[0] |= (samplingIndex & 0x0F) >>> 1;\n config[1] = (samplingIndex & 0x0F) << 7;\n config[1] |= (channelConfig & 0x0F) << 3;\n if (audioObjectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0F) >>> 1);\n config[2] = (extensionSamplingIndex & 0x01) << 7;\n // extended audio object type: force to 2 (LC-AAC)\n config[2] |= (2 << 2);\n config[3] = 0;\n }\n\n return {\n config: config,\n samplingRate: samplingFrequence,\n channelCount: channelConfig,\n codec: 'mp4a.40.' + audioObjectType,\n originalCodec: 'mp4a.40.' + originalAudioObjectType\n };\n }\n\n _parseMP3AudioData(arrayBuffer, dataOffset, dataSize, requestHeader) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid MP3 packet, header missing!');\n return;\n }\n\n let le = this._littleEndian;\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let result = null;\n\n if (requestHeader) {\n if (array[0] !== 0xFF) {\n return;\n }\n let ver = (array[1] >>> 3) & 0x03;\n let layer = (array[1] & 0x06) >> 1;\n\n let bitrate_index = (array[2] & 0xF0) >>> 4;\n let sampling_freq_index = (array[2] & 0x0C) >>> 2;\n\n let channel_mode = (array[3] >>> 6) & 0x03;\n let channel_count = channel_mode !== 3 ? 2 : 1;\n\n let sample_rate = 0;\n let bit_rate = 0;\n let object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types\n\n let codec = 'mp3';\n\n switch (ver) {\n case 0: // MPEG 2.5\n sample_rate = this._mpegAudioV25SampleRateTable[sampling_freq_index];\n break;\n case 2: // MPEG 2\n sample_rate = this._mpegAudioV20SampleRateTable[sampling_freq_index];\n break;\n case 3: // MPEG 1\n sample_rate = this._mpegAudioV10SampleRateTable[sampling_freq_index];\n break;\n }\n\n switch (layer) {\n case 1: // Layer 3\n object_type = 34;\n if (bitrate_index < this._mpegAudioL3BitRateTable.length) {\n bit_rate = this._mpegAudioL3BitRateTable[bitrate_index];\n }\n break;\n case 2: // Layer 2\n object_type = 33;\n if (bitrate_index < this._mpegAudioL2BitRateTable.length) {\n bit_rate = this._mpegAudioL2BitRateTable[bitrate_index];\n }\n break;\n case 3: // Layer 1\n object_type = 32;\n if (bitrate_index < this._mpegAudioL1BitRateTable.length) {\n bit_rate = this._mpegAudioL1BitRateTable[bitrate_index];\n }\n break;\n }\n\n result = {\n bitRate: bit_rate,\n samplingRate: sample_rate,\n channelCount: channel_count,\n codec: codec,\n originalCodec: codec\n };\n } else {\n result = array;\n }\n\n return result;\n }\n\n _parseVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid video packet, missing VideoData payload!');\n return;\n }\n\n if (this._hasVideoFlagOverrided === true && this._hasVideo === false) {\n // If hasVideo: false indicated explicitly in MediaDataSource,\n // Ignore all the video packets\n return;\n }\n\n let spec = (new Uint8Array(arrayBuffer, dataOffset, dataSize))[0];\n\n let isExHeader = (spec & 0b10000000) !== 0;\n let frameType = (spec & 0b01110000) >>> 4;\n\n if (!isExHeader) {\n let codecId = spec & 0b00001111;\n if (codecId === 7) { // AVC\n this._parseAVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);\n } else if (codecId === 12) { // HEVC\n this._parseHEVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);\n } else {\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, `Flv: Unsupported codec in video frame: ${codecId}`);\n return;\n }\n } else {\n let packetType = spec & 0b00001111;\n let fourcc = String.fromCharCode(... (new Uint8Array(arrayBuffer, dataOffset, dataSize)).slice(1, 5));\n\n if (fourcc === 'hvc1') { // HEVC\n this._parseEnhancedHEVCVideoPacket(arrayBuffer, dataOffset + 5, dataSize - 5, tagTimestamp, tagPosition, frameType, packetType);\n } else {\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, `Flv: Unsupported codec in video frame: ${fourcc}`);\n return;\n }\n }\n }\n\n _parseAVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime');\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let packetType = v.getUint8(0);\n let cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;\n let cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int\n\n if (packetType === 0) { // AVCDecoderConfigurationRecord\n this._parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);\n } else if (packetType === 1) { // One or more Nalus\n this._parseAVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);\n } else if (packetType === 2) {\n // empty, AVC end of sequence\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Invalid video packet type ${packetType}`);\n return;\n }\n }\n\n _parseHEVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid HEVC packet, missing HEVCPacketType or/and CompositionTime');\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let packetType = v.getUint8(0);\n let cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;\n let cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int\n\n if (packetType === 0) { // HEVCDecoderConfigurationRecord\n this._parseHEVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);\n } else if (packetType === 1) { // One or more Nalus\n this._parseHEVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);\n } else if (packetType === 2) {\n // empty, HEVC end of sequence\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Invalid video packet type ${packetType}`);\n return;\n }\n }\n\n _parseEnhancedHEVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, packetType) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid HEVC packet, missing HEVCPacketType or/and CompositionTime');\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n if (packetType === 0) { // HEVCDecoderConfigurationRecord\n this._parseHEVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize);\n } else if (packetType === 1) { // One or more Nalus\n let cts_unsigned = v.getUint32(0, !le) & 0xFFFFFF00;\n let cts = cts_unsigned >> 8; // convert to 24-bit signed int\n\n this._parseHEVCVideoData(arrayBuffer, dataOffset + 3, dataSize - 3, tagTimestamp, tagPosition, frameType, cts);\n } else if (packetType === 3) {\n this._parseHEVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, 0);\n } else if (packetType === 2) {\n // empty, HEVC end of sequence\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Invalid video packet type ${packetType}`);\n return;\n }\n }\n\n _parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 7) {\n Log.w(this.TAG, 'Flv: Invalid AVCDecoderConfigurationRecord, lack of data!');\n return;\n }\n\n let meta = this._videoMetadata;\n let track = this._videoTrack;\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n if (!meta) {\n if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {\n this._hasVideo = true;\n this._mediaInfo.hasVideo = true;\n }\n\n meta = this._videoMetadata = {};\n meta.type = 'video';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n } else {\n if (typeof meta.avcc !== 'undefined') {\n let new_avcc = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n if (buffersAreEqual(new_avcc, meta.avcc)) {\n // AVCDecoderConfigurationRecord is not changed, ignore it to avoid initializaiton segment re-generating\n return;\n } else {\n Log.w(this.TAG, 'AVCDecoderConfigurationRecord has been changed, re-generate initialization segment');\n }\n }\n }\n\n let version = v.getUint8(0); // configurationVersion\n let avcProfile = v.getUint8(1); // avcProfileIndication\n let profileCompatibility = v.getUint8(2); // profile_compatibility\n let avcLevel = v.getUint8(3); // AVCLevelIndication\n\n if (version !== 1 || avcProfile === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');\n return;\n }\n\n this._naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne\n if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!!\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${this._naluLengthSize - 1}`);\n return;\n }\n\n let spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets\n if (spsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');\n return;\n } else if (spsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: SPS Count = ${spsCount}`);\n }\n\n let offset = 6;\n\n for (let i = 0; i < spsCount; i++) {\n let len = v.getUint16(offset, !le); // sequenceParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // Notice: Nalu without startcode header (00 00 00 01)\n let sps = new Uint8Array(arrayBuffer, dataOffset + offset, len);\n offset += len;\n\n let config = SPSParser.parseSPS(sps);\n if (i !== 0) {\n // ignore other sps's config\n continue;\n }\n\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n meta.frameRate = config.frame_rate;\n\n if (config.frame_rate.fixed === false ||\n config.frame_rate.fps_num === 0 ||\n config.frame_rate.fps_den === 0) {\n meta.frameRate = this._referenceFrameRate;\n }\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n meta.refSampleDuration = meta.timescale * (fps_den / fps_num);\n\n let codecArray = sps.subarray(1, 4);\n let codecString = 'avc1.';\n for (let j = 0; j < 3; j++) {\n let h = codecArray[j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codecString += h;\n }\n meta.codec = codecString;\n\n let mi = this._mediaInfo;\n mi.width = meta.codecWidth;\n mi.height = meta.codecHeight;\n mi.fps = meta.frameRate.fps;\n mi.profile = meta.profile;\n mi.level = meta.level;\n mi.refFrames = config.ref_frames;\n mi.chromaFormat = config.chroma_format_string;\n mi.sarNum = meta.sarRatio.width;\n mi.sarDen = meta.sarRatio.height;\n mi.videoCodec = codecString;\n\n if (mi.hasAudio) {\n if (mi.audioCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n let ppsCount = v.getUint8(offset); // numOfPictureParameterSets\n if (ppsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');\n return;\n } else if (ppsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: PPS Count = ${ppsCount}`);\n }\n\n offset++;\n\n for (let i = 0; i < ppsCount; i++) {\n let len = v.getUint16(offset, !le); // pictureParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // pps is useless for extracting video information\n offset += len;\n }\n\n meta.avcc = new Uint8Array(dataSize);\n meta.avcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);\n Log.v(this.TAG, 'Parsed AVCDecoderConfigurationRecord');\n\n if (this._isInitialMetadataDispatched()) {\n // flush parsed frames\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._videoInitialMetadataDispatched = true;\n }\n // notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('video', meta);\n }\n\n _parseHEVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 22) {\n Log.w(this.TAG, 'Flv: Invalid HEVCDecoderConfigurationRecord, lack of data!');\n return;\n }\n\n let meta = this._videoMetadata;\n let track = this._videoTrack;\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n if (!meta) {\n if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {\n this._hasVideo = true;\n this._mediaInfo.hasVideo = true;\n }\n\n meta = this._videoMetadata = {};\n meta.type = 'video';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n } else {\n if (typeof meta.hvcc !== 'undefined') {\n let new_hvcc = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n if (buffersAreEqual(new_hvcc, meta.hvcc)) {\n // HEVCDecoderConfigurationRecord not changed, ignore it to avoid initializaiton segment re-generating\n return;\n } else {\n Log.w(this.TAG, 'HEVCDecoderConfigurationRecord has been changed, re-generate initialization segment');\n }\n }\n }\n\n let version = v.getUint8(0); // configurationVersion\n let hevcProfile = v.getUint8(1) & 0x1F; // hevcProfileIndication\n\n if (version !== 1 || hevcProfile === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid HEVCDecoderConfigurationRecord');\n return;\n }\n\n this._naluLengthSize = (v.getUint8(21) & 3) + 1; // lengthSizeMinusOne\n if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!!\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${this._naluLengthSize - 1}`);\n return;\n }\n\n let numOfArrays = v.getUint8(22);\n for (let i = 0, offset = 23; i < numOfArrays; i++) {\n let nalUnitType = v.getUint8(offset + 0) & 0x3F;\n let numNalus = v.getUint16(offset + 1, !le);\n\n offset += 3;\n for (let j = 0; j < numNalus; j++) {\n let len = v.getUint16(offset + 0, !le);\n if (j !== 0) {\n offset += 2 + len;\n continue;\n }\n\n if (nalUnitType === 33) {\n offset += 2;\n let sps = new Uint8Array(arrayBuffer, dataOffset + offset, len);\n\n let config = H265Parser.parseSPS(sps);\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n meta.frameRate = config.frame_rate;\n\n if (config.frame_rate.fixed === false ||\n config.frame_rate.fps_num === 0 ||\n config.frame_rate.fps_den === 0) {\n meta.frameRate = this._referenceFrameRate;\n }\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n meta.refSampleDuration = meta.timescale * (fps_den / fps_num);\n meta.codec = config.codec_mimetype;\n\n let mi = this._mediaInfo;\n mi.width = meta.codecWidth;\n mi.height = meta.codecHeight;\n mi.fps = meta.frameRate.fps;\n mi.profile = meta.profile;\n mi.level = meta.level;\n mi.refFrames = config.ref_frames;\n mi.chromaFormat = config.chroma_format_string;\n mi.sarNum = meta.sarRatio.width;\n mi.sarDen = meta.sarRatio.height;\n mi.videoCodec = config.codec_mimetype;\n\n if (mi.hasAudio) {\n if (mi.audioCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n\n offset += len;\n } else {\n offset += 2 + len;\n }\n }\n }\n\n meta.hvcc = new Uint8Array(dataSize);\n meta.hvcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);\n Log.v(this.TAG, 'Parsed HEVCDecoderConfigurationRecord');\n\n if (this._isInitialMetadataDispatched()) {\n // flush parsed frames\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._videoInitialMetadataDispatched = true;\n }\n // notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('video', meta);\n }\n\n _parseAVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let units = [], length = 0;\n\n let offset = 0;\n const lengthSize = this._naluLengthSize;\n let dts = this._timestampBase + tagTimestamp;\n let keyframe = (frameType === 1); // from FLV Frame Type constants\n\n while (offset < dataSize) {\n if (offset + 4 >= dataSize) {\n Log.w(this.TAG, `Malformed Nalu near timestamp ${dts}, offset = ${offset}, dataSize = ${dataSize}`);\n break; // data not enough for next Nalu\n }\n // Nalu with length-header (AVC1)\n let naluSize = v.getUint32(offset, !le); // Big-Endian read\n if (lengthSize === 3) {\n naluSize >>>= 8;\n }\n if (naluSize > dataSize - lengthSize) {\n Log.w(this.TAG, `Malformed Nalus near timestamp ${dts}, NaluSize > DataSize!`);\n return;\n }\n\n let unitType = v.getUint8(offset + lengthSize) & 0x1F;\n\n if (unitType === 5) { // IDR\n keyframe = true;\n }\n\n let data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);\n let unit = {type: unitType, data: data};\n units.push(unit);\n length += data.byteLength;\n\n offset += lengthSize + naluSize;\n }\n\n if (units.length) {\n let track = this._videoTrack;\n let avcSample = {\n units: units,\n length: length,\n isKeyframe: keyframe,\n dts: dts,\n cts: cts,\n pts: (dts + cts)\n };\n if (keyframe) {\n avcSample.fileposition = tagPosition;\n }\n track.samples.push(avcSample);\n track.length += length;\n }\n }\n\n _parseHEVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let units = [], length = 0;\n\n let offset = 0;\n const lengthSize = this._naluLengthSize;\n let dts = this._timestampBase + tagTimestamp;\n let keyframe = (frameType === 1); // from FLV Frame Type constants\n\n while (offset < dataSize) {\n if (offset + 4 >= dataSize) {\n Log.w(this.TAG, `Malformed Nalu near timestamp ${dts}, offset = ${offset}, dataSize = ${dataSize}`);\n break; // data not enough for next Nalu\n }\n // Nalu with length-header (HVC1)\n let naluSize = v.getUint32(offset, !le); // Big-Endian read\n if (lengthSize === 3) {\n naluSize >>>= 8;\n }\n if (naluSize > dataSize - lengthSize) {\n Log.w(this.TAG, `Malformed Nalus near timestamp ${dts}, NaluSize > DataSize!`);\n return;\n }\n\n let unitType = v.getUint8(offset + lengthSize) & 0x1F;\n\n if (unitType === 19 || unitType === 20) { // IDR\n keyframe = true;\n }\n\n let data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);\n let unit = {type: unitType, data: data};\n units.push(unit);\n length += data.byteLength;\n\n offset += lengthSize + naluSize;\n }\n\n if (units.length) {\n let track = this._videoTrack;\n let hevcSample = {\n units: units,\n length: length,\n isKeyframe: keyframe,\n dts: dts,\n cts: cts,\n pts: (dts + cts)\n };\n if (keyframe) {\n hevcSample.fileposition = tagPosition;\n }\n track.samples.push(hevcSample);\n track.length += length;\n }\n }\n\n}\n\nexport default FLVDemuxer;","interface ProgramToPMTPIDMap {\n [program: number]: number;\n}\n\nexport class PAT {\n version_number: number;\n network_pid: number;\n // program_number -> pmt_pid\n program_pmt_pid: ProgramToPMTPIDMap = {};\n}\n\nexport enum StreamType {\n kMPEG1Audio = 0x03,\n kMPEG2Audio = 0x04,\n kPESPrivateData = 0x06,\n kADTSAAC = 0x0F,\n kLOASAAC = 0x11,\n kAC3 = 0x81,\n kID3 = 0x15,\n kSCTE35 = 0x86,\n kH264 = 0x1b,\n kH265 = 0x24\n}\n\ninterface PIDToStreamTypeMap {\n [pid: number]: StreamType;\n}\n\nexport class PMT {\n program_number: number;\n version_number: number;\n pcr_pid: number;\n // pid -> stream_type\n pid_stream_type: PIDToStreamTypeMap = {};\n\n common_pids: {\n h264: number | undefined,\n h265: number | undefined;\n adts_aac: number | undefined,\n loas_aac: number | undefined,\n opus: number | undefined,\n ac3: number | undefined,\n mp3: number | undefined\n } = {\n h264: undefined,\n h265: undefined,\n adts_aac: undefined,\n loas_aac: undefined,\n opus: undefined,\n ac3: undefined,\n mp3: undefined\n };\n\n pes_private_data_pids: {\n [pid: number]: boolean\n } = {};\n\n timed_id3_pids: {\n [pid: number]: boolean\n } = {};\n\n scte_35_pids: {\n [pid: number]: boolean\n } = {};\n\n smpte2038_pids: {\n [oid: number]: boolean\n } = {};\n}\n\nexport interface ProgramToPMTMap {\n [program: number]: PMT;\n}\n\nexport class PESData {\n pid: number;\n data: Uint8Array;\n stream_type: StreamType;\n file_position: number;\n random_access_indicator: number;\n}\n\nexport class SectionData {\n pid: number;\n data: Uint8Array;\n file_position: number;\n random_access_indicator: number;\n}\n\nexport class SliceQueue {\n slices: Uint8Array[] = [];\n total_length: number = 0;\n expected_length: number = 0;\n file_position: number = 0;\n random_access_indicator: 0;\n}\n\nexport interface PIDToSliceQueues {\n [pid: number]: SliceQueue;\n}\n","import MediaInfo from '../core/media-info';\nimport { PESPrivateData, PESPrivateDataDescriptor } from './pes-private-data';\nimport { SMPTE2038Data } from './smpte2038';\nimport { SCTE35Data } from './scte35';\n\ntype OnErrorCallback = (type: string, info: string) => void;\ntype OnMediaInfoCallback = (mediaInfo: MediaInfo) => void;\ntype OnMetaDataArrivedCallback = (metadata: any) => void;\ntype OnTrackMetadataCallback = (type: string, metadata: any) => void;\ntype OnDataAvailableCallback = (videoTrack: any, audioTrack: any) => void;\ntype OnTimedID3MetadataCallback = (timed_id3_data: PESPrivateData) => void;\ntype OnSMPTE2038MetadataCallback = (smpte2038_data: SMPTE2038Data) => void;\ntype OnSCTE35MetadataCallback = (scte35_data: SCTE35Data) => void;\ntype OnPESPrivateDataCallback = (private_data: PESPrivateData) => void;\ntype OnPESPrivateDataDescriptorCallback = (private_data_descriptor: PESPrivateDataDescriptor) => void;\n\nexport default abstract class BaseDemuxer {\n\n public onError: OnErrorCallback;\n public onMediaInfo: OnMediaInfoCallback;\n public onMetaDataArrived: OnMetaDataArrivedCallback;\n public onTrackMetadata: OnTrackMetadataCallback;\n public onDataAvailable: OnDataAvailableCallback;\n public onTimedID3Metadata: OnTimedID3MetadataCallback;\n public onSMPTE2038Metadata: OnSMPTE2038MetadataCallback;\n public onSCTE35Metadata: OnSCTE35MetadataCallback;\n public onPESPrivateData: OnPESPrivateDataCallback;\n public onPESPrivateDataDescriptor: OnPESPrivateDataDescriptorCallback;\n\n public constructor() {}\n\n public destroy(): void {\n this.onError = null;\n this.onMediaInfo = null;\n this.onMetaDataArrived = null;\n this.onTrackMetadata = null;\n this.onDataAvailable = null;\n this.onTimedID3Metadata = null;\n this.onSMPTE2038Metadata = null;\n this.onSCTE35Metadata = null;\n this.onPESPrivateData = null;\n this.onPESPrivateDataDescriptor = null;\n }\n\n abstract parseChunks(chunk: ArrayBuffer, byteStart: number): number;\n\n}\n","import Log from \"../utils/logger\";\n\nexport enum H264NaluType {\n kUnspecified = 0,\n kSliceNonIDR,\n kSliceDPA,\n kSliceDPB,\n kSliceDPC,\n kSliceIDR,\n kSliceSEI,\n kSliceSPS,\n kSlicePPS,\n kSliceAUD,\n kEndOfSequence,\n kEndOfStream,\n kFiller,\n kSPSExt,\n kReserved0\n}\n\nexport class H264NaluPayload {\n type: H264NaluType;\n data: Uint8Array;\n}\n\nexport class H264NaluAVC1 {\n type: H264NaluType;\n data: Uint8Array;\n\n constructor(nalu: H264NaluPayload) {\n let nalu_size = nalu.data.byteLength;\n\n this.type = nalu.type;\n this.data = new Uint8Array(4 + nalu_size); // 4 byte length-header + nalu payload\n\n let v = new DataView(this.data.buffer);\n // Fill 4 byte length-header\n v.setUint32(0, nalu_size);\n // Copy payload\n this.data.set(nalu.data, 4);\n }\n}\n\nexport class H264AnnexBParser {\n\n private readonly TAG: string = \"H264AnnexBParser\";\n\n private data_: Uint8Array;\n private current_startcode_offset_: number = 0;\n private eof_flag_: boolean = false;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_startcode_offset_ = this.findNextStartCodeOffset(0);\n if (this.eof_flag_) {\n Log.e(this.TAG, \"Could not find H264 startcode until payload end!\");\n }\n }\n\n private findNextStartCodeOffset(start_offset: number) {\n let i = start_offset;\n let data = this.data_;\n\n while (true) {\n if (i + 3 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 00 00 00 01 or 00 00 01\n let uint32 = (data[i + 0] << 24)\n | (data[i + 1] << 16)\n | (data[i + 2] << 8)\n | (data[i + 3]);\n let uint24 = (data[i + 0] << 16)\n | (data[i + 1] << 8)\n | (data[i + 2]);\n if (uint32 === 0x00000001 || uint24 === 0x000001) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextNaluPayload(): H264NaluPayload | null {\n let data = this.data_;\n let nalu_payload: H264NaluPayload = null;\n\n while (nalu_payload == null) {\n if (this.eof_flag_) {\n break;\n }\n // offset pointed to start code\n let startcode_offset = this.current_startcode_offset_;\n\n // nalu payload start offset\n let offset = startcode_offset;\n let u32 = (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | (data[offset + 3]);\n if (u32 === 0x00000001) {\n offset += 4;\n } else {\n offset += 3;\n }\n\n let nalu_type: H264NaluType = data[offset] & 0x1F;\n let forbidden_bit = (data[offset] & 0x80) >>> 7;\n\n let next_startcode_offset = this.findNextStartCodeOffset(offset);\n this.current_startcode_offset_ = next_startcode_offset;\n\n if (nalu_type >= H264NaluType.kReserved0) {\n continue;\n }\n if (forbidden_bit !== 0) {\n // Log.e(this.TAG, `forbidden_bit near offset ${offset} should be 0 but has value ${forbidden_bit}`);\n continue;\n }\n\n let payload_data = data.subarray(offset, next_startcode_offset);\n\n nalu_payload = new H264NaluPayload();\n nalu_payload.type = nalu_type;\n nalu_payload.data = payload_data;\n }\n\n return nalu_payload;\n }\n\n}\n\n\nexport class AVCDecoderConfigurationRecord {\n\n private data: Uint8Array;\n\n // sps, pps: require Nalu without 4 byte length-header\n public constructor(sps: Uint8Array, pps: Uint8Array, sps_details: any) {\n let length = 6 + 2 + sps.byteLength + 1 + 2 + pps.byteLength;\n let need_extra_fields = false;\n\n if (sps[3] !== 66 && sps[3] !== 77 && sps[3] !== 88) {\n need_extra_fields = true;\n length += 4;\n }\n\n let data = this.data = new Uint8Array(length);\n\n data[0] = 0x01; // configurationVersion\n data[1] = sps[1]; // AVCProfileIndication\n data[2] = sps[2]; // profile_compatibility\n data[3] = sps[3]; // AVCLevelIndication\n data[4] = 0xFF; // 111111 + lengthSizeMinusOne(3)\n\n data[5] = 0xE0 | 0x01 // 111 + numOfSequenceParameterSets\n\n let sps_length = sps.byteLength;\n data[6] = sps_length >>> 8; // sequenceParameterSetLength\n data[7] = sps_length & 0xFF;\n\n let offset = 8;\n data.set(sps, 8);\n offset += sps_length;\n\n data[offset] = 1; // numOfPictureParameterSets\n\n let pps_length = pps.byteLength;\n data[offset + 1] = pps_length >>> 8; // pictureParameterSetLength\n data[offset + 2] = pps_length & 0xFF;\n\n data.set(pps, offset + 3);\n offset += 3 + pps_length;\n\n if (need_extra_fields) {\n data[offset] = 0xFC | sps_details.chroma_format_idc;\n data[offset + 1] = 0xF8 | (sps_details.bit_depth_luma - 8);\n data[offset + 2] = 0xF8 | (sps_details.bit_depth_chroma - 8);\n data[offset + 3] = 0x00; // number of sps ext\n offset += 4;\n }\n }\n\n public getData() {\n return this.data;\n }\n\n}\n","export enum MPEG4AudioObjectTypes {\n kNull = 0,\n kAACMain,\n kAAC_LC, // LC-AAC\n kAAC_SSR,\n kAAC_LTP,\n kAAC_SBR, // HE-AAC\n kAAC_Scalable,\n\n kLayer1 = 32,\n kLayer2,\n kLayer3, // MP3\n}\n\nexport enum MPEG4SamplingFrequencyIndex {\n k96000Hz = 0,\n k88200Hz,\n k64000Hz,\n k48000Hz,\n k44100Hz,\n k32000Hz,\n k24000Hz,\n k22050Hz,\n k16000Hz,\n k12000Hz,\n k11025Hz,\n k8000Hz,\n k7350Hz,\n}\n\nexport const MPEG4SamplingFrequencies = [\n 96000,\n 88200,\n 64000,\n 48000,\n 44100,\n 32000,\n 24000,\n 22050,\n 16000,\n 12000,\n 11025,\n 8000,\n 7350,\n];\n","import ExpGolomb from './exp-golomb.js';\n\nexport type SCTE35Data = {\n splice_command_type: SCTE35CommandType.kSpliceInsert\n pts?: number,\n nearest_pts?: number\n auto_return?: boolean\n duraiton?: number,\n detail: SCTE35Detail\n data: Uint8Array\n} | {\n splice_command_type: SCTE35CommandType.kTimeSignal\n pts?: number,\n nearest_pts?: number\n detail: SCTE35Detail\n data: Uint8Array\n} | {\n splice_command_type: SCTE35CommandType.kSpliceNull | SCTE35CommandType.kBandwidthReservation | SCTE35CommandType.kSpliceSchedule | SCTE35CommandType.kPrivateCommand\n pts: undefined,\n nearest_pts?: number\n detail: SCTE35Detail\n data: Uint8Array\n}\n\ntype SCTE35Detail = {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kSpliceNull\n splice_command: SpliceNull\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[]\n E_CRC32?: number\n CRC32: number\n} | {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kSpliceSchedule\n splice_command: SpliceSchedule\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[]\n E_CRC32?: number\n CRC32: number\n} | {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kSpliceInsert\n splice_command: SpliceInsert\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[]\n E_CRC32?: number\n CRC32: number\n} | {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kTimeSignal\n splice_command: TimeSignal\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[]\n E_CRC32?: number\n CRC32: number\n} | {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kBandwidthReservation\n splice_command: BandwidthReservation\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[]\n E_CRC32?: number\n CRC32: number\n} | {\n table_id: number\n section_syntax_indicator: boolean\n private_indicator: boolean\n section_length: number\n protocol_version: number\n encrypted_packet: boolean\n encryption_algorithm: number\n pts_adjustment: number\n cw_index: number\n tier: number\n splice_command_length: number\n splice_command_type: SCTE35CommandType.kPrivateCommand\n splice_command: PrivateCommand\n descriptor_loop_length: number\n splice_descriptors: SpliceDescriptor[],\n E_CRC32?: number\n CRC32: number\n};\n\nexport enum SCTE35CommandType {\n kSpliceNull = 0x0,\n kSpliceSchedule = 0x4,\n kSpliceInsert = 0x5,\n kTimeSignal = 0x6,\n kBandwidthReservation = 0x07,\n kPrivateCommand = 0xff\n}\n\ntype SpliceTime = {\n time_specified_flag: boolean,\n pts_time?: number\n}\n\nconst parseSpliceTime = (reader: ExpGolomb): SpliceTime => {\n const time_specified_flag = reader.readBool()\n\n if (!time_specified_flag) {\n reader.readBits(7);\n return { time_specified_flag }\n } else {\n reader.readBits(6)\n const pts_time = reader.readBits(31) * 4 + reader.readBits(2);\n return {\n time_specified_flag,\n pts_time\n }\n }\n}\n\ntype BreakDuration = {\n auto_return: boolean,\n duration: number\n}\nconst parseBreakDuration = (reader: ExpGolomb): BreakDuration => {\n const auto_return = reader.readBool();\n reader.readBits(6);\n const duration = reader.readBits(31) * 4 + reader.readBits(2);\n return {\n auto_return,\n duration\n };\n}\n\ntype SpliceInsertComponent = {\n component_tag: number,\n splice_time?: SpliceTime\n}\nconst parseSpliceInsertComponent = (splice_immediate_flag: boolean, reader: ExpGolomb): SpliceInsertComponent => {\n const component_tag = reader.readBits(8);\n if (splice_immediate_flag) {\n return { component_tag };\n }\n\n const splice_time = parseSpliceTime(reader);\n return {\n component_tag,\n splice_time\n };\n}\ntype SpliceScheduleEventComponent = {\n component_tag: number,\n utc_splice_time: number\n}\nconst parseSpliceScheduleEventComponent = (reader: ExpGolomb): SpliceScheduleEventComponent => {\n const component_tag = reader.readBits(8);\n const utc_splice_time = reader.readBits(32);\n return {\n component_tag,\n utc_splice_time\n };\n}\n\ntype SpliceScheduleEvent = {\n splice_event_id: number,\n splice_event_cancel_indicator: boolean,\n out_of_network_indicator?: boolean,\n program_splice_flag?: boolean,\n duration_flag?: boolean,\n utc_splice_time?: number,\n component_count?: number,\n components?: SpliceScheduleEventComponent[]\n break_duration?: BreakDuration,\n unique_program_id?: number\n avail_num?: number,\n avails_expected?: number\n}\nconst parseSpliceScheduleEvent = (reader: ExpGolomb): SpliceScheduleEvent => {\n const splice_event_id = reader.readBits(32);\n const splice_event_cancel_indicator = reader.readBool();\n reader.readBits(7);\n\n const spliceScheduleEvent: SpliceScheduleEvent = {\n splice_event_id,\n splice_event_cancel_indicator\n }\n\n if (splice_event_cancel_indicator) {\n return spliceScheduleEvent;\n }\n\n spliceScheduleEvent.out_of_network_indicator = reader.readBool()\n spliceScheduleEvent.program_splice_flag = reader.readBool()\n spliceScheduleEvent.duration_flag = reader.readBool()\n reader.readBits(5)\n\n if (spliceScheduleEvent.program_splice_flag) {\n spliceScheduleEvent.utc_splice_time = reader.readBits(32);\n } else {\n spliceScheduleEvent.component_count = reader.readBits(8);\n spliceScheduleEvent.components = [];\n for (let i = 0; i < spliceScheduleEvent.component_count; i++) {\n spliceScheduleEvent.components.push(parseSpliceScheduleEventComponent(reader));\n }\n }\n\n if (spliceScheduleEvent.duration_flag) {\n spliceScheduleEvent.break_duration = parseBreakDuration(reader);\n }\n\n spliceScheduleEvent.unique_program_id = reader.readBits(16);\n spliceScheduleEvent.avail_num = reader.readBits(8);\n spliceScheduleEvent.avails_expected = reader.readBits(8);\n\n return spliceScheduleEvent;\n}\n\ntype SpliceNull = {}\ntype SpliceSchedule = {\n splice_count: number,\n events: SpliceScheduleEvent[],\n}\ntype SpliceInsert = {\n splice_event_id: number,\n splice_event_cancel_indicator: boolean,\n out_of_network_indicator?: boolean,\n program_splice_flag?: boolean,\n duration_flag?: boolean,\n splice_immediate_flag?: boolean,\n splice_time?: SpliceTime,\n component_count?: number,\n components?: SpliceInsertComponent[],\n break_duration?: BreakDuration,\n unique_program_id?: number,\n avail_num?: number,\n avails_expected?: number\n}\ntype TimeSignal = {\n splice_time: SpliceTime\n}\ntype BandwidthReservation = {}\ntype PrivateCommand = {\n identifier: string,\n private_data: ArrayBuffer\n}\n\ntype SpliceCommand = SpliceNull | SpliceSchedule | SpliceInsert | TimeSignal | BandwidthReservation | PrivateCommand\n\nconst parseSpliceNull = (): SpliceNull => {\n return {};\n};\nconst parseSpliceSchedule = (reader: ExpGolomb): SpliceSchedule => {\n const splice_count = reader.readBits(8)\n const events: SpliceScheduleEvent[] = [];\n for (let i = 0; i < splice_count; i++) {\n events.push(parseSpliceScheduleEvent(reader));\n }\n return {\n splice_count,\n events\n };\n}\nconst parseSpliceInsert = (reader: ExpGolomb): SpliceInsert => {\n const splice_event_id = reader.readBits(32);\n const splice_event_cancel_indicator = reader.readBool();\n reader.readBits(7);\n\n const spliceInsert: SpliceInsert = {\n splice_event_id,\n splice_event_cancel_indicator\n }\n\n if (splice_event_cancel_indicator) {\n return spliceInsert;\n }\n\n spliceInsert.out_of_network_indicator = reader.readBool()\n spliceInsert.program_splice_flag = reader.readBool()\n spliceInsert.duration_flag = reader.readBool()\n spliceInsert.splice_immediate_flag = reader.readBool()\n reader.readBits(4)\n\n if (spliceInsert.program_splice_flag && !spliceInsert.splice_immediate_flag) {\n spliceInsert.splice_time = parseSpliceTime(reader);\n }\n if (!spliceInsert.program_splice_flag) {\n spliceInsert.component_count = reader.readBits(8)\n spliceInsert.components = [];\n for (let i = 0; i < spliceInsert.component_count; i++) {\n spliceInsert.components.push(parseSpliceInsertComponent(spliceInsert.splice_immediate_flag, reader));\n }\n }\n\n if (spliceInsert.duration_flag) {\n spliceInsert.break_duration = parseBreakDuration(reader);\n }\n\n spliceInsert.unique_program_id = reader.readBits(16);\n spliceInsert.avail_num = reader.readBits(8);\n spliceInsert.avails_expected = reader.readBits(8);\n\n return spliceInsert;\n}\nconst parseTimeSignal = (reader: ExpGolomb): TimeSignal => {\n return {\n splice_time: parseSpliceTime(reader)\n };\n}\nconst parseBandwidthReservation = (): BandwidthReservation => {\n return {};\n}\nconst parsePrivateCommand = (splice_command_length: number, reader: ExpGolomb): PrivateCommand => {\n const identifier = String.fromCharCode(reader.readBits(8), reader.readBits(8), reader.readBits(8), reader.readBits(8))\n const data = new Uint8Array(splice_command_length - 4);\n for (let i = 0; i < splice_command_length - 4; i++) {\n data[i] = reader.readBits(8);\n }\n\n return {\n identifier,\n private_data: data.buffer\n }\n}\n\ntype Descriptor = {\n descriptor_tag: number,\n descriptor_length: number,\n identifier: string\n}\ntype AvailDescriptor = Descriptor & {\n provider_avail_id: number\n}\nconst parseAvailDescriptor = (descriptor_tag: number, descriptor_length: number, identifier: string, reader: ExpGolomb): AvailDescriptor => {\n const provider_avail_id = reader.readBits(32);\n\n return {\n descriptor_tag,\n descriptor_length,\n identifier,\n provider_avail_id\n }\n}\ntype DTMFDescriptor = Descriptor & {\n preroll: number,\n dtmf_count: number,\n DTMF_char: string\n}\nconst parseDTMFDescriptor = (descriptor_tag: number, descriptor_length: number, identifier: string, reader: ExpGolomb): DTMFDescriptor => {\n const preroll = reader.readBits(8);\n const dtmf_count = reader.readBits(3);\n reader.readBits(5);\n let DTMF_char = '';\n for (let i = 0; i < dtmf_count; i++) {\n DTMF_char += String.fromCharCode(reader.readBits(8));\n }\n\n return {\n descriptor_tag,\n descriptor_length,\n identifier,\n preroll,\n dtmf_count,\n DTMF_char\n };\n}\ntype SegmentationDescriptorComponent = {\n component_tag: number,\n pts_offset: number\n}\nconst parseSegmentationDescriptorComponent = (reader: ExpGolomb): SegmentationDescriptorComponent => {\n const component_tag = reader.readBits(8);\n reader.readBits(7)\n const pts_offset = reader.readBits(31) * 4 + reader.readBits(2);\n return {\n component_tag,\n pts_offset\n };\n}\ntype SegmentationDescriptor = Descriptor & {\n segmentation_event_id: number,\n segmentation_event_cancel_indicator: boolean,\n program_segmentation_flag?: boolean,\n segmentation_duration_flag?: boolean\n delivery_not_restricted_flag?: boolean\n web_delivery_allowed_flag?: boolean\n no_regional_blackout_flag?: boolean,\n archive_allowed_flag?: boolean,\n device_restrictions?: number\n component_count?: number,\n components?: any[]\n segmentation_duration?: number\n segmentation_upid_type?: number,\n segmentation_upid_length?: number,\n segmentation_upid?: ArrayBuffer,\n segmentation_type_id?: number,\n segment_num?: number,\n segments_expected?: number,\n sub_segment_num?: number,\n sub_segments_expected?: number\n}\nconst parseSegmentationDescriptor = (descriptor_tag: number, descriptor_length: number, identifier: string, reader: ExpGolomb): SegmentationDescriptor => {\n const segmentation_event_id = reader.readBits(32);\n const segmentation_event_cancel_indicator = reader.readBool();\n reader.readBits(7);\n\n const segmentationDescriptor: SegmentationDescriptor = {\n descriptor_tag,\n descriptor_length,\n identifier,\n segmentation_event_id,\n segmentation_event_cancel_indicator\n }\n\n if (segmentation_event_cancel_indicator) {\n return segmentationDescriptor;\n }\n\n segmentationDescriptor.program_segmentation_flag = reader.readBool();\n segmentationDescriptor.segmentation_duration_flag = reader.readBool();\n segmentationDescriptor.delivery_not_restricted_flag = reader.readBool();\n\n if (!segmentationDescriptor.delivery_not_restricted_flag) {\n segmentationDescriptor.web_delivery_allowed_flag = reader.readBool();\n segmentationDescriptor.no_regional_blackout_flag = reader.readBool();\n segmentationDescriptor.archive_allowed_flag = reader.readBool();\n segmentationDescriptor.device_restrictions = reader.readBits(2);\n } else {\n reader.readBits(5);\n }\n\n if (!segmentationDescriptor.program_segmentation_flag) {\n segmentationDescriptor.component_count = reader.readBits(8);\n segmentationDescriptor.components = [];\n for (let i = 0; i < segmentationDescriptor.component_count; i++) {\n segmentationDescriptor.components.push(parseSegmentationDescriptorComponent(reader));\n }\n }\n\n if (segmentationDescriptor.segmentation_duration_flag) {\n segmentationDescriptor.segmentation_duration = reader.readBits(40);\n }\n\n segmentationDescriptor.segmentation_upid_type = reader.readBits(8);\n segmentationDescriptor.segmentation_upid_length = reader.readBits(8);\n {\n const upid = new Uint8Array(segmentationDescriptor.segmentation_upid_length)\n for (let i = 0; i < segmentationDescriptor.segmentation_upid_length; i++) {\n upid[i] = reader.readBits(8);\n }\n segmentationDescriptor.segmentation_upid = upid.buffer;\n }\n segmentationDescriptor.segmentation_type_id = reader.readBits(8);\n segmentationDescriptor.segment_num = reader.readBits(8);\n segmentationDescriptor.segments_expected = reader.readBits(8);\n if (\n segmentationDescriptor.segmentation_type_id === 0x34 ||\n segmentationDescriptor.segmentation_type_id === 0x36 ||\n segmentationDescriptor.segmentation_type_id === 0x38 ||\n segmentationDescriptor.segmentation_type_id === 0x3A\n ) {\n segmentationDescriptor.sub_segment_num = reader.readBits(8);\n segmentationDescriptor.sub_segments_expected = reader.readBits(8);\n }\n\n return segmentationDescriptor;\n}\ntype TimeDescriptor = Descriptor & {\n TAI_seconds: number,\n TAI_ns: number,\n UTC_offset: number\n}\nconst parseTimeDescriptor = (descriptor_tag: number, descriptor_length: number, identifier: string, reader: ExpGolomb): TimeDescriptor => {\n const TAI_seconds = reader.readBits(48);\n const TAI_ns = reader.readBits(32);\n const UTC_offset = reader.readBits(16);\n\n return {\n descriptor_tag,\n descriptor_length,\n identifier,\n TAI_seconds,\n TAI_ns,\n UTC_offset\n };\n}\ntype AudioDescriptorComponent = {\n component_tag: number,\n ISO_code: string\n Bit_Stream_Mode: number\n Num_Channels: number,\n Full_Srvc_Audio: boolean\n}\nconst parseAudioDescriptorComponent = (reader: ExpGolomb): AudioDescriptorComponent => {\n const component_tag = reader.readBits(8)\n const ISO_code = String.fromCharCode(reader.readBits(8), reader.readBits(8), reader.readBits(8));\n const Bit_Stream_Mode = reader.readBits(3);\n const Num_Channels = reader.readBits(4);\n const Full_Srvc_Audio = reader.readBool();\n\n return {\n component_tag,\n ISO_code,\n Bit_Stream_Mode,\n Num_Channels,\n Full_Srvc_Audio\n };\n}\ntype AudioDescriptor = Descriptor & {\n audio_count: number,\n components: AudioDescriptorComponent[]\n}\nconst parseAudioDescriptor = (descriptor_tag: number, descriptor_length: number, identifier: string, reader: ExpGolomb): AudioDescriptor => {\n const audio_count = reader.readBits(4);\n const components: AudioDescriptorComponent[] = [];\n for (let i = 0; i < audio_count; i++) {\n components.push(parseAudioDescriptorComponent(reader));\n }\n\n return {\n descriptor_tag,\n descriptor_length,\n identifier,\n audio_count,\n components\n };\n}\n\ntype SpliceDescriptor = AvailDescriptor | DTMFDescriptor | SegmentationDescriptor | TimeDescriptor | AudioDescriptor;\n\nexport const readSCTE35 = (data: Uint8Array): SCTE35Data => {\n const reader = new ExpGolomb(data);\n\n const table_id = reader.readBits(8);\n const section_syntax_indicator = reader.readBool();\n const private_indicator = reader.readBool();\n reader.readBits(2);\n const section_length = reader.readBits(12);\n const protocol_version = reader.readBits(8);\n const encrypted_packet = reader.readBool();\n const encryption_algorithm = reader.readBits(6);\n const pts_adjustment = reader.readBits(31) * 4 + reader.readBits(2);\n const cw_index = reader.readBits(8);\n const tier = reader.readBits(12);\n const splice_command_length = reader.readBits(12)\n const splice_command_type = reader.readBits(8)\n\n let splice_command: SpliceCommand | null = null;\n if (splice_command_type === SCTE35CommandType.kSpliceNull) {\n splice_command = parseSpliceNull();\n } else if (splice_command_type === SCTE35CommandType.kSpliceSchedule) {\n splice_command = parseSpliceSchedule(reader);\n } else if (splice_command_type === SCTE35CommandType.kSpliceInsert) {\n splice_command = parseSpliceInsert(reader);\n } else if (splice_command_type === SCTE35CommandType.kTimeSignal) {\n splice_command = parseTimeSignal(reader);\n } else if (splice_command_type === SCTE35CommandType.kBandwidthReservation) {\n splice_command = parseBandwidthReservation();\n } else if (splice_command_type === SCTE35CommandType.kPrivateCommand) {\n splice_command = parsePrivateCommand(splice_command_length, reader)\n } else {\n reader.readBits(splice_command_length * 8);\n }\n\n const splice_descriptors: SpliceDescriptor[] = [];\n\n const descriptor_loop_length = reader.readBits(16);\n for (let length = 0; length < descriptor_loop_length;) {\n const descriptor_tag = reader.readBits(8);\n const descriptor_length = reader.readBits(8);\n const identifier = String.fromCharCode(reader.readBits(8), reader.readBits(8), reader.readBits(8), reader.readBits(8));\n\n if (descriptor_tag === 0x00) {\n splice_descriptors.push(parseAvailDescriptor(descriptor_tag, descriptor_length, identifier, reader));\n } else if (descriptor_tag === 0x01) {\n splice_descriptors.push(parseDTMFDescriptor(descriptor_tag, descriptor_length, identifier, reader));\n } else if (descriptor_tag === 0x02) {\n splice_descriptors.push(parseSegmentationDescriptor(descriptor_tag, descriptor_length, identifier, reader));\n } else if (descriptor_tag === 0x03) {\n splice_descriptors.push(parseTimeDescriptor(descriptor_tag, descriptor_length, identifier, reader));\n } else if (descriptor_tag === 0x04) {\n splice_descriptors.push(parseAudioDescriptor(descriptor_tag, descriptor_length, identifier, reader));\n } else {\n reader.readBits((descriptor_length - 4) * 8);\n }\n\n length += 2 + descriptor_length;\n }\n\n const E_CRC32 = encrypted_packet ? reader.readBits(32) : undefined;\n const CRC32 = reader.readBits(32);\n\n const detail = {\n table_id,\n section_syntax_indicator,\n private_indicator,\n section_length,\n protocol_version,\n encrypted_packet,\n encryption_algorithm,\n pts_adjustment,\n cw_index,\n tier,\n splice_command_length,\n splice_command_type,\n splice_command,\n descriptor_loop_length,\n splice_descriptors,\n E_CRC32,\n CRC32\n };\n\n if (splice_command_type === SCTE35CommandType.kSpliceInsert) {\n const spliceInsert = splice_command as SpliceInsert;\n\n if (spliceInsert.splice_event_cancel_indicator) {\n return {\n splice_command_type,\n detail,\n data\n }\n } else if (spliceInsert.program_splice_flag && !spliceInsert.splice_immediate_flag) {\n const auto_return = spliceInsert.duration_flag ? spliceInsert.break_duration.auto_return : undefined;\n const duraiton = spliceInsert.duration_flag ? spliceInsert.break_duration.duration / 90 : undefined;\n\n if (spliceInsert.splice_time.time_specified_flag) {\n return {\n splice_command_type,\n pts: (pts_adjustment + spliceInsert.splice_time.pts_time) % (2 ** 33),\n auto_return,\n duraiton,\n detail,\n data\n }\n } else {\n return {\n splice_command_type,\n auto_return,\n duraiton,\n detail,\n data\n } \n }\n } else {\n const auto_return = spliceInsert.duration_flag ? spliceInsert.break_duration.auto_return : undefined;\n const duraiton = spliceInsert.duration_flag ? spliceInsert.break_duration.duration / 90 : undefined;\n\n return {\n splice_command_type,\n auto_return,\n duraiton,\n detail,\n data\n }\n }\n } else if (splice_command_type === SCTE35CommandType.kTimeSignal) {\n const timeSignal = splice_command as TimeSignal;\n\n if (timeSignal.splice_time.time_specified_flag) {\n return {\n splice_command_type,\n pts: (pts_adjustment + timeSignal.splice_time.pts_time) % (2 ** 33),\n detail,\n data\n }\n } else {\n return {\n splice_command_type,\n detail,\n data\n }\n }\n } else {\n return {\n splice_command_type,\n detail,\n data\n }\n }\n}","import Log from \"../utils/logger\";\nimport ExpGolomb from \"./exp-golomb\";\nimport { MPEG4AudioObjectTypes, MPEG4SamplingFrequencies, MPEG4SamplingFrequencyIndex } from \"./mpeg4-audio\";\n\nexport class AACFrame {\n audio_object_type: MPEG4AudioObjectTypes;\n sampling_freq_index: MPEG4SamplingFrequencyIndex;\n sampling_frequency: number;\n channel_config: number;\n\n data: Uint8Array;\n}\n\nexport class LOASAACFrame extends AACFrame {\n other_data_present: boolean;\n}\n\nexport class AACADTSParser {\n\n private readonly TAG: string = \"AACADTSParser\";\n\n private data_: Uint8Array;\n private current_syncword_offset_: number;\n private eof_flag_: boolean;\n private has_last_incomplete_data: boolean;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_syncword_offset_ = this.findNextSyncwordOffset(0);\n if (this.eof_flag_) {\n Log.e(this.TAG, `Could not found ADTS syncword until payload end`);\n }\n }\n\n private findNextSyncwordOffset(syncword_offset: number): number {\n let i = syncword_offset;\n let data = this.data_;\n\n while (true) {\n if (i + 7 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 12-bit 0xFFF syncword\n let syncword = ((data[i + 0] << 8) | data[i + 1]) >>> 4;\n if (syncword === 0xFFF) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextAACFrame(): AACFrame | null {\n let data = this.data_;\n let aac_frame: AACFrame = null;\n\n while (aac_frame == null) {\n if (this.eof_flag_) {\n break;\n }\n\n let syncword_offset = this.current_syncword_offset_;\n let offset = syncword_offset;\n\n // adts_fixed_header()\n // syncword 0xFFF: 12-bit\n let ID = (data[offset + 1] & 0x08) >>> 3;\n let layer = (data[offset + 1] & 0x06) >>> 1;\n let protection_absent = data[offset + 1] & 0x01;\n let profile = (data[offset + 2] & 0xC0) >>> 6;\n let sampling_frequency_index = (data[offset + 2] & 0x3C) >>> 2;\n let channel_configuration = ((data[offset + 2] & 0x01) << 2)\n | ((data[offset + 3] & 0xC0) >>> 6);\n\n // adts_variable_header()\n let aac_frame_length = ((data[offset + 3] & 0x03) << 11)\n | (data[offset + 4] << 3)\n | ((data[offset + 5] & 0xE0) >>> 5);\n let number_of_raw_data_blocks_in_frame = data[offset + 6] & 0x03;\n\n if (offset + aac_frame_length > this.data_.byteLength) {\n // data not enough for extracting last sample\n this.eof_flag_ = true;\n this.has_last_incomplete_data = true;\n break;\n }\n\n let adts_header_length = (protection_absent === 1) ? 7 : 9;\n let adts_frame_payload_length = aac_frame_length - adts_header_length;\n\n offset += adts_header_length;\n\n let next_syncword_offset = this.findNextSyncwordOffset(offset + adts_frame_payload_length);\n this.current_syncword_offset_ = next_syncword_offset;\n\n if ((ID !== 0 && ID !== 1) || layer !== 0) {\n // invalid adts frame ?\n continue;\n }\n\n let frame_data = data.subarray(offset, offset + adts_frame_payload_length);\n\n aac_frame = new AACFrame();\n aac_frame.audio_object_type = (profile + 1) as MPEG4AudioObjectTypes;\n aac_frame.sampling_freq_index = sampling_frequency_index as MPEG4SamplingFrequencyIndex;\n aac_frame.sampling_frequency = MPEG4SamplingFrequencies[sampling_frequency_index];\n aac_frame.channel_config = channel_configuration;\n aac_frame.data = frame_data;\n }\n\n return aac_frame;\n }\n\n public hasIncompleteData(): boolean {\n return this.has_last_incomplete_data;\n }\n\n public getIncompleteData(): Uint8Array {\n if (!this.has_last_incomplete_data) {\n return null;\n }\n\n return this.data_.subarray(this.current_syncword_offset_);\n }\n}\n\nexport class AACLOASParser {\n\n private readonly TAG: string = \"AACLOASParser\";\n\n private data_: Uint8Array;\n private current_syncword_offset_: number;\n private eof_flag_: boolean;\n private has_last_incomplete_data: boolean;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_syncword_offset_ = this.findNextSyncwordOffset(0);\n if (this.eof_flag_) {\n Log.e(this.TAG, `Could not found LOAS syncword until payload end`);\n }\n }\n\n private findNextSyncwordOffset(syncword_offset: number): number {\n let i = syncword_offset;\n let data = this.data_;\n\n while (true) {\n if (i + 1 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 12-bit 0xFFF syncword\n let syncword = (data[i + 0] << 3) | (data[i + 1] >>> 5);\n if (syncword === 0x2B7) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n private getLATMValue(gb: ExpGolomb) {\n let bytesForValue = gb.readBits(2);\n let value = 0;\n for (let i = 0; i <= bytesForValue; i++) {\n value = value << 8;\n value = value | gb.readByte();\n }\n return value;\n }\n\n public readNextAACFrame(privious?: LOASAACFrame): LOASAACFrame | null {\n let data = this.data_;\n let aac_frame: LOASAACFrame = null;\n\n while (aac_frame == null) {\n if (this.eof_flag_) {\n break;\n }\n\n let syncword_offset = this.current_syncword_offset_;\n let offset = syncword_offset;\n\n let audioMuxLengthBytes = ((data[offset + 1] & 0x1F) << 8) | data[offset + 2];\n if (offset + 3 + audioMuxLengthBytes >= this.data_.byteLength) {\n // data not enough for extracting last sample\n this.eof_flag_ = true;\n this.has_last_incomplete_data = true;\n break;\n }\n\n // AudioMuxElement(1)\n let gb = new ExpGolomb(data.subarray(offset + 3, offset + 3 + audioMuxLengthBytes));\n let useSameStreamMux = gb.readBool();\n let streamMuxConfig: LOASAACFrame | null = null;\n if (!useSameStreamMux) {\n let audioMuxVersion = gb.readBool();\n let audioMuxVersionA = audioMuxVersion && gb.readBool();\n if (audioMuxVersionA) {\n Log.e(this.TAG, 'audioMuxVersionA is Not Supported');\n gb.destroy();\n break;\n }\n if (audioMuxVersion) {\n this.getLATMValue(gb);\n }\n let allStreamsSameTimeFraming = gb.readBool();\n if (!allStreamsSameTimeFraming) {\n Log.e(this.TAG, 'allStreamsSameTimeFraming zero is Not Supported');\n gb.destroy();\n break;\n }\n let numSubFrames = gb.readBits(6);\n if (numSubFrames !== 0) {\n Log.e(this.TAG, 'more than 2 numSubFrames Not Supported');\n gb.destroy();\n break;\n }\n let numProgram = gb.readBits(4);\n if (numProgram !== 0) {\n Log.e(this.TAG, 'more than 2 numProgram Not Supported');\n gb.destroy();\n break;\n }\n let numLayer = gb.readBits(3);\n if (numLayer !== 0) {\n Log.e(this.TAG, 'more than 2 numLayer Not Supported');\n gb.destroy();\n break;\n }\n\n let fillBits = audioMuxVersion ? this.getLATMValue(gb) : 0;\n let audio_object_type = gb.readBits(5); fillBits -= 5;\n let sampling_freq_index = gb.readBits(4);fillBits -= 4;\n let channel_config = gb.readBits(4); fillBits -= 4;\n gb.readBits(3); fillBits -= 3; // GA Specfic Config\n if (fillBits > 0) { gb.readBits(fillBits); }\n\n let frameLengthType = gb.readBits(3);\n if (frameLengthType === 0) {\n gb.readByte();\n } else {\n Log.e(this.TAG, `frameLengthType = ${frameLengthType}. Only frameLengthType = 0 Supported`);\n gb.destroy();\n break;\n }\n\n let otherDataPresent = gb.readBool();\n if (otherDataPresent) {\n if (audioMuxVersion) {\n this.getLATMValue(gb);\n } else {\n let otherDataLenBits = 0;\n while (true) {\n otherDataLenBits = otherDataLenBits << 8;\n let otherDataLenEsc = gb.readBool();\n let otherDataLenTmp = gb.readByte();\n otherDataLenBits += otherDataLenTmp\n if (!otherDataLenEsc) { break; }\n }\n console.log(otherDataLenBits)\n }\n }\n\n let crcCheckPresent = gb.readBool();\n if (crcCheckPresent) {\n gb.readByte();\n }\n\n streamMuxConfig = new LOASAACFrame();\n streamMuxConfig.audio_object_type = audio_object_type;\n streamMuxConfig.sampling_freq_index = sampling_freq_index;\n streamMuxConfig.sampling_frequency = MPEG4SamplingFrequencies[streamMuxConfig.sampling_freq_index];\n streamMuxConfig.channel_config = channel_config;\n streamMuxConfig.other_data_present = otherDataPresent;\n } else if (privious == null) {\n Log.w(this.TAG, 'StreamMuxConfig Missing')\n this.current_syncword_offset_ = this.findNextSyncwordOffset(offset + 3 + audioMuxLengthBytes);\n gb.destroy();\n continue;\n } else {\n streamMuxConfig = privious;\n }\n\n let length = 0;\n while (true) {\n let tmp = gb.readByte();\n length += tmp;\n if (tmp !== 0xFF) { break; }\n }\n\n let aac_data = new Uint8Array(length);\n for (let i = 0; i < length; i++) {\n aac_data[i] = gb.readByte();\n }\n\n aac_frame = new LOASAACFrame();\n aac_frame.audio_object_type = (streamMuxConfig.audio_object_type) as MPEG4AudioObjectTypes;\n aac_frame.sampling_freq_index = (streamMuxConfig.sampling_freq_index) as MPEG4SamplingFrequencyIndex;\n aac_frame.sampling_frequency = MPEG4SamplingFrequencies[streamMuxConfig.sampling_freq_index];\n aac_frame.channel_config = streamMuxConfig.channel_config;\n aac_frame.other_data_present = streamMuxConfig.other_data_present;\n aac_frame.data = aac_data;\n\n this.current_syncword_offset_ = this.findNextSyncwordOffset(offset + 3 + audioMuxLengthBytes);\n }\n\n return aac_frame;\n }\n\n public hasIncompleteData(): boolean {\n return this.has_last_incomplete_data;\n }\n\n public getIncompleteData(): Uint8Array {\n if (!this.has_last_incomplete_data) {\n return null;\n }\n\n return this.data_.subarray(this.current_syncword_offset_);\n }\n}\n\nexport class AudioSpecificConfig {\n\n public config: Array;\n public sampling_rate: number;\n public channel_count: number;\n public codec_mimetype: string;\n public original_codec_mimetype: string;\n\n public constructor(frame: AACFrame) {\n let config: Array = null;\n\n let original_audio_object_type = frame.audio_object_type;\n let audio_object_type = frame.audio_object_type;\n let sampling_index = frame.sampling_freq_index;\n let channel_config = frame.channel_config;\n let extension_sampling_index = 0;\n\n let userAgent = navigator.userAgent.toLowerCase();\n\n if (userAgent.indexOf('firefox') !== -1) {\n // firefox: use SBR (HE-AAC) if freq less than 24kHz\n if (sampling_index >= 6) {\n audio_object_type = 5;\n config = new Array(4);\n extension_sampling_index = sampling_index - 3;\n } else { // use LC-AAC\n audio_object_type = 2;\n config = new Array(2);\n extension_sampling_index = sampling_index;\n }\n } else if (userAgent.indexOf('android') !== -1) {\n // android: always use LC-AAC\n audio_object_type = 2;\n config = new Array(2);\n extension_sampling_index = sampling_index;\n } else {\n // for other browsers, e.g. chrome...\n // Always use HE-AAC to make it easier to switch aac codec profile\n audio_object_type = 5;\n extension_sampling_index = sampling_index;\n config = new Array(4);\n\n if (sampling_index >= 6) {\n extension_sampling_index = sampling_index - 3;\n } else if (channel_config === 1) { // Mono channel\n audio_object_type = 2;\n config = new Array(2);\n extension_sampling_index = sampling_index;\n }\n }\n\n config[0] = audio_object_type << 3;\n config[0] |= (sampling_index & 0x0F) >>> 1;\n config[1] = (sampling_index & 0x0F) << 7;\n config[1] |= (channel_config & 0x0F) << 3;\n if (audio_object_type === 5) {\n config[1] |= ((extension_sampling_index & 0x0F) >>> 1);\n config[2] = (extension_sampling_index & 0x01) << 7;\n // extended audio object type: force to 2 (LC-AAC)\n config[2] |= (2 << 2);\n config[3] = 0;\n }\n\n this.config = config;\n this.sampling_rate = MPEG4SamplingFrequencies[sampling_index];\n this.channel_count = channel_config;\n this.codec_mimetype = 'mp4a.40.' + audio_object_type;\n this.original_codec_mimetype = 'mp4a.40.' + original_audio_object_type;\n }\n}\n","// ISO/IEC 13818-1 PES packets containing private data (stream_type=0x06)\nexport class PESPrivateData {\n pid: number;\n stream_id: number;\n pts?: number;\n dts?: number;\n nearest_pts?: number;\n data: Uint8Array;\n len: number;\n}\n\nexport class PESPrivateDataDescriptor {\n pid: number;\n stream_type: number;\n descriptor: Uint8Array;\n}\n","import Log from \"../utils/logger\";\n\nexport enum H265NaluType {\n kSliceIDR_W_RADL = 19,\n kSliceIDR_N_LP = 20,\n kSliceCRA_NUT = 21,\n kSliceVPS = 32,\n kSliceSPS = 33,\n kSlicePPS = 34,\n kSliceAUD = 35,\n}\n\nexport class H265NaluPayload {\n type: H265NaluType;\n data: Uint8Array;\n}\n\nexport class H265NaluHVC1 {\n type: H265NaluType;\n data: Uint8Array;\n\n constructor(nalu: H265NaluPayload) {\n let nalu_size = nalu.data.byteLength;\n\n this.type = nalu.type;\n this.data = new Uint8Array(4 + nalu_size); // 4 byte length-header + nalu payload\n\n let v = new DataView(this.data.buffer);\n // Fill 4 byte length-header\n v.setUint32(0, nalu_size);\n // Copy payload\n this.data.set(nalu.data, 4);\n }\n}\n\nexport class H265AnnexBParser {\n\n private readonly TAG: string = \"H265AnnexBParser\";\n\n private data_: Uint8Array;\n private current_startcode_offset_: number = 0;\n private eof_flag_: boolean = false;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_startcode_offset_ = this.findNextStartCodeOffset(0);\n if (this.eof_flag_) {\n Log.e(this.TAG, \"Could not find H265 startcode until payload end!\");\n }\n }\n\n private findNextStartCodeOffset(start_offset: number) {\n let i = start_offset;\n let data = this.data_;\n\n while (true) {\n if (i + 3 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 00 00 00 01 or 00 00 01\n let uint32 = (data[i + 0] << 24)\n | (data[i + 1] << 16)\n | (data[i + 2] << 8)\n | (data[i + 3]);\n let uint24 = (data[i + 0] << 16)\n | (data[i + 1] << 8)\n | (data[i + 2]);\n if (uint32 === 0x00000001 || uint24 === 0x000001) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextNaluPayload(): H265NaluPayload | null {\n let data = this.data_;\n let nalu_payload: H265NaluPayload = null;\n\n while (nalu_payload == null) {\n if (this.eof_flag_) {\n break;\n }\n // offset pointed to start code\n let startcode_offset = this.current_startcode_offset_;\n\n // nalu payload start offset\n let offset = startcode_offset;\n let u32 = (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | (data[offset + 3]);\n if (u32 === 0x00000001) {\n offset += 4;\n } else {\n offset += 3;\n }\n\n let nalu_type: H265NaluType = (data[offset] >> 1) & 0x3F;\n let forbidden_bit = (data[offset] & 0x80) >>> 7;\n\n let next_startcode_offset = this.findNextStartCodeOffset(offset);\n this.current_startcode_offset_ = next_startcode_offset;\n\n if (forbidden_bit !== 0) {\n // Log.e(this.TAG, `forbidden_bit near offset ${offset} should be 0 but has value ${forbidden_bit}`);\n continue;\n }\n\n let payload_data = data.subarray(offset, next_startcode_offset);\n\n nalu_payload = new H265NaluPayload();\n nalu_payload.type = nalu_type;\n nalu_payload.data = payload_data;\n }\n\n return nalu_payload;\n }\n\n}\n\nexport type HEVCDecoderConfigurationRecordType = {\n configurationVersion: 1;\n} & VPSHEVCDecoderConfigurationRecordType & SPSHEVCDecoderConfigurationRecordType & PPSHEVCDecoderConfigurationRecordType;\n\nexport type VPSHEVCDecoderConfigurationRecordType = {\n num_temporal_layers: number;\n temporal_id_nested: boolean;\n}\n\nexport type SPSHEVCDecoderConfigurationRecordType = {\n general_profile_space: number;\n general_tier_flag: number;\n general_level_idc: number;\n general_profile_idc: number;\n general_profile_compatibility_flags_1: number;\n general_profile_compatibility_flags_2: number;\n general_profile_compatibility_flags_3: number;\n general_profile_compatibility_flags_4: number;\n general_constraint_indicator_flags_1: number;\n general_constraint_indicator_flags_2: number;\n general_constraint_indicator_flags_3: number;\n general_constraint_indicator_flags_4: number;\n general_constraint_indicator_flags_5: number;\n general_constraint_indicator_flags_6: number;\n constant_frame_rate: number;\n min_spatial_segmentation_idc: number;\n chroma_format_idc: number,\n bit_depth_luma_minus8: number,\n bit_depth_chroma_minus8: number,\n}\n\nexport type PPSHEVCDecoderConfigurationRecordType = {\n parallelismType: number;\n}\n\nexport class HEVCDecoderConfigurationRecord {\n\n private data: Uint8Array;\n\n // sps, pps: require Nalu without 4 byte length-header\n public constructor(vps: Uint8Array, sps: Uint8Array, pps: Uint8Array, detail: HEVCDecoderConfigurationRecordType) {\n let length = 23 + (3 + 2 + vps.byteLength) + (3 + 2 + sps.byteLength) + (3 + 2 + pps.byteLength);\n let data = this.data = new Uint8Array(length);\n\n data[0] = 0x01; // configurationVersion\n data[1] = ((detail.general_profile_space & 0x03) << 6) | ((detail.general_tier_flag ? 1 : 0) << 5) | ((detail.general_profile_idc & 0x1F));\n data[2] = detail.general_profile_compatibility_flags_1;\n data[3] = detail.general_profile_compatibility_flags_2;\n data[4] = detail.general_profile_compatibility_flags_3;\n data[5] = detail.general_profile_compatibility_flags_4;\n data[6] = detail.general_constraint_indicator_flags_1;\n data[7] = detail.general_constraint_indicator_flags_2;\n data[8] = detail.general_constraint_indicator_flags_3;\n data[9] = detail.general_constraint_indicator_flags_4;\n data[10] = detail.general_constraint_indicator_flags_5;\n data[11] = detail.general_constraint_indicator_flags_6;\n data[12] = detail.general_level_idc;\n data[13] = 0xF0 | ((detail.min_spatial_segmentation_idc & 0x0F00) >> 8)\n data[14] = (detail.min_spatial_segmentation_idc & 0xFF);\n data[15] = 0xFC | (detail.parallelismType & 0x03);\n data[16] = 0xFC | (detail.chroma_format_idc & 0x03);\n data[17] = 0xF8 | (detail.bit_depth_luma_minus8 & 0x07);\n data[18] = 0xF8 | (detail.bit_depth_chroma_minus8 & 0x07);\n data[19] = 0;\n data[20] = 0;\n data[21] = ((detail.constant_frame_rate & 0x03) << 6) | ((detail.num_temporal_layers & 0x07) << 3) | ((detail.temporal_id_nested ? 1 : 0) << 2) | 3;\n data[22] = 3;\n data[23 + 0 + 0] = 0x80 | H265NaluType.kSliceVPS;\n data[23 + 0 + 1] = 0;\n data[23 + 0 + 2] = 1;\n data[23 + 0 + 3] = (vps.byteLength & 0xFF00) >> 8;\n data[23 + 0 + 4] = (vps.byteLength & 0x00FF) >> 0;\n data.set(vps, 23 + 0 + 5);\n data[23 + (5 + vps.byteLength) + 0] = 0x80 | H265NaluType.kSliceSPS;\n data[23 + (5 + vps.byteLength) + 1] = 0;\n data[23 + (5 + vps.byteLength) + 2] = 1;\n data[23 + (5 + vps.byteLength) + 3] = (sps.byteLength & 0xFF00) >> 8;\n data[23 + (5 + vps.byteLength) + 4] = (sps.byteLength & 0x00FF) >> 0;\n data.set(sps, 23 + (5 + vps.byteLength) + 5);\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 0] = 0x80 | H265NaluType.kSlicePPS;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 1] = 0;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 2] = 1;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 3] = (pps.byteLength & 0xFF00) >> 8;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 4] = (pps.byteLength & 0x00FF) >> 0;\n data.set(pps, 23 + (5 + vps.byteLength + 5 + sps.byteLength) + 5);\n }\n\n public getData() {\n return this.data;\n }\n\n}\n","import ExpGolomb from \"./exp-golomb\";\n\nexport class SMPTE2038Data {\n pid: number;\n stream_id: number;\n pts?: number;\n dts?: number;\n nearest_pts?: number;\n ancillaries: AncillaryData[];\n data: Uint8Array;\n len: number;\n}\n\ntype AncillaryData = {\n yc_indicator: boolean;\n line_number: number;\n horizontal_offset: number;\n did: number;\n sdid: number;\n user_data: Uint8Array;\n description: string;\n information: any;\n}\n\n\nexport const smpte2038parse = (data: Uint8Array) => {\n let gb = new ExpGolomb(data);\n let readBits = 0;\n\n let ancillaries: AncillaryData[] = [];\n while (true) {\n let zero = gb.readBits(6); readBits += 6;\n if (zero !== 0) { break; }\n let YC_indicator = gb.readBool(); readBits += 1;\n let line_number = gb.readBits(11); readBits += 11;\n let horizontal_offset = gb.readBits(12); readBits += 12;\n let data_ID = gb.readBits(10) & 0xFF; readBits += 10;\n let data_SDID = gb.readBits(10) & 0xFF; readBits += 10;\n let data_count = gb.readBits(10) & 0xFF; readBits += 10;\n let user_data = new Uint8Array(data_count);\n for (let i = 0; i < data_count; i++) {\n let user_data_word = gb.readBits(10) & 0xFF; readBits += 10;\n user_data[i] = user_data_word;\n }\n let checksum_word = gb.readBits(10); readBits += 10;\n\n let description = 'User Defined';\n let information: any = {};\n if (data_ID === 0x41) {\n if (data_SDID === 0x07) {\n description = 'SCTE-104'\n }\n } else if (data_ID === 0x5F) {\n if (data_SDID === 0xDC) {\n description = 'ARIB STD-B37 (1SEG)';\n } else if (data_SDID === 0xDD) {\n description = 'ARIB STD-B37 (ANALOG)';\n } else if (data_SDID === 0xDE) {\n description = 'ARIB STD-B37 (SD)';\n } else if (data_SDID === 0xDF) {\n description = 'ARIB STD-B37 (HD)';\n }\n } else if (data_ID === 0x61) {\n if (data_SDID === 0x01) {\n description = 'EIA-708';\n } else if (data_SDID === 0x02) {\n description = 'EIA-608';\n }\n }\n\n ancillaries.push({\n yc_indicator: YC_indicator,\n line_number,\n horizontal_offset,\n did: data_ID,\n sdid: data_SDID,\n user_data,\n description,\n information\n });\n gb.readBits(8 - (readBits - Math.floor(readBits / 8)) % 8);\n readBits += (8 - (readBits - Math.floor(readBits / 8))) % 8;\n }\n\n gb.destroy();\n gb = null;\n\n return ancillaries;\n}","export class MP3Data {\n object_type: number;\n sample_rate: number;\n channel_count: number;\n\n data: Uint8Array;\n}\n","import Log from \"../utils/logger\";\nimport ExpGolomb from \"./exp-golomb\";\nimport { MPEG4AudioObjectTypes, MPEG4SamplingFrequencies, MPEG4SamplingFrequencyIndex } from \"./mpeg4-audio\";\n\nexport class AC3Frame {\n sampling_frequency: number;\n sampling_rate_code: number;\n bit_stream_identification: number;\n bit_stream_mode: number;\n low_frequency_effects_channel_on: number;\n frame_size_code: number;\n channel_count: number;\n channel_mode: number;\n\n data: Uint8Array;\n}\n\nconst frame_size_code_table = [\n [\n 64, 64, 80, 80, 96, 96, 112, 112, 128, 128,\n 160, 160, 192, 192, 224, 224, 256, 256, 320, 320,\n 384, 384, 448, 448, 512, 512, 640, 640, 768, 768,\n 896, 896, 1024, 1024, 1152, 1152, 1280, 1280,\n ],\n [\n 69, 70, 87, 88, 104, 105, 121, 122, 139, 140,\n 174, 175, 208, 209, 243, 244, 278, 279, 348, 349,\n 417, 418, 487, 488, 557, 558, 696, 697, 835, 836,\n 975, 976, 1114, 1115, 1253, 1254, 1393, 1394\n ],\n [\n 96, 96, 120, 120, 144, 144, 168, 168, 192, 192,\n 240, 240, 288, 288, 336, 336, 384, 384, 480, 480,\n 576, 576, 672, 672, 768, 768, 960, 960, 1152, 1152,\n 1344, 1344, 1536, 1536, 1728, 1728, 1920, 1920,\n ],\n]\n\nexport class AC3Parser {\n\n private readonly TAG: string = \"AC3Parser\";\n\n private data_: Uint8Array;\n private current_syncword_offset_: number;\n private eof_flag_: boolean;\n private has_last_incomplete_data: boolean;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_syncword_offset_ = this.findNextSyncwordOffset(0);\n if (this.eof_flag_) {\n Log.e(this.TAG, `Could not found AC3 syncword until payload end`);\n }\n }\n\n private findNextSyncwordOffset(syncword_offset: number): number {\n let i = syncword_offset;\n let data = this.data_;\n\n while (true) {\n if (i + 7 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 16-bit 0x0B77 syncword\n let syncword = (data[i + 0] << 8) | (data[i + 1] << 0)\n if (syncword === 0x0B77) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextAC3Frame(): AC3Frame | null {\n let data = this.data_;\n let ac3_frame: AC3Frame = null;\n\n while (ac3_frame == null) {\n if (this.eof_flag_) {\n break;\n }\n\n let syncword_offset = this.current_syncword_offset_;\n let offset = syncword_offset;\n\n let sampling_rate_code = data[offset + 4] >> 6;\n let sampling_frequency = [48000, 44200, 33000][sampling_rate_code];\n\n let frame_size_code = data[offset + 4] & 0x3F;\n let frame_size = frame_size_code_table[sampling_rate_code][frame_size_code] * 2;\n\n if (offset + frame_size > this.data_.byteLength) {\n // data not enough for extracting last sample\n this.eof_flag_ = true;\n this.has_last_incomplete_data = true;\n break;\n }\n\n let next_syncword_offset = this.findNextSyncwordOffset(offset + frame_size);\n this.current_syncword_offset_ = next_syncword_offset;\n\n let bit_stream_identification = data[offset + 5] >> 3;\n let bit_stream_mode = data[offset + 5] & 0x07;\n\n let channel_mode = data[offset + 6] >> 5;\n\n let lfe_skip = 0;\n if ((channel_mode & 0x01) !== 0 && channel_mode !== 1) { lfe_skip += 2; }\n if ((channel_mode & 0x04) !== 0) { lfe_skip += 2; }\n if (channel_mode === 0x02) { lfe_skip += 2; }\n\n let low_frequency_effects_channel_on = (((data[offset + 6] << 8) | (data[offset + 7] << 0)) >> (12 - lfe_skip)) & 0x01;\n\n let channel_count = [2, 1, 2, 3, 3, 4, 4, 5][channel_mode] + low_frequency_effects_channel_on;\n\n ac3_frame = new AC3Frame();\n ac3_frame.sampling_frequency = sampling_frequency;\n ac3_frame.channel_count = channel_count;\n ac3_frame.channel_mode = channel_mode;\n ac3_frame.bit_stream_identification = bit_stream_identification;\n ac3_frame.low_frequency_effects_channel_on = low_frequency_effects_channel_on;\n ac3_frame.bit_stream_mode = bit_stream_mode;\n ac3_frame.frame_size_code = frame_size_code;\n ac3_frame.data = data.subarray(offset, offset + frame_size);\n }\n\n return ac3_frame;\n }\n\n public hasIncompleteData(): boolean {\n return this.has_last_incomplete_data;\n }\n\n public getIncompleteData(): Uint8Array {\n if (!this.has_last_incomplete_data) {\n return null;\n }\n\n return this.data_.subarray(this.current_syncword_offset_);\n }\n}\n\n\nexport class AC3Config {\n\n public config: Array;\n public sampling_rate: number;\n public bit_stream_identification: number;\n public bit_stream_mode: number;\n public low_frequency_effects_channel_on: number;\n public channel_count: number;\n public channel_mode: number;\n public codec_mimetype: string;\n public original_codec_mimetype: string;\n\n public constructor(frame: AC3Frame) {\n let config: Array = null;\n\n config = [\n (frame.sampling_rate_code << 6) | (frame.bit_stream_identification << 1) | (frame.bit_stream_mode >> 2),\n ((frame.bit_stream_mode & 0x03) << 6) | (frame.channel_mode << 3) | (frame.low_frequency_effects_channel_on << 2) | (frame.frame_size_code >> 4),\n (frame.frame_size_code << 4) & 0xE0,\n ]\n\n this.config = config;\n this.sampling_rate = frame.sampling_frequency;\n this.bit_stream_identification = frame.bit_stream_identification;\n this.bit_stream_mode = frame.bit_stream_mode;\n this.low_frequency_effects_channel_on = frame.low_frequency_effects_channel_on;\n this.channel_count = frame.channel_count;\n this.channel_mode = frame.channel_mode;\n this.codec_mimetype = 'ac-3';\n this.original_codec_mimetype = 'ac-3';\n }\n}\n","/*\n * Copyright (C) 2021 magicxqq. All Rights Reserved.\n *\n * @author magicxqq \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger';\nimport DemuxErrors from './demux-errors';\nimport MediaInfo from '../core/media-info';\nimport {IllegalStateException} from '../utils/exception';\nimport BaseDemuxer from './base-demuxer';\nimport { PAT, PESData, SectionData, SliceQueue, PIDToSliceQueues, PMT, ProgramToPMTMap, StreamType } from './pat-pmt-pes';\nimport { AVCDecoderConfigurationRecord, H264AnnexBParser, H264NaluAVC1, H264NaluPayload, H264NaluType } from './h264';\nimport SPSParser from './sps-parser';\nimport { AACADTSParser, AACFrame, AACLOASParser, AudioSpecificConfig, LOASAACFrame } from './aac';\nimport { MPEG4AudioObjectTypes, MPEG4SamplingFrequencyIndex } from './mpeg4-audio';\nimport { PESPrivateData, PESPrivateDataDescriptor } from './pes-private-data';\nimport { readSCTE35, SCTE35Data } from './scte35';\nimport { H265AnnexBParser, H265NaluHVC1, H265NaluPayload, H265NaluType, HEVCDecoderConfigurationRecord } from './h265';\nimport H265Parser from './h265-parser';\nimport { SMPTE2038Data, smpte2038parse } from './smpte2038';\nimport { MP3Data } from './mp3';\nimport { AC3Config, AC3Frame, AC3Parser } from './ac3';\n\ntype AACAudioMetadata = {\n codec: 'aac',\n audio_object_type: MPEG4AudioObjectTypes;\n sampling_freq_index: MPEG4SamplingFrequencyIndex;\n sampling_frequency: number;\n channel_config: number;\n};\ntype AC3AudioMetadata = {\n codec: 'ac-3',\n sampling_frequency: number;\n bit_stream_identification: number;\n bit_stream_mode: number;\n low_frequency_effects_channel_on: number;\n channel_mode: number;\n};\ntype OpusAudioMetadata = {\n codec: 'opus';\n channel_count: number;\n channel_config_code: number;\n sample_rate: number;\n}\ntype MP3AudioMetadata = {\n codec: 'mp3',\n object_type: number,\n sample_rate: number,\n channel_count: number;\n};\ntype AudioData = {\n codec: 'aac';\n data: AACFrame;\n} | {\n codec: 'ac-3';\n data: AC3Frame,\n} | {\n codec: 'opus';\n meta: OpusAudioMetadata,\n} | {\n codec: 'mp3';\n data: MP3Data;\n}\n\nclass TSDemuxer extends BaseDemuxer {\n\n private readonly TAG: string = 'TSDemuxer';\n\n private config_: any;\n private ts_packet_size_: number;\n private sync_offset_: number;\n private first_parse_: boolean = true;\n\n private media_info_ = new MediaInfo();\n\n private timescale_ = 90;\n private duration_ = 0;\n\n private pat_: PAT;\n private current_program_: number;\n private current_pmt_pid_: number = -1;\n private pmt_: PMT;\n private program_pmt_map_: ProgramToPMTMap = {};\n\n private pes_slice_queues_: PIDToSliceQueues = {};\n private section_slice_queues_: PIDToSliceQueues = {};\n\n private video_metadata_: {\n vps: H265NaluHVC1 | undefined,\n sps: H264NaluAVC1 | H265NaluHVC1 | undefined,\n pps: H264NaluAVC1 | H265NaluHVC1 | undefined,\n details: any\n } = {\n vps: undefined,\n sps: undefined,\n pps: undefined,\n details: undefined\n };\n\n private audio_metadata_: AACAudioMetadata | AC3AudioMetadata | OpusAudioMetadata | MP3AudioMetadata = {\n codec: undefined,\n audio_object_type: undefined,\n sampling_freq_index: undefined,\n sampling_frequency: undefined,\n channel_config: undefined\n };\n\n private aac_last_sample_pts_: number = undefined;\n private aac_last_incomplete_data_: Uint8Array = null;\n\n private has_video_ = false;\n private has_audio_ = false;\n private video_init_segment_dispatched_ = false;\n private audio_init_segment_dispatched_ = false;\n private video_metadata_changed_ = false;\n private audio_metadata_changed_ = false;\n private loas_previous_frame: LOASAACFrame | null = null;\n\n private video_track_ = {type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0};\n private audio_track_ = {type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0};\n\n public constructor(probe_data: any, config: any) {\n super();\n\n this.ts_packet_size_ = probe_data.ts_packet_size;\n this.sync_offset_ = probe_data.sync_offset;\n this.config_ = config;\n }\n\n public destroy() {\n this.media_info_ = null;\n this.pes_slice_queues_ = null;\n this.section_slice_queues_ = null;\n\n this.video_metadata_ = null;\n this.audio_metadata_ = null;\n this.aac_last_incomplete_data_ = null;\n\n this.video_track_ = null;\n this.audio_track_ = null;\n\n super.destroy();\n }\n\n public static probe(buffer: ArrayBuffer) {\n let data = new Uint8Array(buffer);\n let sync_offset = -1;\n let ts_packet_size = 188;\n\n if (data.byteLength <= 3 * ts_packet_size) {\n return {needMoreData: true};\n }\n\n while (sync_offset === -1) {\n let scan_window = Math.min(1000, data.byteLength - 3 * ts_packet_size);\n\n for (let i = 0; i < scan_window; ) {\n // sync_byte should all be 0x47\n if (data[i] === 0x47\n && data[i + ts_packet_size] === 0x47\n && data[i + 2 * ts_packet_size] === 0x47) {\n sync_offset = i;\n break;\n } else {\n i++;\n }\n }\n\n // find sync_offset failed in previous ts_packet_size\n if (sync_offset === -1) {\n if (ts_packet_size === 188) {\n // try 192 packet size (BDAV, etc.)\n ts_packet_size = 192;\n } else if (ts_packet_size === 192) {\n // try 204 packet size (European DVB, etc.)\n ts_packet_size = 204;\n } else {\n // 192, 204 also failed, exit\n break;\n }\n }\n }\n\n if (sync_offset === -1) {\n // both 188, 192, 204 failed, Non MPEG-TS\n return {match: false};\n }\n\n if (ts_packet_size === 192 && sync_offset >= 4) {\n Log.v('TSDemuxer', `ts_packet_size = 192, m2ts mode`);\n sync_offset -= 4;\n } else if (ts_packet_size === 204) {\n Log.v('TSDemuxer', `ts_packet_size = 204, RS encoded MPEG2-TS stream`);\n }\n\n return {\n match: true,\n consumed: 0,\n ts_packet_size,\n sync_offset\n };\n }\n\n public bindDataSource(loader) {\n loader.onDataArrival = this.parseChunks.bind(this);\n return this;\n }\n\n public resetMediaInfo() {\n this.media_info_ = new MediaInfo();\n }\n\n public parseChunks(chunk: ArrayBuffer, byte_start: number): number {\n if (!this.onError\n || !this.onMediaInfo\n || !this.onTrackMetadata\n || !this.onDataAvailable) {\n throw new IllegalStateException('onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified');\n }\n\n let offset = 0;\n\n if (this.first_parse_) {\n this.first_parse_ = false;\n offset = this.sync_offset_;\n }\n\n while (offset + this.ts_packet_size_ <= chunk.byteLength) {\n let file_position = byte_start + offset;\n\n if (this.ts_packet_size_ === 192) {\n // skip ATS field (2-bits copy-control + 30-bits timestamp) for m2ts\n offset += 4;\n }\n\n let data = new Uint8Array(chunk, offset, 188);\n\n let sync_byte = data[0];\n if (sync_byte !== 0x47) {\n Log.e(this.TAG, `sync_byte = ${sync_byte}, not 0x47`);\n break;\n }\n\n let payload_unit_start_indicator = (data[1] & 0x40) >>> 6;\n let transport_priority = (data[1] & 0x20) >>> 5;\n let pid = ((data[1] & 0x1F) << 8) | data[2];\n let adaptation_field_control = (data[3] & 0x30) >>> 4;\n let continuity_conunter = (data[3] & 0x0F);\n\n let adaptation_field_info: {\n discontinuity_indicator?: number,\n random_access_indicator?: number,\n elementary_stream_priority_indicator?: number\n } = {};\n let ts_payload_start_index = 4;\n\n if (adaptation_field_control == 0x02 || adaptation_field_control == 0x03) {\n let adaptation_field_length = data[4];\n if (5 + adaptation_field_length === 188) {\n // TS packet only has adaption field, jump to next\n offset += 188;\n if (this.ts_packet_size_ === 204) {\n // skip parity word (16 bytes) for RS encoded TS\n offset += 16;\n }\n continue;\n } else {\n // parse leading adaptation_field if has payload\n if (adaptation_field_length > 0) {\n adaptation_field_info = this.parseAdaptationField(chunk,\n offset + 4,\n 1 + adaptation_field_length);\n }\n ts_payload_start_index = 4 + 1 + adaptation_field_length;\n }\n }\n\n if (adaptation_field_control == 0x01 || adaptation_field_control == 0x03) {\n if (pid === 0 || pid === this.current_pmt_pid_ || (this.pmt_ != undefined && this.pmt_.pid_stream_type[pid] === StreamType.kSCTE35)) { // PAT(pid === 0) or PMT or SCTE35\n let ts_payload_length = 188 - ts_payload_start_index;\n\n this.handleSectionSlice(chunk,\n offset + ts_payload_start_index,\n ts_payload_length,\n {\n pid,\n file_position,\n payload_unit_start_indicator,\n continuity_conunter,\n random_access_indicator: adaptation_field_info.random_access_indicator\n });\n } else if (this.pmt_ != undefined && this.pmt_.pid_stream_type[pid] != undefined) {\n // PES\n let ts_payload_length = 188 - ts_payload_start_index;\n let stream_type = this.pmt_.pid_stream_type[pid];\n\n // process PES only for known common_pids\n if (pid === this.pmt_.common_pids.h264\n || pid === this.pmt_.common_pids.h265\n || pid === this.pmt_.common_pids.adts_aac\n || pid === this.pmt_.common_pids.loas_aac\n || pid === this.pmt_.common_pids.ac3\n || pid === this.pmt_.common_pids.opus\n || pid === this.pmt_.common_pids.mp3\n || this.pmt_.pes_private_data_pids[pid] === true\n || this.pmt_.timed_id3_pids[pid] === true) {\n this.handlePESSlice(chunk,\n offset + ts_payload_start_index,\n ts_payload_length,\n {\n pid,\n stream_type,\n file_position,\n payload_unit_start_indicator,\n continuity_conunter,\n random_access_indicator: adaptation_field_info.random_access_indicator\n });\n }\n }\n }\n\n offset += 188;\n\n if (this.ts_packet_size_ === 204) {\n // skip parity word (16 bytes) for RS encoded TS\n offset += 16;\n }\n }\n\n // dispatch parsed frames to the remuxer (consumer)\n this.dispatchAudioVideoMediaSegment();\n\n return offset; // consumed bytes\n }\n\n private parseAdaptationField(buffer: ArrayBuffer, offset: number, length: number): {\n discontinuity_indicator?: number,\n random_access_indicator?: number,\n elementary_stream_priority_indicator?: number\n } {\n let data = new Uint8Array(buffer, offset, length);\n\n let adaptation_field_length = data[0];\n if (adaptation_field_length > 0) {\n if (adaptation_field_length > 183) {\n Log.w(this.TAG, `Illegal adaptation_field_length: ${adaptation_field_length}`);\n return {};\n }\n\n let discontinuity_indicator: number = (data[1] & 0x80) >>> 7;\n let random_access_indicator: number = (data[1] & 0x40) >>> 6;\n let elementary_stream_priority_indicator: number = (data[1] & 0x20) >>> 5;\n\n return {\n discontinuity_indicator,\n random_access_indicator,\n elementary_stream_priority_indicator\n };\n }\n\n return {};\n }\n\n private handleSectionSlice(buffer: ArrayBuffer, offset: number, length: number, misc: any): void {\n let data = new Uint8Array(buffer, offset, length);\n let slice_queue = this.section_slice_queues_[misc.pid];\n\n if (misc.payload_unit_start_indicator) {\n let pointer_field = data[0];\n\n if (slice_queue != undefined && slice_queue.total_length !== 0) {\n let remain_section = new Uint8Array(buffer, offset + 1, Math.min(length, pointer_field));\n slice_queue.slices.push(remain_section);\n slice_queue.total_length += remain_section.byteLength;\n\n if (slice_queue.total_length === slice_queue.expected_length) {\n this.emitSectionSlices(slice_queue, misc);\n } else {\n this.clearSlices(slice_queue, misc);\n }\n }\n\n for (let i = 1 + pointer_field; i < data.byteLength; ){\n let table_id = data[i + 0];\n if (table_id === 0xFF) { break; }\n\n let section_length = ((data[i + 1] & 0x0F) << 8) | data[i + 2];\n\n this.section_slice_queues_[misc.pid] = new SliceQueue();\n slice_queue = this.section_slice_queues_[misc.pid];\n\n slice_queue.expected_length = section_length + 3;\n slice_queue.file_position = misc.file_position;\n slice_queue.random_access_indicator = misc.random_access_indicator;\n\n let remain_section = new Uint8Array(buffer, offset + i, Math.min(length - i, slice_queue.expected_length - slice_queue.total_length));\n slice_queue.slices.push(remain_section);\n slice_queue.total_length += remain_section.byteLength;\n\n if (slice_queue.total_length === slice_queue.expected_length) {\n this.emitSectionSlices(slice_queue, misc);\n } else if (slice_queue.total_length >= slice_queue.expected_length) {\n this.clearSlices(slice_queue, misc);\n }\n\n i += remain_section.byteLength;\n }\n } else if (slice_queue != undefined && slice_queue.total_length !== 0) {\n let remain_section = new Uint8Array(buffer, offset, Math.min(length, slice_queue.expected_length - slice_queue.total_length));\n slice_queue.slices.push(remain_section);\n slice_queue.total_length += remain_section.byteLength;\n\n if (slice_queue.total_length === slice_queue.expected_length) {\n this.emitSectionSlices(slice_queue, misc);\n } else if (slice_queue.total_length >= slice_queue.expected_length) {\n this.clearSlices(slice_queue, misc);\n }\n }\n }\n\n private handlePESSlice(buffer: ArrayBuffer, offset: number, length: number, misc: any): void {\n let data = new Uint8Array(buffer, offset, length);\n\n let packet_start_code_prefix = (data[0] << 16) | (data[1] << 8) | (data[2]);\n let stream_id = data[3];\n let PES_packet_length = (data[4] << 8) | data[5];\n\n if (misc.payload_unit_start_indicator) {\n if (packet_start_code_prefix !== 1) {\n Log.e(this.TAG, `handlePESSlice: packet_start_code_prefix should be 1 but with value ${packet_start_code_prefix}`);\n return;\n }\n\n // handle queued PES slices:\n // Merge into a big Uint8Array then call parsePES()\n let slice_queue = this.pes_slice_queues_[misc.pid];\n if (slice_queue) {\n if (slice_queue.expected_length === 0 || slice_queue.expected_length === slice_queue.total_length) {\n this.emitPESSlices(slice_queue, misc);\n } else {\n this.clearSlices(slice_queue, misc);\n }\n }\n\n // Make a new PES queue for new PES slices\n this.pes_slice_queues_[misc.pid] = new SliceQueue();\n this.pes_slice_queues_[misc.pid].file_position = misc.file_position;\n this.pes_slice_queues_[misc.pid].random_access_indicator = misc.random_access_indicator;\n }\n\n if (this.pes_slice_queues_[misc.pid] == undefined) {\n // ignore PES slices without [PES slice that has payload_unit_start_indicator]\n return;\n }\n\n // push subsequent PES slices into pes_queue\n let slice_queue = this.pes_slice_queues_[misc.pid];\n slice_queue.slices.push(data);\n if (misc.payload_unit_start_indicator) {\n slice_queue.expected_length = PES_packet_length === 0 ? 0 : PES_packet_length + 6;\n }\n slice_queue.total_length += data.byteLength;\n\n if (slice_queue.expected_length > 0 && slice_queue.expected_length === slice_queue.total_length) {\n this.emitPESSlices(slice_queue, misc);\n } else if (slice_queue.expected_length > 0 && slice_queue.expected_length < slice_queue.total_length) {\n this.clearSlices(slice_queue, misc);\n }\n }\n\n private emitSectionSlices(slice_queue: SliceQueue, misc: any): void {\n let data = new Uint8Array(slice_queue.total_length);\n for (let i = 0, offset = 0; i < slice_queue.slices.length; i++) {\n let slice = slice_queue.slices[i];\n data.set(slice, offset);\n offset += slice.byteLength;\n }\n slice_queue.slices = [];\n slice_queue.expected_length = -1;\n slice_queue.total_length = 0;\n\n let section_data = new SectionData();\n section_data.pid = misc.pid;\n section_data.data = data;\n section_data.file_position = slice_queue.file_position;\n section_data.random_access_indicator = slice_queue.random_access_indicator;\n this.parseSection(section_data);\n }\n\n private emitPESSlices(slice_queue: SliceQueue, misc: any): void {\n let data = new Uint8Array(slice_queue.total_length);\n for (let i = 0, offset = 0; i < slice_queue.slices.length; i++) {\n let slice = slice_queue.slices[i];\n data.set(slice, offset);\n offset += slice.byteLength;\n }\n slice_queue.slices = [];\n slice_queue.expected_length = -1;\n slice_queue.total_length = 0;\n\n let pes_data = new PESData();\n pes_data.pid = misc.pid;\n pes_data.data = data;\n pes_data.stream_type = misc.stream_type;\n pes_data.file_position = slice_queue.file_position;\n pes_data.random_access_indicator = slice_queue.random_access_indicator;\n this.parsePES(pes_data);\n }\n\n private clearSlices(slice_queue: SliceQueue, misc: any): void {\n slice_queue.slices = [];\n slice_queue.expected_length = -1;\n slice_queue.total_length = 0;\n }\n\n private parseSection(section_data: SectionData): void {\n let data = section_data.data;\n let pid = section_data.pid;\n\n if (pid === 0x00) {\n this.parsePAT(data);\n } else if (pid === this.current_pmt_pid_) {\n this.parsePMT(data);\n } else if (this.pmt_ != undefined && this.pmt_.scte_35_pids[pid]) {\n this.parseSCTE35(data);\n }\n }\n\n private parsePES(pes_data: PESData): void {\n let data = pes_data.data;\n let packet_start_code_prefix = (data[0] << 16) | (data[1] << 8) | (data[2]);\n let stream_id = data[3];\n let PES_packet_length = (data[4] << 8) | data[5];\n\n if (packet_start_code_prefix !== 1) {\n Log.e(this.TAG, `parsePES: packet_start_code_prefix should be 1 but with value ${packet_start_code_prefix}`);\n return;\n }\n\n if (stream_id !== 0xBC // program_stream_map\n && stream_id !== 0xBE // padding_stream\n && stream_id !== 0xBF // private_stream_2\n && stream_id !== 0xF0 // ECM\n && stream_id !== 0xF1 // EMM\n && stream_id !== 0xFF // program_stream_directory\n && stream_id !== 0xF2 // DSMCC\n && stream_id !== 0xF8) {\n let PES_scrambling_control = (data[6] & 0x30) >>> 4;\n let PTS_DTS_flags = (data[7] & 0xC0) >>> 6;\n let PES_header_data_length = data[8];\n\n let pts: number | undefined;\n let dts: number | undefined;\n\n if (PTS_DTS_flags === 0x02 || PTS_DTS_flags === 0x03) {\n pts = (data[9] & 0x0E) * 536870912 + // 1 << 29\n (data[10] & 0xFF) * 4194304 + // 1 << 22\n (data[11] & 0xFE) * 16384 + // 1 << 14\n (data[12] & 0xFF) * 128 + // 1 << 7\n (data[13] & 0xFE) / 2;\n\n if (PTS_DTS_flags === 0x03) {\n dts = (data[14] & 0x0E) * 536870912 + // 1 << 29\n (data[15] & 0xFF) * 4194304 + // 1 << 22\n (data[16] & 0xFE) * 16384 + // 1 << 14\n (data[17] & 0xFF) * 128 + // 1 << 7\n (data[18] & 0xFE) / 2;\n } else {\n dts = pts;\n }\n }\n\n let payload_start_index = 6 + 3 + PES_header_data_length;\n let payload_length: number;\n\n if (PES_packet_length !== 0) {\n if (PES_packet_length < 3 + PES_header_data_length) {\n Log.v(this.TAG, `Malformed PES: PES_packet_length < 3 + PES_header_data_length`);\n return;\n }\n payload_length = PES_packet_length - 3 - PES_header_data_length;\n } else { // PES_packet_length === 0\n payload_length = data.byteLength - payload_start_index;\n }\n\n let payload = data.subarray(payload_start_index, payload_start_index + payload_length);\n\n switch (pes_data.stream_type) {\n case StreamType.kMPEG1Audio:\n case StreamType.kMPEG2Audio:\n this.parseMP3Payload(payload, pts);\n break;\n case StreamType.kPESPrivateData:\n if (this.pmt_.common_pids.opus === pes_data.pid) {\n this.parseOpusPayload(payload, pts);\n } else if (this.pmt_.common_pids.ac3 === pes_data.pid) {\n this.parseAC3Payload(payload, pts);\n } else if (this.pmt_.smpte2038_pids[pes_data.pid]) {\n this.parseSMPTE2038MetadataPayload(payload, pts, dts, pes_data.pid, stream_id);\n } else {\n this.parsePESPrivateDataPayload(payload, pts, dts, pes_data.pid, stream_id);\n }\n break;\n case StreamType.kADTSAAC:\n this.parseADTSAACPayload(payload, pts);\n break;\n case StreamType.kLOASAAC:\n this.parseLOASAACPayload(payload, pts);\n break;\n case StreamType.kAC3:\n this.parseAC3Payload(payload, pts);\n break;\n case StreamType.kID3:\n this.parseTimedID3MetadataPayload(payload, pts, dts, pes_data.pid, stream_id);\n break;\n case StreamType.kH264:\n this.parseH264Payload(payload, pts, dts, pes_data.file_position, pes_data.random_access_indicator);\n break;\n case StreamType.kH265:\n this.parseH265Payload(payload, pts, dts, pes_data.file_position, pes_data.random_access_indicator);\n break;\n default:\n break;\n }\n } else if (stream_id === 0xBC // program_stream_map\n || stream_id === 0xBF // private_stream_2\n || stream_id === 0xF0 // ECM\n || stream_id === 0xF1 // EMM\n || stream_id === 0xFF // program_stream_directory\n || stream_id === 0xF2 // DSMCC_stream\n || stream_id === 0xF8) { // ITU-T Rec. H.222.1 type E stream\n if (pes_data.stream_type === StreamType.kPESPrivateData) {\n let payload_start_index = 6;\n let payload_length: number;\n\n if (PES_packet_length !== 0) {\n payload_length = PES_packet_length;\n } else { // PES_packet_length === 0\n payload_length = data.byteLength - payload_start_index;\n }\n\n let payload = data.subarray(payload_start_index, payload_start_index + payload_length);\n this.parsePESPrivateDataPayload(payload, undefined, undefined, pes_data.pid, stream_id);\n }\n }\n }\n\n private parsePAT(data: Uint8Array): void {\n let table_id = data[0];\n if (table_id !== 0x00) {\n Log.e(this.TAG, `parsePAT: table_id ${table_id} is not corresponded to PAT!`);\n return;\n }\n\n let section_length = ((data[1] & 0x0F) << 8) | data[2];\n\n let transport_stream_id = (data[3] << 8) | data[4];\n let version_number = (data[5] & 0x3E) >>> 1;\n let current_next_indicator = data[5] & 0x01;\n let section_number = data[6];\n let last_section_number = data[7];\n\n let pat: PAT = null;\n\n if (current_next_indicator === 1 && section_number === 0) {\n pat = new PAT();\n pat.version_number = version_number;\n } else {\n pat = this.pat_;\n if (pat == undefined) {\n return;\n }\n }\n\n let program_start_index = 8;\n let program_bytes = section_length - 5 - 4; // section_length - (headers + crc)\n let first_program_number = -1;\n let first_pmt_pid = -1;\n\n for (let i = program_start_index; i < program_start_index + program_bytes; i += 4) {\n let program_number = (data[i] << 8) | data[i + 1];\n let pid = ((data[i + 2] & 0x1F) << 8) | data[i + 3];\n\n if (program_number === 0) {\n // network_PID\n pat.network_pid = pid;\n } else {\n // program_map_PID\n pat.program_pmt_pid[program_number] = pid;\n\n if (first_program_number === -1) {\n first_program_number = program_number;\n }\n\n if (first_pmt_pid === -1) {\n first_pmt_pid = pid;\n }\n }\n }\n\n // Currently we only deal with first appeared PMT pid\n if (current_next_indicator === 1 && section_number === 0) {\n if (this.pat_ == undefined) {\n Log.v(this.TAG, `Parsed first PAT: ${JSON.stringify(pat)}`);\n }\n this.pat_ = pat;\n this.current_program_ = first_program_number;\n this.current_pmt_pid_ = first_pmt_pid;\n }\n }\n\n private parsePMT(data: Uint8Array): void {\n let table_id = data[0];\n if (table_id !== 0x02) {\n Log.e(this.TAG, `parsePMT: table_id ${table_id} is not corresponded to PMT!`);\n return;\n }\n\n let section_length = ((data[1] & 0x0F) << 8) | data[2];\n\n let program_number = (data[3] << 8) | data[4];\n let version_number = (data[5] & 0x3E) >>> 1;\n let current_next_indicator = data[5] & 0x01;\n let section_number = data[6];\n let last_section_number = data[7];\n\n let pmt: PMT = null;\n\n if (current_next_indicator === 1 && section_number === 0) {\n pmt = new PMT();\n pmt.program_number = program_number;\n pmt.version_number = version_number;\n this.program_pmt_map_[program_number] = pmt;\n } else {\n pmt = this.program_pmt_map_[program_number];\n if (pmt == undefined) {\n return;\n }\n }\n\n let PCR_PID = ((data[8] & 0x1F) << 8) | data[9];\n let program_info_length = ((data[10] & 0x0F) << 8) | data[11];\n\n let info_start_index = 12 + program_info_length;\n let info_bytes = section_length - 9 - program_info_length - 4;\n\n for (let i = info_start_index; i < info_start_index + info_bytes; ) {\n let stream_type = data[i] as StreamType;\n let elementary_PID = ((data[i + 1] & 0x1F) << 8) | data[i + 2];\n let ES_info_length = ((data[i + 3] & 0x0F) << 8) | data[i + 4];\n\n pmt.pid_stream_type[elementary_PID] = stream_type;\n\n let already_has_video = pmt.common_pids.h264 || pmt.common_pids.h265;\n let already_has_audio = pmt.common_pids.adts_aac || pmt.common_pids.loas_aac || pmt.common_pids.ac3 || pmt.common_pids.opus || pmt.common_pids.mp3;\n\n if (stream_type === StreamType.kH264 && !already_has_video) {\n pmt.common_pids.h264 = elementary_PID;\n } else if (stream_type === StreamType.kH265 && !already_has_video) {\n pmt.common_pids.h265 = elementary_PID;\n } else if (stream_type === StreamType.kADTSAAC && !already_has_audio) {\n pmt.common_pids.adts_aac = elementary_PID;\n } else if (stream_type === StreamType.kLOASAAC && !already_has_audio) {\n pmt.common_pids.loas_aac = elementary_PID;\n } else if (stream_type === StreamType.kAC3 && !already_has_audio) {\n pmt.common_pids.ac3 = elementary_PID; // ATSC AC-3\n } else if ((stream_type === StreamType.kMPEG1Audio || stream_type === StreamType.kMPEG2Audio) && !already_has_audio) {\n pmt.common_pids.mp3 = elementary_PID;\n } else if (stream_type === StreamType.kPESPrivateData) {\n pmt.pes_private_data_pids[elementary_PID] = true;\n if (ES_info_length > 0) {\n // parse descriptor for PES private data\n for (let offset = i + 5; offset < i + 5 + ES_info_length; ) {\n let tag = data[offset + 0];\n let length = data[offset + 1];\n if (tag === 0x05) { // Registration Descriptor\n let registration = String.fromCharCode(... Array.from(data.subarray(offset + 2, offset + 2 + length)));\n\n if (registration === 'VANC') {\n pmt.smpte2038_pids[elementary_PID] = true;\n } /* else if (registration === 'AC-3' && !already_has_audio) {\n pmt.common_pids.ac3 = elementary_PID; // DVB AC-3 (FIXME: NEED VERIFY)\n } */ else if (registration === 'Opus') {\n pmt.common_pids.opus = elementary_PID;\n }\n } else if (tag === 0x7F) { // DVB extension descriptor\n if (elementary_PID === pmt.common_pids.opus) {\n let ext_desc_tag = data[offset + 2];\n let channel_config_code: number | null = null;\n if (ext_desc_tag === 0x80) { // User defined (provisional Opus)\n channel_config_code = data[offset + 3];\n }\n\n if (channel_config_code == null) {\n Log.e(this.TAG, `Not Supported Opus channel count.`);\n continue;\n }\n\n const meta = {\n codec: 'opus',\n channel_count: (channel_config_code & 0x0F) === 0 ? 2 : (channel_config_code & 0x0F),\n channel_config_code,\n sample_rate: 48000\n } as const;\n const sample = {\n codec: 'opus',\n meta\n } as const;\n\n if (this.audio_init_segment_dispatched_ == false) {\n this.audio_metadata_ = meta;\n this.dispatchAudioInitSegment(sample);\n } else if (this.detectAudioMetadataChange(sample)) {\n // flush stashed frames before notify new AudioSpecificConfig\n this.dispatchAudioMediaSegment();\n // notify new AAC AudioSpecificConfig\n this.dispatchAudioInitSegment(sample);\n }\n }\n }\n\n offset += 2 + length;\n }\n // provide descriptor for PES private data via callback\n let descriptors = data.subarray(i + 5, i + 5 + ES_info_length);\n this.dispatchPESPrivateDataDescriptor(elementary_PID, stream_type, descriptors);\n }\n } else if (stream_type === StreamType.kID3) {\n pmt.timed_id3_pids[elementary_PID] = true;\n } else if (stream_type === StreamType.kSCTE35) {\n pmt.scte_35_pids[elementary_PID] = true;\n }\n\n i += 5 + ES_info_length;\n }\n\n if (program_number === this.current_program_) {\n if (this.pmt_ == undefined) {\n Log.v(this.TAG, `Parsed first PMT: ${JSON.stringify(pmt)}`);\n }\n this.pmt_ = pmt;\n if (pmt.common_pids.h264 || pmt.common_pids.h265) {\n this.has_video_ = true;\n }\n if (pmt.common_pids.adts_aac || pmt.common_pids.loas_aac || pmt.common_pids.ac3 || pmt.common_pids.opus || pmt.common_pids.mp3) {\n this.has_audio_ = true;\n }\n }\n }\n\n private parseSCTE35(data: Uint8Array): void {\n const scte35 = readSCTE35(data);\n\n if (scte35.pts != undefined) {\n let pts_ms = Math.floor(scte35.pts / this.timescale_);\n scte35.pts = pts_ms;\n } else {\n scte35.nearest_pts = this.aac_last_sample_pts_;\n }\n\n if (this.onSCTE35Metadata) {\n this.onSCTE35Metadata(scte35);\n }\n }\n\n private parseH264Payload(data: Uint8Array, pts: number, dts: number, file_position: number, random_access_indicator: number) {\n let annexb_parser = new H264AnnexBParser(data);\n let nalu_payload: H264NaluPayload = null;\n let units: {type: H264NaluType, data: Uint8Array}[] = [];\n let length = 0;\n let keyframe = false;\n\n while ((nalu_payload = annexb_parser.readNextNaluPayload()) != null) {\n let nalu_avc1 = new H264NaluAVC1(nalu_payload);\n\n if (nalu_avc1.type === H264NaluType.kSliceSPS) {\n // Notice: parseSPS requires Nalu without startcode or length-header\n let details = SPSParser.parseSPS(nalu_payload.data);\n if (!this.video_init_segment_dispatched_) {\n this.video_metadata_.sps = nalu_avc1;\n this.video_metadata_.details = details;\n } else if (this.detectVideoMetadataChange(nalu_avc1, details) === true) {\n Log.v(this.TAG, `H264: Critical h264 metadata has been changed, attempt to re-generate InitSegment`);\n this.video_metadata_changed_ = true;\n this.video_metadata_ = {vps: undefined, sps: nalu_avc1, pps: undefined, details: details};\n }\n } else if (nalu_avc1.type === H264NaluType.kSlicePPS) {\n if (!this.video_init_segment_dispatched_ || this.video_metadata_changed_) {\n this.video_metadata_.pps = nalu_avc1;\n if (this.video_metadata_.sps && this.video_metadata_.pps) {\n if (this.video_metadata_changed_) {\n // flush stashed frames before changing codec metadata\n this.dispatchVideoMediaSegment();\n }\n // notify new codec metadata (maybe changed)\n this.dispatchVideoInitSegment();\n }\n }\n } else if (nalu_avc1.type === H264NaluType.kSliceIDR) {\n keyframe = true;\n } else if (nalu_avc1.type === H264NaluType.kSliceNonIDR && random_access_indicator === 1) {\n // For open-gop stream, use random_access_indicator to identify keyframe\n keyframe = true;\n }\n\n // Push samples to remuxer only if initialization metadata has been dispatched\n if (this.video_init_segment_dispatched_) {\n units.push(nalu_avc1);\n length += nalu_avc1.data.byteLength;\n }\n }\n\n let pts_ms = Math.floor(pts / this.timescale_);\n let dts_ms = Math.floor(dts / this.timescale_);\n\n if (units.length) {\n let track = this.video_track_;\n let avc_sample = {\n units,\n length,\n isKeyframe: keyframe,\n dts: dts_ms,\n pts: pts_ms,\n cts: pts_ms - dts_ms,\n file_position\n };\n track.samples.push(avc_sample);\n track.length += length;\n }\n }\n\n private parseH265Payload(data: Uint8Array, pts: number, dts: number, file_position: number, random_access_indicator: number) {\n let annexb_parser = new H265AnnexBParser(data);\n let nalu_payload: H265NaluPayload = null;\n let units: {type: H265NaluType, data: Uint8Array}[] = [];\n let length = 0;\n let keyframe = false;\n\n while ((nalu_payload = annexb_parser.readNextNaluPayload()) != null) {\n let nalu_hvc1 = new H265NaluHVC1(nalu_payload);\n\n if (nalu_hvc1.type === H265NaluType.kSliceVPS) {\n if (!this.video_init_segment_dispatched_) {\n let details = H265Parser.parseVPS(nalu_payload.data);\n this.video_metadata_.vps = nalu_hvc1;\n this.video_metadata_.details = {\n ... this.video_metadata_.details,\n ... details\n };\n }\n } else if (nalu_hvc1.type === H265NaluType.kSliceSPS) {\n let details = H265Parser.parseSPS(nalu_payload.data);\n if (!this.video_init_segment_dispatched_) {\n this.video_metadata_.sps = nalu_hvc1;\n this.video_metadata_.details = {\n ... this.video_metadata_.details,\n ... details\n };\n } else if (this.detectVideoMetadataChange(nalu_hvc1, details) === true) {\n Log.v(this.TAG, `H265: Critical h265 metadata has been changed, attempt to re-generate InitSegment`);\n this.video_metadata_changed_ = true;\n this.video_metadata_ = { vps: undefined, sps: nalu_hvc1, pps: undefined, details: details};\n }\n } else if (nalu_hvc1.type === H265NaluType.kSlicePPS) {\n if (!this.video_init_segment_dispatched_ || this.video_metadata_changed_) {\n let details = H265Parser.parsePPS(nalu_payload.data);\n this.video_metadata_.pps = nalu_hvc1;\n this.video_metadata_.details = {\n ... this.video_metadata_.details,\n ... details\n };\n\n if (this.video_metadata_.vps && this.video_metadata_.sps && this.video_metadata_.pps) {\n if (this.video_metadata_changed_) {\n // flush stashed frames before changing codec metadata\n this.dispatchVideoMediaSegment();\n }\n // notify new codec metadata (maybe changed)\n this.dispatchVideoInitSegment();\n }\n }\n } else if (nalu_hvc1.type === H265NaluType.kSliceIDR_W_RADL || nalu_hvc1.type === H265NaluType.kSliceIDR_N_LP || nalu_hvc1.type === H265NaluType.kSliceCRA_NUT) {\n keyframe = true;\n }\n\n // Push samples to remuxer only if initialization metadata has been dispatched\n if (this.video_init_segment_dispatched_) {\n units.push(nalu_hvc1);\n length += nalu_hvc1.data.byteLength;\n }\n }\n\n let pts_ms = Math.floor(pts / this.timescale_);\n let dts_ms = Math.floor(dts / this.timescale_);\n\n if (units.length) {\n let track = this.video_track_;\n let hvc_sample = {\n units,\n length,\n isKeyframe: keyframe,\n dts: dts_ms,\n pts: pts_ms,\n cts: pts_ms - dts_ms,\n file_position\n };\n track.samples.push(hvc_sample);\n track.length += length;\n }\n }\n\n private detectVideoMetadataChange(new_sps: H264NaluAVC1 | H265NaluHVC1, new_details: any): boolean {\n if (new_details.codec_mimetype !== this.video_metadata_.details.codec_mimetype) {\n Log.v(this.TAG, `Video: Codec mimeType changed from ` +\n `${this.video_metadata_.details.codec_mimetype} to ${new_details.codec_mimetype}`);\n return true;\n }\n\n if (new_details.codec_size.width !== this.video_metadata_.details.codec_size.width\n || new_details.codec_size.height !== this.video_metadata_.details.codec_size.height) {\n let old_size = this.video_metadata_.details.codec_size;\n let new_size = new_details.codec_size;\n Log.v(this.TAG, `Video: Coded Resolution changed from ` +\n `${old_size.width}x${old_size.height} to ${new_size.width}x${new_size.height}`);\n return true;\n }\n\n if (new_details.present_size.width !== this.video_metadata_.details.present_size.width) {\n Log.v(this.TAG, `Video: Present resolution width changed from ` +\n `${this.video_metadata_.details.present_size.width} to ${new_details.present_size.width}`);\n return true;\n }\n\n return false;\n }\n\n private isInitSegmentDispatched(): boolean {\n if (this.has_video_ && this.has_audio_) { // both video & audio\n return this.video_init_segment_dispatched_ && this.audio_init_segment_dispatched_;\n }\n if (this.has_video_ && !this.has_audio_) { // video only\n return this.video_init_segment_dispatched_;\n }\n if (!this.has_video_ && this.has_audio_) { // audio only\n return this.audio_init_segment_dispatched_;\n }\n return false;\n }\n\n private dispatchVideoInitSegment() {\n let details = this.video_metadata_.details;\n let meta: any = {};\n\n meta.type = 'video';\n meta.id = this.video_track_.id;\n meta.timescale = 1000;\n meta.duration = this.duration_;\n\n meta.codecWidth = details.codec_size.width;\n meta.codecHeight = details.codec_size.height;\n meta.presentWidth = details.present_size.width;\n meta.presentHeight = details.present_size.height;\n\n meta.profile = details.profile_string;\n meta.level = details.level_string;\n meta.bitDepth = details.bit_depth;\n meta.chromaFormat = details.chroma_format;\n meta.sarRatio = details.sar_ratio;\n meta.frameRate = details.frame_rate;\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n meta.refSampleDuration = 1000 * (fps_den / fps_num);\n\n meta.codec = details.codec_mimetype;\n\n if (this.video_metadata_.vps) {\n let vps_without_header = this.video_metadata_.vps.data.subarray(4);\n let sps_without_header = this.video_metadata_.sps.data.subarray(4);\n let pps_without_header = this.video_metadata_.pps.data.subarray(4);\n let hvcc = new HEVCDecoderConfigurationRecord(vps_without_header, sps_without_header, pps_without_header, details);\n meta.hvcc = hvcc.getData();\n\n if (this.video_init_segment_dispatched_ == false) {\n Log.v(this.TAG, `Generated first HEVCDecoderConfigurationRecord for mimeType: ${meta.codec}`);\n }\n } else {\n let sps_without_header = this.video_metadata_.sps.data.subarray(4);\n let pps_without_header = this.video_metadata_.pps.data.subarray(4);\n let avcc = new AVCDecoderConfigurationRecord(sps_without_header, pps_without_header, details);\n meta.avcc = avcc.getData();\n\n if (this.video_init_segment_dispatched_ == false) {\n Log.v(this.TAG, `Generated first AVCDecoderConfigurationRecord for mimeType: ${meta.codec}`);\n }\n }\n this.onTrackMetadata('video', meta);\n this.video_init_segment_dispatched_ = true;\n this.video_metadata_changed_ = false;\n\n // notify new MediaInfo\n let mi = this.media_info_;\n mi.hasVideo = true;\n mi.width = meta.codecWidth;\n mi.height = meta.codecHeight;\n mi.fps = meta.frameRate.fps;\n mi.profile = meta.profile;\n mi.level = meta.level;\n mi.refFrames = details.ref_frames;\n mi.chromaFormat = details.chroma_format_string;\n mi.sarNum = meta.sarRatio.width;\n mi.sarDen = meta.sarRatio.height;\n mi.videoCodec = meta.codec;\n\n if (mi.hasAudio && mi.audioCodec) {\n mi.mimeType = `video/mp2t; codecs=\"${mi.videoCodec},${mi.audioCodec}\"`;\n } else {\n mi.mimeType = `video/mp2t; codecs=\"${mi.videoCodec}\"`;\n }\n\n if (mi.isComplete()) {\n this.onMediaInfo(mi);\n }\n }\n\n private dispatchVideoMediaSegment() {\n if (this.isInitSegmentDispatched()) {\n if (this.video_track_.length) {\n this.onDataAvailable(null, this.video_track_);\n }\n }\n }\n\n private dispatchAudioMediaSegment() {\n if (this.isInitSegmentDispatched()) {\n if (this.audio_track_.length) {\n this.onDataAvailable(this.audio_track_, null);\n }\n }\n }\n\n private dispatchAudioVideoMediaSegment() {\n if (this.isInitSegmentDispatched()) {\n if (this.audio_track_.length || this.video_track_.length) {\n this.onDataAvailable(this.audio_track_, this.video_track_);\n }\n }\n }\n\n private parseADTSAACPayload(data: Uint8Array, pts: number) {\n if (this.has_video_ && !this.video_init_segment_dispatched_) {\n // If first video IDR frame hasn't been detected,\n // Wait for first IDR frame and video init segment being dispatched\n return;\n }\n\n if (this.aac_last_incomplete_data_) {\n let buf = new Uint8Array(data.byteLength + this.aac_last_incomplete_data_.byteLength);\n buf.set(this.aac_last_incomplete_data_, 0);\n buf.set(data, this.aac_last_incomplete_data_.byteLength);\n data = buf;\n }\n\n let ref_sample_duration: number;\n let base_pts_ms: number;\n\n if (pts != undefined) {\n base_pts_ms = pts / this.timescale_;\n }\n if (this.audio_metadata_.codec === 'aac') {\n if (pts == undefined && this.aac_last_sample_pts_ != undefined) {\n ref_sample_duration = 1024 / this.audio_metadata_.sampling_frequency * 1000;\n base_pts_ms = this.aac_last_sample_pts_ + ref_sample_duration;\n } else if (pts == undefined){\n Log.w(this.TAG, `AAC: Unknown pts`);\n return;\n }\n\n if (this.aac_last_incomplete_data_ && this.aac_last_sample_pts_) {\n ref_sample_duration = 1024 / this.audio_metadata_.sampling_frequency * 1000;\n let new_pts_ms = this.aac_last_sample_pts_ + ref_sample_duration;\n\n if (Math.abs(new_pts_ms - base_pts_ms) > 1) {\n Log.w(this.TAG, `AAC: Detected pts overlapped, ` +\n `expected: ${new_pts_ms}ms, PES pts: ${base_pts_ms}ms`);\n base_pts_ms = new_pts_ms;\n }\n }\n }\n\n let adts_parser = new AACADTSParser(data);\n let aac_frame: AACFrame = null;\n let sample_pts_ms = base_pts_ms;\n let last_sample_pts_ms: number;\n\n while ((aac_frame = adts_parser.readNextAACFrame()) != null) {\n ref_sample_duration = 1024 / aac_frame.sampling_frequency * 1000;\n const audio_sample = {\n codec: 'aac',\n data: aac_frame\n } as const;\n\n if (this.audio_init_segment_dispatched_ == false) {\n this.audio_metadata_ = {\n codec: 'aac',\n audio_object_type: aac_frame.audio_object_type,\n sampling_freq_index: aac_frame.sampling_freq_index,\n sampling_frequency: aac_frame.sampling_frequency,\n channel_config: aac_frame.channel_config\n };\n this.dispatchAudioInitSegment(audio_sample);\n } else if (this.detectAudioMetadataChange(audio_sample)) {\n // flush stashed frames before notify new AudioSpecificConfig\n this.dispatchAudioMediaSegment();\n // notify new AAC AudioSpecificConfig\n this.dispatchAudioInitSegment(audio_sample);\n }\n\n last_sample_pts_ms = sample_pts_ms;\n let sample_pts_ms_int = Math.floor(sample_pts_ms);\n\n let aac_sample = {\n unit: aac_frame.data,\n length: aac_frame.data.byteLength,\n pts: sample_pts_ms_int,\n dts: sample_pts_ms_int\n };\n this.audio_track_.samples.push(aac_sample);\n this.audio_track_.length += aac_frame.data.byteLength;\n\n sample_pts_ms += ref_sample_duration;\n }\n\n if (adts_parser.hasIncompleteData()) {\n this.aac_last_incomplete_data_ = adts_parser.getIncompleteData();\n }\n\n if (last_sample_pts_ms) {\n this.aac_last_sample_pts_ = last_sample_pts_ms;\n }\n }\n\n private parseLOASAACPayload(data: Uint8Array, pts: number) {\n if (this.has_video_ && !this.video_init_segment_dispatched_) {\n // If first video IDR frame hasn't been detected,\n // Wait for first IDR frame and video init segment being dispatched\n return;\n }\n\n if (this.aac_last_incomplete_data_) {\n let buf = new Uint8Array(data.byteLength + this.aac_last_incomplete_data_.byteLength);\n buf.set(this.aac_last_incomplete_data_, 0);\n buf.set(data, this.aac_last_incomplete_data_.byteLength);\n data = buf;\n }\n\n let ref_sample_duration: number;\n let base_pts_ms: number;\n\n if (pts != undefined) {\n base_pts_ms = pts / this.timescale_;\n }\n if (this.audio_metadata_.codec === 'aac') {\n if (pts == undefined && this.aac_last_sample_pts_ != undefined) {\n ref_sample_duration = 1024 / this.audio_metadata_.sampling_frequency * 1000;\n base_pts_ms = this.aac_last_sample_pts_ + ref_sample_duration;\n } else if (pts == undefined){\n Log.w(this.TAG, `AAC: Unknown pts`);\n return;\n }\n\n if (this.aac_last_incomplete_data_ && this.aac_last_sample_pts_) {\n ref_sample_duration = 1024 / this.audio_metadata_.sampling_frequency * 1000;\n let new_pts_ms = this.aac_last_sample_pts_ + ref_sample_duration;\n\n if (Math.abs(new_pts_ms - base_pts_ms) > 1) {\n Log.w(this.TAG, `AAC: Detected pts overlapped, ` +\n `expected: ${new_pts_ms}ms, PES pts: ${base_pts_ms}ms`);\n base_pts_ms = new_pts_ms;\n }\n }\n }\n\n let loas_parser = new AACLOASParser(data);\n let aac_frame: LOASAACFrame = null;\n let sample_pts_ms = base_pts_ms;\n let last_sample_pts_ms: number;\n\n while ((aac_frame = loas_parser.readNextAACFrame(this.loas_previous_frame ?? undefined)) != null) {\n this.loas_previous_frame = aac_frame;\n ref_sample_duration = 1024 / aac_frame.sampling_frequency * 1000;\n const audio_sample = {\n codec: 'aac',\n data: aac_frame\n } as const;\n\n if (this.audio_init_segment_dispatched_ == false) {\n this.audio_metadata_ = {\n codec: 'aac',\n audio_object_type: aac_frame.audio_object_type,\n sampling_freq_index: aac_frame.sampling_freq_index,\n sampling_frequency: aac_frame.sampling_frequency,\n channel_config: aac_frame.channel_config\n };\n this.dispatchAudioInitSegment(audio_sample);\n } else if (this.detectAudioMetadataChange(audio_sample)) {\n // flush stashed frames before notify new AudioSpecificConfig\n this.dispatchAudioMediaSegment();\n // notify new AAC AudioSpecificConfig\n this.dispatchAudioInitSegment(audio_sample);\n }\n\n last_sample_pts_ms = sample_pts_ms;\n let sample_pts_ms_int = Math.floor(sample_pts_ms);\n\n let aac_sample = {\n unit: aac_frame.data,\n length: aac_frame.data.byteLength,\n pts: sample_pts_ms_int,\n dts: sample_pts_ms_int\n };\n this.audio_track_.samples.push(aac_sample);\n this.audio_track_.length += aac_frame.data.byteLength;\n\n sample_pts_ms += ref_sample_duration;\n }\n\n if (loas_parser.hasIncompleteData()) {\n this.aac_last_incomplete_data_ = loas_parser.getIncompleteData();\n }\n\n if (last_sample_pts_ms) {\n this.aac_last_sample_pts_ = last_sample_pts_ms;\n }\n }\n\n private parseAC3Payload(data: Uint8Array, pts: number) {\n if (this.has_video_ && !this.video_init_segment_dispatched_) {\n // If first video IDR frame hasn't been detected,\n // Wait for first IDR frame and video init segment being dispatched\n return;\n }\n\n let ref_sample_duration: number;\n let base_pts_ms: number;\n\n if (pts != undefined) {\n base_pts_ms = pts / this.timescale_;\n }\n\n if (this.audio_metadata_.codec === 'ac-3') {\n if (pts == undefined && this.aac_last_sample_pts_ != undefined) {\n ref_sample_duration = 1536 / this.audio_metadata_.sampling_frequency * 1000;;\n base_pts_ms = this.aac_last_sample_pts_ + ref_sample_duration;\n } else if (pts == undefined){\n Log.w(this.TAG, `Opus: Unknown pts`);\n return;\n }\n }\n\n let adts_parser = new AC3Parser(data);\n let ac3_frame: AC3Frame = null;\n let sample_pts_ms = base_pts_ms;\n let last_sample_pts_ms: number;\n\n while ((ac3_frame = adts_parser.readNextAC3Frame()) != null) {\n ref_sample_duration = 1536 / ac3_frame.sampling_frequency * 1000;\n const audio_sample = {\n codec: 'ac-3',\n data: ac3_frame\n } as const;\n\n if (this.audio_init_segment_dispatched_ == false) {\n this.audio_metadata_ = {\n codec: 'ac-3',\n sampling_frequency: ac3_frame.sampling_frequency,\n bit_stream_identification: ac3_frame.bit_stream_identification,\n bit_stream_mode: ac3_frame.bit_stream_mode,\n low_frequency_effects_channel_on: ac3_frame.low_frequency_effects_channel_on,\n channel_mode: ac3_frame.channel_mode,\n };\n console.log(JSON.stringify(this.audio_metadata_))\n this.dispatchAudioInitSegment(audio_sample);\n } else if (this.detectAudioMetadataChange(audio_sample)) {\n // flush stashed frames before notify new AudioSpecificConfig\n this.dispatchAudioMediaSegment();\n // notify new AAC AudioSpecificConfig\n this.dispatchAudioInitSegment(audio_sample);\n }\n\n last_sample_pts_ms = sample_pts_ms;\n let sample_pts_ms_int = Math.floor(sample_pts_ms);\n\n let ac3_sample = {\n unit: ac3_frame.data,\n length: ac3_frame.data.byteLength,\n pts: sample_pts_ms_int,\n dts: sample_pts_ms_int\n };\n\n this.audio_track_.samples.push(ac3_sample);\n this.audio_track_.length += ac3_frame.data.byteLength;\n\n sample_pts_ms += ref_sample_duration;\n }\n\n if (last_sample_pts_ms) {\n this.aac_last_sample_pts_ = last_sample_pts_ms;\n }\n }\n\n private parseOpusPayload(data: Uint8Array, pts: number) {\n if (this.has_video_ && !this.video_init_segment_dispatched_) {\n // If first video IDR frame hasn't been detected,\n // Wait for first IDR frame and video init segment being dispatched\n return;\n }\n\n let ref_sample_duration: number;\n let base_pts_ms: number;\n\n if (pts != undefined) {\n base_pts_ms = pts / this.timescale_;\n }\n if (this.audio_metadata_.codec === 'opus') {\n if (pts == undefined && this.aac_last_sample_pts_ != undefined) {\n ref_sample_duration = 20;\n base_pts_ms = this.aac_last_sample_pts_ + ref_sample_duration;\n } else if (pts == undefined){\n Log.w(this.TAG, `Opus: Unknown pts`);\n return;\n }\n }\n\n let sample_pts_ms = base_pts_ms;\n let last_sample_pts_ms: number;\n\n for (let offset = 0; offset < data.length; ) {\n ref_sample_duration = 20;\n\n const opus_pending_trim_start = (data[offset + 1] & 0x10) !== 0;\n const trim_end = (data[offset + 1] & 0x08) !== 0;\n let index = offset + 2;\n let size = 0;\n\n while (data[index] === 0xFF) {\n size += 255;\n index += 1;\n }\n size += data[index];\n index += 1;\n index += opus_pending_trim_start ? 2 : 0;\n index += trim_end ? 2 : 0;\n\n last_sample_pts_ms = sample_pts_ms;\n let sample_pts_ms_int = Math.floor(sample_pts_ms);\n let sample = data.slice(index, index + size)\n\n let opus_sample = {\n unit: sample,\n length: sample.byteLength,\n pts: sample_pts_ms_int,\n dts: sample_pts_ms_int\n };\n this.audio_track_.samples.push(opus_sample);\n this.audio_track_.length += sample.byteLength;\n\n sample_pts_ms += ref_sample_duration;\n offset = index + size;\n }\n\n if (last_sample_pts_ms) {\n this.aac_last_sample_pts_ = last_sample_pts_ms;\n }\n }\n\n private parseMP3Payload(data: Uint8Array, pts: number) {\n if (this.has_video_ && !this.video_init_segment_dispatched_) {\n // If first video IDR frame hasn't been detected,\n // Wait for first IDR frame and video init segment being dispatched\n return;\n }\n\n let _mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0];\n let _mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0];\n let _mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0];\n let _mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1];\n let _mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1];\n let _mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];\n\n let ver = (data[1] >>> 3) & 0x03;\n let layer = (data[1] & 0x06) >> 1;\n let bitrate_index = (data[2] & 0xF0) >>> 4;\n let sampling_freq_index = (data[2] & 0x0C) >>> 2;\n let channel_mode = (data[3] >>> 6) & 0x03;\n let channel_count = channel_mode !== 3 ? 2 : 1;\n\n let sample_rate = 0;\n let bit_rate = 0;\n let object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types\n\n let codec = 'mp3';\n switch (ver) {\n case 0: // MPEG 2.5\n sample_rate = _mpegAudioV25SampleRateTable[sampling_freq_index];\n break;\n case 2: // MPEG 2\n sample_rate = _mpegAudioV20SampleRateTable[sampling_freq_index];\n break;\n case 3: // MPEG 1\n sample_rate = _mpegAudioV10SampleRateTable[sampling_freq_index];\n break;\n }\n\n switch (layer) {\n case 1: // Layer 3\n object_type = 34;\n if (bitrate_index < _mpegAudioL3BitRateTable.length) {\n bit_rate = _mpegAudioL3BitRateTable[bitrate_index];\n }\n break;\n case 2: // Layer 2\n object_type = 33;\n if (bitrate_index < _mpegAudioL2BitRateTable.length) {\n bit_rate = _mpegAudioL2BitRateTable[bitrate_index];\n }\n break;\n case 3: // Layer 1\n object_type = 32;\n if (bitrate_index < _mpegAudioL1BitRateTable.length) {\n bit_rate = _mpegAudioL1BitRateTable[bitrate_index];\n }\n break;\n }\n\n const sample = new MP3Data();\n sample.object_type = object_type;\n sample.sample_rate = sample_rate;\n sample.channel_count = channel_count;\n sample.data = data;\n const audio_sample = {\n codec: 'mp3',\n data: sample\n } as const;\n\n\n if (this.audio_init_segment_dispatched_ == false) {\n this.audio_metadata_ = {\n codec: 'mp3',\n object_type,\n sample_rate,\n channel_count\n }\n this.dispatchAudioInitSegment(audio_sample);\n } else if (this.detectAudioMetadataChange(audio_sample)) {\n // flush stashed frames before notify new AudioSpecificConfig\n this.dispatchAudioMediaSegment();\n // notify new AAC AudioSpecificConfig\n this.dispatchAudioInitSegment(audio_sample);\n }\n\n let mp3_sample = {\n unit: data,\n length: data.byteLength,\n pts: pts / this.timescale_,\n dts: pts / this.timescale_\n };\n this.audio_track_.samples.push(mp3_sample);\n this.audio_track_.length += data.byteLength;\n }\n\n private detectAudioMetadataChange(sample: AudioData): boolean {\n if (sample.codec !== this.audio_metadata_.codec) {\n Log.v(this.TAG, `Audio: Audio Codecs changed from ` +\n `${this.audio_metadata_.codec} to ${sample.codec}`);\n return true;\n }\n\n if (sample.codec === 'aac' && this.audio_metadata_.codec === 'aac') {\n const frame = sample.data;\n if (frame.audio_object_type !== this.audio_metadata_.audio_object_type) {\n Log.v(this.TAG, `AAC: AudioObjectType changed from ` +\n `${this.audio_metadata_.audio_object_type} to ${frame.audio_object_type}`);\n return true;\n }\n\n if (frame.sampling_freq_index !== this.audio_metadata_.sampling_freq_index) {\n Log.v(this.TAG, `AAC: SamplingFrequencyIndex changed from ` +\n `${this.audio_metadata_.sampling_freq_index} to ${frame.sampling_freq_index}`);\n return true;\n }\n\n if (frame.channel_config !== this.audio_metadata_.channel_config) {\n Log.v(this.TAG, `AAC: Channel configuration changed from ` +\n `${this.audio_metadata_.channel_config} to ${frame.channel_config}`);\n return true;\n }\n } else if (sample.codec === 'ac-3' && this.audio_metadata_.codec === 'ac-3') {\n const frame = sample.data;\n if (frame.sampling_frequency !== this.audio_metadata_.sampling_frequency) {\n Log.v(this.TAG, `AC3: Sampling Frequency changed from ` +\n `${this.audio_metadata_.sampling_frequency} to ${frame.sampling_frequency}`);\n return true;\n }\n\n if (frame.bit_stream_identification !== this.audio_metadata_.bit_stream_identification) {\n Log.v(this.TAG, `AC3: Bit Stream Identification changed from ` +\n `${this.audio_metadata_.bit_stream_identification} to ${frame.bit_stream_identification}`);\n return true;\n }\n\n if (frame.bit_stream_mode !== this.audio_metadata_.bit_stream_mode) {\n Log.v(this.TAG, `AC3: BitStream Mode changed from ` +\n `${this.audio_metadata_.bit_stream_mode} to ${frame.bit_stream_mode}`);\n return true;\n }\n\n if (frame.channel_mode !== this.audio_metadata_.channel_mode) {\n Log.v(this.TAG, `AC3: Channel Mode changed from ` +\n `${this.audio_metadata_.channel_mode} to ${frame.channel_mode}`);\n return true;\n }\n\n if (frame.low_frequency_effects_channel_on !== this.audio_metadata_.low_frequency_effects_channel_on) {\n Log.v(this.TAG, `AC3: Low Frequency Effects Channel On changed from ` +\n `${this.audio_metadata_.low_frequency_effects_channel_on} to ${frame.low_frequency_effects_channel_on}`);\n return true;\n }\n } else if (sample.codec === 'opus' && this.audio_metadata_.codec === 'opus') {\n const data = sample.meta;\n\n if (data.sample_rate !== this.audio_metadata_.sample_rate) {\n Log.v(this.TAG, `Opus: SamplingFrequencyIndex changed from ` +\n `${this.audio_metadata_.sample_rate} to ${data.sample_rate}`);\n return true;\n }\n\n if (data.channel_count !== this.audio_metadata_.channel_count) {\n Log.v(this.TAG, `Opus: Channel count changed from ` +\n `${this.audio_metadata_.channel_count} to ${data.channel_count}`);\n return true;\n }\n } else if (sample.codec === 'mp3' && this.audio_metadata_.codec === 'mp3') {\n const data = sample.data;\n if (data.object_type !== this.audio_metadata_.object_type) {\n Log.v(this.TAG, `MP3: AudioObjectType changed from ` +\n `${this.audio_metadata_.object_type} to ${data.object_type}`);\n return true;\n }\n\n if (data.sample_rate !== this.audio_metadata_.sample_rate) {\n Log.v(this.TAG, `MP3: SamplingFrequencyIndex changed from ` +\n `${this.audio_metadata_.sample_rate} to ${data.sample_rate}`);\n return true;\n }\n\n if (data.channel_count !== this.audio_metadata_.channel_count) {\n Log.v(this.TAG, `MP3: Channel count changed from ` +\n `${this.audio_metadata_.channel_count} to ${data.channel_count}`);\n return true;\n }\n }\n\n return false;\n }\n\n private dispatchAudioInitSegment(sample: AudioData) {\n let meta: any = {};\n meta.type = 'audio';\n meta.id = this.audio_track_.id;\n meta.timescale = 1000;\n meta.duration = this.duration_;\n\n if (this.audio_metadata_.codec === 'aac') {\n let aac_frame = sample.codec === 'aac' ? sample.data : null;\n let audio_specific_config = new AudioSpecificConfig(aac_frame);\n\n meta.audioSampleRate = audio_specific_config.sampling_rate;\n meta.channelCount = audio_specific_config.channel_count;\n meta.codec = audio_specific_config.codec_mimetype;\n meta.originalCodec = audio_specific_config.original_codec_mimetype;\n meta.config = audio_specific_config.config;\n meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale;\n } else if (this.audio_metadata_.codec === 'ac-3') {\n let ac3_frame = sample.codec === 'ac-3' ? sample.data : null;\n let ac3_config = new AC3Config(ac3_frame);\n meta.audioSampleRate = ac3_config.sampling_rate\n meta.channelCount = ac3_config.channel_count;\n meta.codec = ac3_config.codec_mimetype;\n meta.originalCodec = ac3_config.original_codec_mimetype;\n meta.config = ac3_config.config;\n meta.refSampleDuration = 1536 / meta.audioSampleRate * meta.timescale;\n } else if (this.audio_metadata_.codec === 'opus') {\n meta.audioSampleRate = this.audio_metadata_.sample_rate;\n meta.channelCount = this.audio_metadata_.channel_count;\n meta.channelConfigCode = this.audio_metadata_.channel_config_code;\n meta.codec = 'opus';\n meta.originalCodec = 'opus';\n meta.config = undefined;\n meta.refSampleDuration = 20;\n } else if (this.audio_metadata_.codec === 'mp3') {\n meta.audioSampleRate = this.audio_metadata_.sample_rate;\n meta.channelCount = this.audio_metadata_.channel_count;\n meta.codec = 'mp3';\n meta.originalCodec = 'mp3';\n meta.config = undefined;\n }\n\n if (this.audio_init_segment_dispatched_ == false) {\n Log.v(this.TAG, `Generated first AudioSpecificConfig for mimeType: ${meta.codec}`);\n }\n\n this.onTrackMetadata('audio', meta);\n this.audio_init_segment_dispatched_ = true;\n this.video_metadata_changed_ = false;\n\n // notify new MediaInfo\n let mi = this.media_info_;\n mi.hasAudio = true;\n mi.audioCodec = meta.originalCodec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n\n if (mi.hasVideo && mi.videoCodec) {\n mi.mimeType = `video/mp2t; codecs=\"${mi.videoCodec},${mi.audioCodec}\"`;\n } else {\n mi.mimeType = `video/mp2t; codecs=\"${mi.audioCodec}\"`;\n }\n\n if (mi.isComplete()) {\n this.onMediaInfo(mi);\n }\n }\n\n private dispatchPESPrivateDataDescriptor(pid: number, stream_type: number, descriptor: Uint8Array) {\n let desc = new PESPrivateDataDescriptor();\n desc.pid = pid;\n desc.stream_type = stream_type;\n desc.descriptor = descriptor;\n\n if (this.onPESPrivateDataDescriptor) {\n this.onPESPrivateDataDescriptor(desc);\n }\n }\n\n private parsePESPrivateDataPayload(data: Uint8Array, pts: number, dts: number, pid: number, stream_id: number) {\n let private_data = new PESPrivateData();\n\n private_data.pid = pid;\n private_data.stream_id = stream_id;\n private_data.len = data.byteLength;\n private_data.data = data;\n\n if (pts != undefined) {\n let pts_ms = Math.floor(pts / this.timescale_);\n private_data.pts = pts_ms;\n } else {\n private_data.nearest_pts = this.aac_last_sample_pts_;\n }\n\n if (dts != undefined) {\n let dts_ms = Math.floor(dts / this.timescale_);\n private_data.dts = dts_ms;\n }\n\n if (this.onPESPrivateData) {\n this.onPESPrivateData(private_data);\n }\n }\n\n private parseTimedID3MetadataPayload(data: Uint8Array, pts: number, dts: number, pid: number, stream_id: number) {\n let timed_id3_metadata = new PESPrivateData();\n\n timed_id3_metadata.pid = pid;\n timed_id3_metadata.stream_id = stream_id;\n timed_id3_metadata.len = data.byteLength;\n timed_id3_metadata.data = data;\n\n if (pts != undefined) {\n let pts_ms = Math.floor(pts / this.timescale_);\n timed_id3_metadata.pts = pts_ms;\n }\n\n if (dts != undefined) {\n let dts_ms = Math.floor(dts / this.timescale_);\n timed_id3_metadata.dts = dts_ms;\n }\n\n if (this.onTimedID3Metadata) {\n this.onTimedID3Metadata(timed_id3_metadata);\n }\n }\n\n private parseSMPTE2038MetadataPayload(data: Uint8Array, pts: number, dts: number, pid: number, stream_id: number) {\n let smpte2038_data = new SMPTE2038Data();\n\n smpte2038_data.pid = pid;\n smpte2038_data.stream_id = stream_id;\n smpte2038_data.len = data.byteLength;\n smpte2038_data.data = data;\n\n if (pts != undefined) {\n let pts_ms = Math.floor(pts / this.timescale_);\n smpte2038_data.pts = pts_ms;\n }\n smpte2038_data.nearest_pts = this.aac_last_sample_pts_;\n\n if (dts != undefined) {\n let dts_ms = Math.floor(dts / this.timescale_);\n smpte2038_data.dts = dts_ms;\n }\n\n smpte2038_data.ancillaries = smpte2038parse(data);\n if (this.onSMPTE2038Metadata) {\n this.onSMPTE2038Metadata(smpte2038_data);\n }\n }\n}\n\nexport default TSDemuxer;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from dailymotion's hls.js library (hls.js/src/remux/mp4-generator.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// MP4 boxes generator for ISO BMFF (ISO Base Media File Format, defined in ISO/IEC 14496-12)\nclass MP4 {\n\n static init() {\n MP4.types = {\n avc1: [], avcC: [], btrt: [], dinf: [],\n dref: [], esds: [], ftyp: [], hdlr: [],\n hvc1: [], hvcC: [],\n mdat: [], mdhd: [], mdia: [], mfhd: [],\n minf: [], moof: [], moov: [], mp4a: [],\n mvex: [], mvhd: [], sdtp: [], stbl: [],\n stco: [], stsc: [], stsd: [], stsz: [],\n stts: [], tfdt: [], tfhd: [], traf: [],\n trak: [], trun: [], trex: [], tkhd: [],\n vmhd: [], smhd: [], '.mp3': [],\n Opus: [], dOps: [], 'ac-3': [], dac3: [],\n };\n\n for (let name in MP4.types) {\n if (MP4.types.hasOwnProperty(name)) {\n MP4.types[name] = [\n name.charCodeAt(0),\n name.charCodeAt(1),\n name.charCodeAt(2),\n name.charCodeAt(3)\n ];\n }\n }\n\n let constants = MP4.constants = {};\n\n constants.FTYP = new Uint8Array([\n 0x69, 0x73, 0x6F, 0x6D, // major_brand: isom\n 0x0, 0x0, 0x0, 0x1, // minor_version: 0x01\n 0x69, 0x73, 0x6F, 0x6D, // isom\n 0x61, 0x76, 0x63, 0x31 // avc1\n ]);\n\n constants.STSD_PREFIX = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]);\n\n constants.STTS = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n\n constants.STSC = constants.STCO = constants.STTS;\n\n constants.STSZ = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n\n constants.HDLR_VIDEO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x56, 0x69, 0x64, 0x65,\n 0x6F, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler\n ]);\n\n constants.HDLR_AUDIO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x53, 0x6F, 0x75, 0x6E,\n 0x64, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler\n ]);\n\n constants.DREF = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0C, // entry_size\n 0x75, 0x72, 0x6C, 0x20, // type 'url '\n 0x00, 0x00, 0x00, 0x01 // version(0) + flags\n ]);\n\n // Sound media header\n constants.SMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)\n ]);\n\n // video media header\n constants.VMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x01, // version(0) + flags\n 0x00, 0x00, // graphicsmode: 2 bytes\n 0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes\n 0x00, 0x00\n ]);\n }\n\n // Generate a box\n static box(type) {\n let size = 8;\n let result = null;\n let datas = Array.prototype.slice.call(arguments, 1);\n let arrayCount = datas.length;\n\n for (let i = 0; i < arrayCount; i++) {\n size += datas[i].byteLength;\n }\n\n result = new Uint8Array(size);\n result[0] = (size >>> 24) & 0xFF; // size\n result[1] = (size >>> 16) & 0xFF;\n result[2] = (size >>> 8) & 0xFF;\n result[3] = (size) & 0xFF;\n\n result.set(type, 4); // type\n\n let offset = 8;\n for (let i = 0; i < arrayCount; i++) { // data body\n result.set(datas[i], offset);\n offset += datas[i].byteLength;\n }\n\n return result;\n }\n\n // emit ftyp & moov\n static generateInitSegment(meta) {\n let ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP);\n let moov = MP4.moov(meta);\n\n let result = new Uint8Array(ftyp.byteLength + moov.byteLength);\n result.set(ftyp, 0);\n result.set(moov, ftyp.byteLength);\n return result;\n }\n\n // Movie metadata box\n static moov(meta) {\n let mvhd = MP4.mvhd(meta.timescale, meta.duration);\n let trak = MP4.trak(meta);\n let mvex = MP4.mvex(meta);\n return MP4.box(MP4.types.moov, mvhd, trak, mvex);\n }\n\n // Movie header box\n static mvhd(timescale, duration) {\n return MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0\n 0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----\n 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID\n ]));\n }\n\n // Track box\n static trak(meta) {\n return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta));\n }\n\n // Track header box\n static tkhd(meta) {\n let trackId = meta.id, duration = meta.duration;\n let width = meta.presentWidth, height = meta.presentHeight;\n\n return MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x07, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (trackId >>> 24) & 0xFF, // track_ID: 4 bytes\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)\n 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n (width >>> 8) & 0xFF, // width and height\n (width) & 0xFF,\n 0x00, 0x00,\n (height >>> 8) & 0xFF,\n (height) & 0xFF,\n 0x00, 0x00\n ]));\n }\n\n // Media Box\n static mdia(meta) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta));\n }\n\n // Media header box\n static mdhd(meta) {\n let timescale = meta.timescale;\n let duration = meta.duration;\n return MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x55, 0xC4, // language: und (undetermined)\n 0x00, 0x00 // pre_defined = 0\n ]));\n }\n\n // Media handler reference box\n static hdlr(meta) {\n let data = null;\n if (meta.type === 'audio') {\n data = MP4.constants.HDLR_AUDIO;\n } else {\n data = MP4.constants.HDLR_VIDEO;\n }\n return MP4.box(MP4.types.hdlr, data);\n }\n\n // Media infomation box\n static minf(meta) {\n let xmhd = null;\n if (meta.type === 'audio') {\n xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD);\n } else {\n xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD);\n }\n return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta));\n }\n\n // Data infomation box\n static dinf() {\n let result = MP4.box(MP4.types.dinf,\n MP4.box(MP4.types.dref, MP4.constants.DREF)\n );\n return result;\n }\n\n // Sample table box\n static stbl(meta) {\n let result = MP4.box(MP4.types.stbl, // type: stbl\n MP4.stsd(meta), // Sample Description Table\n MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample\n MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk\n MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size\n MP4.box(MP4.types.stco, MP4.constants.STCO) // Chunk offset\n );\n return result;\n }\n\n // Sample description box\n static stsd(meta) {\n if (meta.type === 'audio') {\n if (meta.codec === 'mp3') {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp3(meta));\n } else if (meta.codec === 'ac-3') {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.ac3(meta));\n } else if(meta.codec === 'opus') {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.Opus(meta));\n }\n // else: aac -> mp4a\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta));\n } else if (meta.type === 'video' && meta.codec.startsWith('hvc1')) {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.hvc1(meta));\n } else {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta));\n }\n }\n\n static mp3(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types['.mp3'], data);\n }\n\n static mp4a(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types.mp4a, data, MP4.esds(meta));\n }\n\n static ac3(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types['ac-3'], data, MP4.box(MP4.types.dac3, new Uint8Array(meta.config)));\n }\n\n static esds(meta) {\n let config = meta.config || [];\n let configSize = config.length;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version 0 + flags\n\n 0x03, // descriptor_type\n 0x17 + configSize, // length3\n 0x00, 0x01, // es_id\n 0x00, // stream_priority\n\n 0x04, // descriptor_type\n 0x0F + configSize, // length\n 0x40, // codec: mpeg4_audio\n 0x15, // stream_type: Audio\n 0x00, 0x00, 0x00, // buffer_size\n 0x00, 0x00, 0x00, 0x00, // maxBitrate\n 0x00, 0x00, 0x00, 0x00, // avgBitrate\n\n 0x05 // descriptor_type\n ].concat([\n configSize\n ]).concat(\n config\n ).concat([\n 0x06, 0x01, 0x02 // GASpecificConfig\n ]));\n return MP4.box(MP4.types.esds, data);\n }\n\n static Opus(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types.Opus, data, MP4.dOps(meta));\n }\n\n static dOps(meta) {\n let channelCount = meta.channelCount;\n let channelConfigCode = meta.channelConfigCode;\n let sampleRate = meta.audioSampleRate;\n\n if (meta.config) {\n return MP4.box(MP4.types.dOps, data);\n }\n\n let mapping = [];\n switch (channelConfigCode) {\n case 0x01:\n case 0x02:\n mapping = [0x0];\n break;\n case 0x00: // dualmono\n mapping = [0xFF, 1, 1, 0, 1];\n break;\n case 0x80: // dualmono\n mapping = [0xFF, 2, 0, 0, 1];\n break;\n case 0x03:\n mapping = [0x01, 2, 1, 0, 2, 1];\n break;\n case 0x04:\n mapping = [0x01, 2, 2, 0, 1, 2, 3];\n break;\n case 0x05:\n mapping = [0x01, 3, 2, 0, 4, 1, 2, 3];\n break;\n case 0x06:\n mapping = [0x01, 4, 2, 0, 4, 1, 2, 3, 5];\n break;\n case 0x07:\n mapping = [0x01, 4, 2, 0, 4, 1, 2, 3, 5, 6];\n break;\n case 0x08:\n mapping = [0x01, 5, 3, 0, 6, 1, 2, 3, 4, 5, 7];\n break;\n case 0x82:\n mapping = [0x01, 1, 2, 0, 1];\n break;\n case 0x83:\n mapping = [0x01, 1, 3, 0, 1, 2];\n break;\n case 0x84:\n mapping = [0x01, 1, 4, 0, 1, 2, 3];\n break;\n case 0x85:\n mapping = [0x01, 1, 5, 0, 1, 2, 3, 4];\n break;\n case 0x86:\n mapping = [0x01, 1, 6, 0, 1, 2, 3, 4, 5];\n break;\n case 0x87:\n mapping = [0x01, 1, 7, 0, 1, 2, 3, 4, 5, 6];\n break;\n case 0x88:\n mapping = [0x01, 1, 8, 0, 1, 2, 3, 4, 5, 6, 7];\n break;\n }\n\n let data = new Uint8Array([\n 0x00, // Version (1)\n channelCount, // OutputChannelCount: 2\n 0x00, 0x00, // PreSkip: 2\n (sampleRate >>> 24) & 0xFF, // Audio sample rate: 4\n (sampleRate >>> 17) & 0xFF,\n (sampleRate >>> 8) & 0xFF,\n (sampleRate >>> 0) & 0xFF,\n 0x00, 0x00, // Global Gain : 2\n ... mapping\n ]);\n return MP4.box(MP4.types.dOps, data);\n }\n\n static avc1(meta) {\n let avcc = meta.avcc;\n let width = meta.codecWidth, height = meta.codecHeight;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined(2) + reserved(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n (width >>> 8) & 0xFF, // width: 2 bytes\n (width) & 0xFF,\n (height >>> 8) & 0xFF, // height: 2 bytes\n (height) & 0xFF,\n 0x00, 0x48, 0x00, 0x00, // horizresolution: 4 bytes\n 0x00, 0x48, 0x00, 0x00, // vertresolution: 4 bytes\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n 0x00, 0x01, // frame_count\n 0x0A, // strlen\n 0x78, 0x71, 0x71, 0x2F, // compressorname: 32 bytes\n 0x66, 0x6C, 0x76, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00,\n 0x00, 0x18, // depth\n 0xFF, 0xFF // pre_defined = -1\n ]);\n return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc));\n }\n\n static hvc1(meta) {\n let hvcc = meta.hvcc;\n let width = meta.codecWidth, height = meta.codecHeight;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined(2) + reserved(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n (width >>> 8) & 0xFF, // width: 2 bytes\n (width) & 0xFF,\n (height >>> 8) & 0xFF, // height: 2 bytes\n (height) & 0xFF,\n 0x00, 0x48, 0x00, 0x00, // horizresolution: 4 bytes\n 0x00, 0x48, 0x00, 0x00, // vertresolution: 4 bytes\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n 0x00, 0x01, // frame_count\n 0x0A, // strlen\n 0x78, 0x71, 0x71, 0x2F, // compressorname: 32 bytes\n 0x66, 0x6C, 0x76, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00,\n 0x00, 0x18, // depth\n 0xFF, 0xFF // pre_defined = -1\n ]);\n return MP4.box(MP4.types.hvc1, data, MP4.box(MP4.types.hvcC, hvcc));\n }\n\n // Movie Extends box\n static mvex(meta) {\n return MP4.box(MP4.types.mvex, MP4.trex(meta));\n }\n\n // Track Extends box\n static trex(meta) {\n let trackId = meta.id;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]);\n return MP4.box(MP4.types.trex, data);\n }\n\n // Movie fragment box\n static moof(track, baseMediaDecodeTime) {\n return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime));\n }\n\n static mfhd(sequenceNumber) {\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n (sequenceNumber >>> 24) & 0xFF, // sequence_number: int32\n (sequenceNumber >>> 16) & 0xFF,\n (sequenceNumber >>> 8) & 0xFF,\n (sequenceNumber) & 0xFF\n ]);\n return MP4.box(MP4.types.mfhd, data);\n }\n\n // Track fragment box\n static traf(track, baseMediaDecodeTime) {\n let trackId = track.id;\n\n // Track fragment header box\n let tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF\n ]));\n // Track Fragment Decode Time\n let tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (baseMediaDecodeTime >>> 24) & 0xFF, // baseMediaDecodeTime: int32\n (baseMediaDecodeTime >>> 16) & 0xFF,\n (baseMediaDecodeTime >>> 8) & 0xFF,\n (baseMediaDecodeTime) & 0xFF\n ]));\n let sdtp = MP4.sdtp(track);\n let trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);\n\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp);\n }\n\n // Sample Dependency Type box\n static sdtp(track) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let data = new Uint8Array(4 + sampleCount);\n // 0~4 bytes: version(0) & flags\n for (let i = 0; i < sampleCount; i++) {\n let flags = samples[i].flags;\n data[i + 4] = (flags.isLeading << 6) // is_leading: 2 (bit)\n | (flags.dependsOn << 4) // sample_depends_on\n | (flags.isDependedOn << 2) // sample_is_depended_on\n | (flags.hasRedundancy); // sample_has_redundancy\n }\n return MP4.box(MP4.types.sdtp, data);\n }\n\n // Track fragment run box\n static trun(track, offset) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let dataSize = 12 + 16 * sampleCount;\n let data = new Uint8Array(dataSize);\n offset += 8 + dataSize;\n\n data.set([\n 0x00, 0x00, 0x0F, 0x01, // version(0) & flags\n (sampleCount >>> 24) & 0xFF, // sample_count\n (sampleCount >>> 16) & 0xFF,\n (sampleCount >>> 8) & 0xFF,\n (sampleCount) & 0xFF,\n (offset >>> 24) & 0xFF, // data_offset\n (offset >>> 16) & 0xFF,\n (offset >>> 8) & 0xFF,\n (offset) & 0xFF\n ], 0);\n\n for (let i = 0; i < sampleCount; i++) {\n let duration = samples[i].duration;\n let size = samples[i].size;\n let flags = samples[i].flags;\n let cts = samples[i].cts;\n data.set([\n (duration >>> 24) & 0xFF, // sample_duration\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n (size >>> 24) & 0xFF, // sample_size\n (size >>> 16) & 0xFF,\n (size >>> 8) & 0xFF,\n (size) & 0xFF,\n (flags.isLeading << 2) | flags.dependsOn, // sample_flags\n (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) | flags.isNonSync,\n 0x00, 0x00, // sample_degradation_priority\n (cts >>> 24) & 0xFF, // sample_composition_time_offset\n (cts >>> 16) & 0xFF,\n (cts >>> 8) & 0xFF,\n (cts) & 0xFF\n ], 12 + 16 * i);\n }\n return MP4.box(MP4.types.trun, data);\n }\n\n static mdat(data) {\n return MP4.box(MP4.types.mdat, data);\n }\n\n}\n\nMP4.init();\n\nexport default MP4;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is modified from dailymotion's hls.js library (hls.js/src/helper/aac.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass AAC {\n\n static getSilentFrame(codec, channelCount) {\n if (codec === 'mp4a.40.2') {\n // handle LC-AAC\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);\n } else if (channelCount === 2) {\n return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]);\n } else if (channelCount === 3) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]);\n } else if (channelCount === 4) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]);\n } else if (channelCount === 5) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]);\n } else if (channelCount === 6) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2, 0x00, 0x20, 0x08, 0xe0]);\n }\n } else {\n // handle HE-AAC (mp4a.40.5 / mp4a.40.29)\n if (channelCount === 1) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0:d=0.05\" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n } else if (channelCount === 2) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n } else if (channelCount === 3) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n }\n }\n return null;\n }\n\n}\n\nexport default AAC;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport MP4 from './mp4-generator.js';\nimport AAC from './aac-silent.js';\nimport Browser from '../utils/browser.js';\nimport { SampleInfo, MediaSegmentInfo, MediaSegmentInfoList } from '../core/media-segment-info.js';\nimport { IllegalStateException } from '../utils/exception.js';\n\n\n// Fragmented mp4 remuxer\nclass MP4Remuxer {\n\n constructor(config) {\n this.TAG = 'MP4Remuxer';\n\n this._config = config;\n this._isLive = (config.isLive === true) ? true : false;\n\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioDtsBase = Infinity;\n this._videoDtsBase = Infinity;\n this._audioNextDts = undefined;\n this._videoNextDts = undefined;\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n\n this._audioMeta = null;\n this._videoMeta = null;\n\n this._audioSegmentInfoList = new MediaSegmentInfoList('audio');\n this._videoSegmentInfoList = new MediaSegmentInfoList('video');\n\n this._onInitSegment = null;\n this._onMediaSegment = null;\n\n // Workaround for chrome < 50: Always force first sample as a Random Access Point in media segment\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n this._forceFirstIDR = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661))) ? true : false;\n\n // Workaround for IE11/Edge: Fill silent aac frame after keyframe-seeking\n // Make audio beginDts equals with video beginDts, in order to fix seek freeze\n this._fillSilentAfterSeek = (Browser.msedge || Browser.msie);\n\n // While only FireFox supports 'audio/mp4, codecs=\"mp3\"', use 'audio/mpeg' for chrome, safari, ...\n this._mp3UseMpegAudio = !Browser.firefox;\n\n this._fillAudioTimestampGap = this._config.fixAudioTimestampGap;\n }\n\n destroy() {\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioMeta = null;\n this._videoMeta = null;\n this._audioSegmentInfoList.clear();\n this._audioSegmentInfoList = null;\n this._videoSegmentInfoList.clear();\n this._videoSegmentInfoList = null;\n this._onInitSegment = null;\n this._onMediaSegment = null;\n }\n\n bindDataSource(producer) {\n producer.onDataAvailable = this.remux.bind(this);\n producer.onTrackMetadata = this._onTrackMetadataReceived.bind(this);\n return this;\n }\n\n /* prototype: function onInitSegment(type: string, initSegment: ArrayBuffer): void\n InitSegment: {\n type: string,\n data: ArrayBuffer,\n codec: string,\n container: string\n }\n */\n get onInitSegment() {\n return this._onInitSegment;\n }\n\n set onInitSegment(callback) {\n this._onInitSegment = callback;\n }\n\n /* prototype: function onMediaSegment(type: string, mediaSegment: MediaSegment): void\n MediaSegment: {\n type: string,\n data: ArrayBuffer,\n sampleCount: int32\n info: MediaSegmentInfo\n }\n */\n get onMediaSegment() {\n return this._onMediaSegment;\n }\n\n set onMediaSegment(callback) {\n this._onMediaSegment = callback;\n }\n\n insertDiscontinuity() {\n this._audioNextDts = this._videoNextDts = undefined;\n }\n\n seek(originalDts) {\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n this._videoSegmentInfoList.clear();\n this._audioSegmentInfoList.clear();\n }\n\n remux(audioTrack, videoTrack) {\n if (!this._onMediaSegment) {\n throw new IllegalStateException('MP4Remuxer: onMediaSegment callback must be specificed!');\n }\n if (!this._dtsBaseInited) {\n this._calculateDtsBase(audioTrack, videoTrack);\n }\n if (videoTrack) {\n this._remuxVideo(videoTrack);\n }\n if (audioTrack) {\n this._remuxAudio(audioTrack);\n }\n }\n\n _onTrackMetadataReceived(type, metadata) {\n let metabox = null;\n\n let container = 'mp4';\n let codec = metadata.codec;\n\n if (type === 'audio') {\n this._audioMeta = metadata;\n if (metadata.codec === 'mp3' && this._mp3UseMpegAudio) {\n // 'audio/mpeg' for MP3 audio track\n container = 'mpeg';\n codec = '';\n metabox = new Uint8Array();\n } else {\n // 'audio/mp4, codecs=\"codec\"'\n metabox = MP4.generateInitSegment(metadata);\n }\n } else if (type === 'video') {\n this._videoMeta = metadata;\n metabox = MP4.generateInitSegment(metadata);\n } else {\n return;\n }\n\n // dispatch metabox (Initialization Segment)\n if (!this._onInitSegment) {\n throw new IllegalStateException('MP4Remuxer: onInitSegment callback must be specified!');\n }\n this._onInitSegment(type, {\n type: type,\n data: metabox.buffer,\n codec: codec,\n container: `${type}/${container}`,\n mediaDuration: metadata.duration // in timescale 1000 (milliseconds)\n });\n }\n\n _calculateDtsBase(audioTrack, videoTrack) {\n if (this._dtsBaseInited) {\n return;\n }\n\n if (audioTrack && audioTrack.samples && audioTrack.samples.length) {\n this._audioDtsBase = audioTrack.samples[0].dts;\n }\n if (videoTrack && videoTrack.samples && videoTrack.samples.length) {\n this._videoDtsBase = videoTrack.samples[0].dts;\n }\n\n this._dtsBase = Math.min(this._audioDtsBase, this._videoDtsBase);\n this._dtsBaseInited = true;\n }\n\n getTimestampBase() {\n if (!this._dtsBaseInited) {\n return undefined;\n }\n return this._dtsBase;\n }\n\n flushStashedSamples() {\n let videoSample = this._videoStashedLastSample;\n let audioSample = this._audioStashedLastSample;\n\n let videoTrack = {\n type: 'video',\n id: 1,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (videoSample != null) {\n videoTrack.samples.push(videoSample);\n videoTrack.length = videoSample.length;\n }\n\n let audioTrack = {\n type: 'audio',\n id: 2,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (audioSample != null) {\n audioTrack.samples.push(audioSample);\n audioTrack.length = audioSample.length;\n }\n\n this._videoStashedLastSample = null;\n this._audioStashedLastSample = null;\n\n this._remuxVideo(videoTrack, true);\n this._remuxAudio(audioTrack, true);\n }\n\n _remuxAudio(audioTrack, force) {\n if (this._audioMeta == null) {\n return;\n }\n\n let track = audioTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1, lastPts = -1;\n let refSampleDuration = this._audioMeta.refSampleDuration;\n\n let mpegRawTrack = this._audioMeta.codec === 'mp3' && this._mp3UseMpegAudio;\n let firstSegmentAfterSeek = this._dtsBaseInited && this._audioNextDts === undefined;\n\n let insertPrefixSilentFrame = false;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 0;\n let mdatbox = null;\n let mdatBytes = 0;\n\n // calculate initial mdat size\n if (mpegRawTrack) {\n // for raw mpeg buffer\n offset = 0;\n mdatBytes = track.length;\n } else {\n // for fmp4 mdat box\n offset = 8; // size + type\n mdatBytes = 8 + track.length;\n }\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._audioStashedLastSample != null) {\n let sample = this._audioStashedLastSample;\n this._audioStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._audioStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._audioNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._audioNextDts;\n } else { // this._audioNextDts == undefined\n if (this._audioSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n if (this._fillSilentAfterSeek && !this._videoSegmentInfoList.isEmpty()) {\n if (this._audioMeta.originalCodec !== 'mp3') {\n insertPrefixSilentFrame = true;\n }\n }\n } else {\n let lastSample = this._audioSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n if (insertPrefixSilentFrame) {\n // align audio segment beginDts to match with current video segment's beginDts\n let firstSampleDts = firstSampleOriginalDts - dtsCorrection;\n let videoSegment = this._videoSegmentInfoList.getLastSegmentBefore(firstSampleOriginalDts);\n if (videoSegment != null && videoSegment.beginDts < firstSampleDts) {\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit) {\n let dts = videoSegment.beginDts;\n let silentFrameDuration = firstSampleDts - videoSegment.beginDts;\n Log.v(this.TAG, `InsertPrefixSilentAudio: dts: ${dts}, duration: ${silentFrameDuration}`);\n samples.unshift({ unit: silentUnit, dts: dts, pts: dts });\n mdatBytes += silentUnit.byteLength;\n } // silentUnit == null: Cannot generate, skip\n } else {\n insertPrefixSilentFrame = false;\n }\n }\n\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let unit = sample.unit;\n let originalDts = sample.dts - this._dtsBase;\n let dts = originalDts;\n let needFillSilentFrames = false;\n let silentFrames = null;\n let sampleDuration = 0;\n\n if (originalDts < -0.001) {\n continue; //pass the first sample with the invalid dts\n }\n\n if (this._audioMeta.codec !== 'mp3') {\n // for AAC codec, we need to keep dts increase based on refSampleDuration\n let curRefDts = originalDts;\n const maxAudioFramesDrift = 3;\n if (this._audioNextDts) {\n curRefDts = this._audioNextDts;\n }\n\n dtsCorrection = originalDts - curRefDts;\n if (dtsCorrection <= -maxAudioFramesDrift * refSampleDuration) {\n // If we're overlapping by more than maxAudioFramesDrift number of frame, drop this sample\n Log.w(this.TAG, `Dropping 1 audio frame (originalDts: ${originalDts} ms ,curRefDts: ${curRefDts} ms) due to dtsCorrection: ${dtsCorrection} ms overlap.`);\n continue;\n }\n else if (dtsCorrection >= maxAudioFramesDrift * refSampleDuration && this._fillAudioTimestampGap && !Browser.safari) {\n // Silent frame generation, if large timestamp gap detected && config.fixAudioTimestampGap\n needFillSilentFrames = true;\n // We need to insert silent frames to fill timestamp gap\n let frameCount = Math.floor(dtsCorrection / refSampleDuration);\n Log.w(this.TAG, 'Large audio timestamp gap detected, may cause AV sync to drift. ' +\n 'Silent frames will be generated to avoid unsync.\\n' +\n `originalDts: ${originalDts} ms, curRefDts: ${curRefDts} ms, ` +\n `dtsCorrection: ${Math.round(dtsCorrection)} ms, generate: ${frameCount} frames`);\n\n\n dts = Math.floor(curRefDts);\n sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts;\n\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit == null) {\n Log.w(this.TAG, 'Unable to generate silent frame for ' +\n `${this._audioMeta.originalCodec} with ${this._audioMeta.channelCount} channels, repeat last frame`);\n // Repeat last frame\n silentUnit = unit;\n }\n silentFrames = [];\n\n for (let j = 0; j < frameCount; j++) {\n curRefDts = curRefDts + refSampleDuration;\n let intDts = Math.floor(curRefDts); // change to integer\n let intDuration = Math.floor(curRefDts + refSampleDuration) - intDts;\n let frame = {\n dts: intDts,\n pts: intDts,\n cts: 0,\n unit: silentUnit,\n size: silentUnit.byteLength,\n duration: intDuration, // wait for next sample\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n };\n silentFrames.push(frame);\n mdatBytes += frame.size;;\n\n }\n\n this._audioNextDts = curRefDts + refSampleDuration;\n\n } else {\n\n dts = Math.floor(curRefDts);\n sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts;\n this._audioNextDts = curRefDts + refSampleDuration;\n\n }\n } else {\n // keep the original dts calculate algorithm for mp3\n dts = originalDts - dtsCorrection;\n\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(refSampleDuration);\n }\n }\n this._audioNextDts = dts + sampleDuration;\n }\n\n if (firstDts === -1) {\n firstDts = dts;\n }\n mp4Samples.push({\n dts: dts,\n pts: dts,\n cts: 0,\n unit: sample.unit,\n size: sample.unit.byteLength,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n });\n\n if (needFillSilentFrames) {\n // Silent frames should be inserted after wrong-duration frame\n mp4Samples.push.apply(mp4Samples, silentFrames);\n }\n }\n\n if (mp4Samples.length === 0) {\n //no samples need to remux\n track.samples = [];\n track.length = 0;\n return;\n }\n\n // allocate mdatbox\n if (mpegRawTrack) {\n // allocate for raw mpeg buffer\n mdatbox = new Uint8Array(mdatBytes);\n } else {\n // allocate for fmp4 mdat box\n mdatbox = new Uint8Array(mdatBytes);\n // size field\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n // type field (fourCC)\n mdatbox.set(MP4.types.mdat, 4);\n }\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let unit = mp4Samples[i].unit;\n mdatbox.set(unit, offset);\n offset += unit.byteLength;\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n //this._audioNextDts = lastDts;\n\n // fill media segment info & add to info list\n let info = new MediaSegmentInfo();\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstDts;\n info.endPts = lastDts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n false);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n false);\n if (!this._isLive) {\n this._audioSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n let moofbox = null;\n\n if (mpegRawTrack) {\n // Generate empty buffer, because useless for raw mpeg\n moofbox = new Uint8Array();\n } else {\n // Generate moof for fmp4 segment\n moofbox = MP4.moof(track, firstDts);\n }\n\n track.samples = [];\n track.length = 0;\n\n let segment = {\n type: 'audio',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n };\n\n if (mpegRawTrack && firstSegmentAfterSeek) {\n // For MPEG audio stream in MSE, if seeking occurred, before appending new buffer\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n segment.timestampOffset = firstDts;\n }\n\n this._onMediaSegment('audio', segment);\n }\n\n _remuxVideo(videoTrack, force) {\n if (this._videoMeta == null) {\n return;\n }\n\n let track = videoTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1;\n let firstPts = -1, lastPts = -1;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 8;\n let mdatbox = null;\n let mdatBytes = 8 + videoTrack.length;\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._videoStashedLastSample != null) {\n let sample = this._videoStashedLastSample;\n this._videoStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._videoStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._videoNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._videoNextDts;\n } else { // this._videoNextDts == undefined\n if (this._videoSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n } else {\n let lastSample = this._videoSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n let info = new MediaSegmentInfo();\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let originalDts = sample.dts - this._dtsBase;\n let isKeyframe = sample.isKeyframe;\n let dts = originalDts - dtsCorrection;\n let cts = sample.cts;\n let pts = dts + cts;\n\n if (firstDts === -1) {\n firstDts = dts;\n firstPts = pts;\n }\n\n let sampleDuration = 0;\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(this._videoMeta.refSampleDuration);\n }\n }\n\n if (isKeyframe) {\n let syncPoint = new SampleInfo(dts, pts, sampleDuration, sample.dts, true);\n syncPoint.fileposition = sample.fileposition;\n info.appendSyncPoint(syncPoint);\n }\n\n mp4Samples.push({\n dts: dts,\n pts: pts,\n cts: cts,\n units: sample.units,\n size: sample.length,\n isKeyframe: isKeyframe,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: isKeyframe ? 2 : 1,\n isDependedOn: isKeyframe ? 1 : 0,\n hasRedundancy: 0,\n isNonSync: isKeyframe ? 0 : 1\n }\n });\n }\n\n // allocate mdatbox\n mdatbox = new Uint8Array(mdatBytes);\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n mdatbox.set(MP4.types.mdat, 4);\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let units = mp4Samples[i].units;\n while (units.length) {\n let unit = units.shift();\n let data = unit.data;\n mdatbox.set(data, offset);\n offset += data.byteLength;\n }\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n lastPts = latest.pts + latest.duration;\n this._videoNextDts = lastDts;\n\n // fill media segment info & add to info list\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstPts;\n info.endPts = lastPts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n mp4Samples[0].isKeyframe);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n latest.isKeyframe);\n if (!this._isLive) {\n this._videoSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n // workaround for chrome < 50: force first sample as a random access point\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n if (this._forceFirstIDR) {\n let flags = mp4Samples[0].flags;\n flags.dependsOn = 2;\n flags.isNonSync = 0;\n }\n\n let moofbox = MP4.moof(track, firstDts);\n track.samples = [];\n track.length = 0;\n\n this._onMediaSegment('video', {\n type: 'video',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n });\n }\n\n _mergeBoxes(moof, mdat) {\n let result = new Uint8Array(moof.byteLength + mdat.byteLength);\n result.set(moof, 0);\n result.set(mdat, moof.byteLength);\n return result;\n }\n\n}\n\nexport default MP4Remuxer;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MediaInfo from './media-info.js';\nimport FLVDemuxer from '../demux/flv-demuxer.js';\nimport TSDemuxer from '../demux/ts-demuxer';\nimport MP4Remuxer from '../remux/mp4-remuxer.js';\nimport DemuxErrors from '../demux/demux-errors.js';\nimport IOController from '../io/io-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport {LoaderStatus, LoaderErrors} from '../io/loader.js';\n\n// Transmuxing (IO, Demuxing, Remuxing) controller, with multipart support\nclass TransmuxingController {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'TransmuxingController';\n this._emitter = new EventEmitter();\n\n this._config = config;\n\n // treat single part media as multipart media, which has only one segment\n if (!mediaDataSource.segments) {\n mediaDataSource.segments = [{\n duration: mediaDataSource.duration,\n filesize: mediaDataSource.filesize,\n url: mediaDataSource.url\n }];\n }\n\n // fill in default IO params if not exists\n if (typeof mediaDataSource.cors !== 'boolean') {\n mediaDataSource.cors = true;\n }\n if (typeof mediaDataSource.withCredentials !== 'boolean') {\n mediaDataSource.withCredentials = false;\n }\n\n this._mediaDataSource = mediaDataSource;\n this._currentSegmentIndex = 0;\n let totalDuration = 0;\n\n this._mediaDataSource.segments.forEach((segment) => {\n // timestampBase for each segment, and calculate total duration\n segment.timestampBase = totalDuration;\n totalDuration += segment.duration;\n // params needed by IOController\n segment.cors = mediaDataSource.cors;\n segment.withCredentials = mediaDataSource.withCredentials;\n // referrer policy control, if exist\n if (config.referrerPolicy) {\n segment.referrerPolicy = config.referrerPolicy;\n }\n });\n\n if (!isNaN(totalDuration) && this._mediaDataSource.duration !== totalDuration) {\n this._mediaDataSource.duration = totalDuration;\n }\n\n this._mediaInfo = null;\n this._demuxer = null;\n this._remuxer = null;\n this._ioctl = null;\n\n this._pendingSeekTime = null;\n this._pendingResolveSeekPoint = null;\n\n this._statisticsReporter = null;\n }\n\n destroy() {\n this._mediaInfo = null;\n this._mediaDataSource = null;\n\n if (this._statisticsReporter) {\n this._disableStatisticsReporter();\n }\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n if (this._demuxer) {\n this._demuxer.destroy();\n this._demuxer = null;\n }\n if (this._remuxer) {\n this._remuxer.destroy();\n this._remuxer = null;\n }\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n start() {\n this._loadSegment(0);\n this._enableStatisticsReporter();\n }\n\n _loadSegment(segmentIndex, optionalFrom) {\n this._currentSegmentIndex = segmentIndex;\n let dataSource = this._mediaDataSource.segments[segmentIndex];\n\n let ioctl = this._ioctl = new IOController(dataSource, this._config, segmentIndex);\n ioctl.onError = this._onIOException.bind(this);\n ioctl.onSeeked = this._onIOSeeked.bind(this);\n ioctl.onComplete = this._onIOComplete.bind(this);\n ioctl.onRedirect = this._onIORedirect.bind(this);\n ioctl.onRecoveredEarlyEof = this._onIORecoveredEarlyEof.bind(this);\n\n if (optionalFrom) {\n this._demuxer.bindDataSource(this._ioctl);\n } else {\n ioctl.onDataArrival = this._onInitChunkArrival.bind(this);\n }\n\n ioctl.open(optionalFrom);\n }\n\n stop() {\n this._internalAbort();\n this._disableStatisticsReporter();\n }\n\n _internalAbort() {\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n }\n\n pause() { // take a rest\n if (this._ioctl && this._ioctl.isWorking()) {\n this._ioctl.pause();\n this._disableStatisticsReporter();\n }\n }\n\n resume() {\n if (this._ioctl && this._ioctl.isPaused()) {\n this._ioctl.resume();\n this._enableStatisticsReporter();\n }\n }\n\n seek(milliseconds) {\n if (this._mediaInfo == null || !this._mediaInfo.isSeekable()) {\n return;\n }\n\n let targetSegmentIndex = this._searchSegmentIndexContains(milliseconds);\n\n if (targetSegmentIndex === this._currentSegmentIndex) {\n // intra-segment seeking\n let segmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (segmentInfo == undefined) {\n // current segment loading started, but mediainfo hasn't received yet\n // wait for the metadata loaded, then seek to expected position\n this._pendingSeekTime = milliseconds;\n } else {\n let keyframe = segmentInfo.getNearestKeyframe(milliseconds);\n this._remuxer.seek(keyframe.milliseconds);\n this._ioctl.seek(keyframe.fileposition);\n // Will be resolved in _onRemuxerMediaSegmentArrival()\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n }\n } else {\n // cross-segment seeking\n let targetSegmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (targetSegmentInfo == undefined) {\n // target segment hasn't been loaded. We need metadata then seek to expected time\n this._pendingSeekTime = milliseconds;\n this._internalAbort();\n this._remuxer.seek();\n this._remuxer.insertDiscontinuity();\n this._loadSegment(targetSegmentIndex);\n // Here we wait for the metadata loaded, then seek to expected position\n } else {\n // We have target segment's metadata, direct seek to target position\n let keyframe = targetSegmentInfo.getNearestKeyframe(milliseconds);\n this._internalAbort();\n this._remuxer.seek(milliseconds);\n this._remuxer.insertDiscontinuity();\n this._demuxer.resetMediaInfo();\n this._demuxer.timestampBase = this._mediaDataSource.segments[targetSegmentIndex].timestampBase;\n this._loadSegment(targetSegmentIndex, keyframe.fileposition);\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n this._reportSegmentMediaInfo(targetSegmentIndex);\n }\n }\n\n this._enableStatisticsReporter();\n }\n\n _searchSegmentIndexContains(milliseconds) {\n let segments = this._mediaDataSource.segments;\n let idx = segments.length - 1;\n\n for (let i = 0; i < segments.length; i++) {\n if (milliseconds < segments[i].timestampBase) {\n idx = i - 1;\n break;\n }\n }\n return idx;\n }\n\n _onInitChunkArrival(data, byteStart) {\n let consumed = 0;\n\n if (byteStart > 0) {\n // IOController seeked immediately after opened, byteStart > 0 callback may received\n this._demuxer.bindDataSource(this._ioctl);\n this._demuxer.timestampBase = this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase;\n\n consumed = this._demuxer.parseChunks(data, byteStart);\n } else {\n // byteStart == 0, Initial data, probe it first\n let probeData = null;\n\n // Try probing input data as FLV first\n probeData = FLVDemuxer.probe(data);\n if (probeData.match) {\n // Hit as FLV\n this._setupFLVDemuxerRemuxer(probeData);\n consumed = this._demuxer.parseChunks(data, byteStart);\n }\n\n if (!probeData.match && !probeData.needMoreData) {\n // Non-FLV, try MPEG-TS probe\n probeData = TSDemuxer.probe(data);\n if (probeData.match) {\n // Hit as MPEG-TS\n this._setupTSDemuxerRemuxer(probeData);\n consumed = this._demuxer.parseChunks(data, byteStart);\n }\n }\n\n if (!probeData.match && !probeData.needMoreData) {\n // Both probing as FLV / MPEG-TS failed, report error\n probeData = null;\n Log.e(this.TAG, 'Non MPEG-TS/FLV, Unsupported media type!');\n Promise.resolve().then(() => {\n this._internalAbort();\n });\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, DemuxErrors.FORMAT_UNSUPPORTED, 'Non MPEG-TS/FLV, Unsupported media type!');\n // Leave consumed as 0\n }\n }\n\n return consumed;\n }\n\n _setupFLVDemuxerRemuxer(probeData) {\n this._demuxer = new FLVDemuxer(probeData, this._config);\n\n if (!this._remuxer) {\n this._remuxer = new MP4Remuxer(this._config);\n }\n\n let mds = this._mediaDataSource;\n if (mds.duration != undefined && !isNaN(mds.duration)) {\n this._demuxer.overridedDuration = mds.duration;\n }\n if (typeof mds.hasAudio === 'boolean') {\n this._demuxer.overridedHasAudio = mds.hasAudio;\n }\n if (typeof mds.hasVideo === 'boolean') {\n this._demuxer.overridedHasVideo = mds.hasVideo;\n }\n\n this._demuxer.timestampBase = mds.segments[this._currentSegmentIndex].timestampBase;\n\n this._demuxer.onError = this._onDemuxException.bind(this);\n this._demuxer.onMediaInfo = this._onMediaInfo.bind(this);\n this._demuxer.onMetaDataArrived = this._onMetaDataArrived.bind(this);\n this._demuxer.onScriptDataArrived = this._onScriptDataArrived.bind(this);\n\n this._remuxer.bindDataSource(this._demuxer\n .bindDataSource(this._ioctl\n ));\n\n this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);\n this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);\n }\n\n _setupTSDemuxerRemuxer(probeData) {\n let demuxer = this._demuxer = new TSDemuxer(probeData, this._config);\n\n if (!this._remuxer) {\n this._remuxer = new MP4Remuxer(this._config);\n }\n\n demuxer.onError = this._onDemuxException.bind(this);\n demuxer.onMediaInfo = this._onMediaInfo.bind(this);\n demuxer.onMetaDataArrived = this._onMetaDataArrived.bind(this);\n demuxer.onTimedID3Metadata = this._onTimedID3Metadata.bind(this);\n demuxer.onSMPTE2038Metadata = this._onSMPTE2038Metadata.bind(this);\n demuxer.onSCTE35Metadata = this._onSCTE35Metadata.bind(this);\n demuxer.onPESPrivateDataDescriptor = this._onPESPrivateDataDescriptor.bind(this);\n demuxer.onPESPrivateData = this._onPESPrivateData.bind(this);\n\n this._remuxer.bindDataSource(this._demuxer);\n this._demuxer.bindDataSource(this._ioctl);\n\n this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);\n this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);\n }\n\n _onMediaInfo(mediaInfo) {\n if (this._mediaInfo == null) {\n // Store first segment's mediainfo as global mediaInfo\n this._mediaInfo = Object.assign({}, mediaInfo);\n this._mediaInfo.keyframesIndex = null;\n this._mediaInfo.segments = [];\n this._mediaInfo.segmentCount = this._mediaDataSource.segments.length;\n Object.setPrototypeOf(this._mediaInfo, MediaInfo.prototype);\n }\n\n let segmentInfo = Object.assign({}, mediaInfo);\n Object.setPrototypeOf(segmentInfo, MediaInfo.prototype);\n this._mediaInfo.segments[this._currentSegmentIndex] = segmentInfo;\n\n // notify mediaInfo update\n this._reportSegmentMediaInfo(this._currentSegmentIndex);\n\n if (this._pendingSeekTime != null) {\n Promise.resolve().then(() => {\n let target = this._pendingSeekTime;\n this._pendingSeekTime = null;\n this.seek(target);\n });\n }\n }\n\n _onMetaDataArrived(metadata) {\n this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);\n }\n\n _onScriptDataArrived(data) {\n this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);\n }\n\n _onTimedID3Metadata(timed_id3_metadata) {\n let timestamp_base = this._remuxer.getTimestampBase();\n if (timestamp_base == undefined) { return; }\n\n if (timed_id3_metadata.pts != undefined) {\n timed_id3_metadata.pts -= timestamp_base;\n }\n\n if (timed_id3_metadata.dts != undefined) {\n timed_id3_metadata.dts -= timestamp_base;\n }\n\n this._emitter.emit(TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED, timed_id3_metadata);\n }\n\n _onSMPTE2038Metadata(smpte2038_metadata) {\n let timestamp_base = this._remuxer.getTimestampBase();\n if (timestamp_base == undefined) { return; }\n\n if (smpte2038_metadata.pts != undefined) {\n smpte2038_metadata.pts -= timestamp_base;\n }\n\n if (smpte2038_metadata.dts != undefined) {\n smpte2038_metadata.dts -= timestamp_base;\n }\n\n if (smpte2038_metadata.nearest_pts != undefined) {\n smpte2038_metadata.nearest_pts -= timestamp_base;\n }\n\n this._emitter.emit(TransmuxingEvents.SMPTE2038_METADATA_ARRIVED, smpte2038_metadata);\n }\n\n _onSCTE35Metadata(scte35) {\n let timestamp_base = this._remuxer.getTimestampBase();\n if (timestamp_base == undefined) { return; }\n\n if (scte35.pts != undefined) {\n scte35.pts -= timestamp_base;\n }\n\n if (scte35.nearest_pts != undefined) {\n scte35.nearest_pts -= timestamp_base;\n }\n\n this._emitter.emit(TransmuxingEvents.SCTE35_METADATA_ARRIVED, scte35);\n }\n\n _onPESPrivateDataDescriptor(descriptor) {\n this._emitter.emit(TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR, descriptor);\n }\n\n _onPESPrivateData(private_data) {\n let timestamp_base = this._remuxer.getTimestampBase();\n if (timestamp_base == undefined) { return; }\n\n if (private_data.pts != undefined) {\n private_data.pts -= timestamp_base;\n }\n\n if (private_data.nearest_pts != undefined) {\n private_data.nearest_pts -= timestamp_base;\n }\n\n if (private_data.dts != undefined) {\n private_data.dts -= timestamp_base;\n }\n\n this._emitter.emit(TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED, private_data);\n }\n\n _onIOSeeked() {\n this._remuxer.insertDiscontinuity();\n }\n\n _onIOComplete(extraData) {\n let segmentIndex = extraData;\n let nextSegmentIndex = segmentIndex + 1;\n\n if (nextSegmentIndex < this._mediaDataSource.segments.length) {\n this._internalAbort();\n if (this._remuxer) {\n this._remuxer.flushStashedSamples();\n }\n this._loadSegment(nextSegmentIndex);\n } else {\n if (this._remuxer) {\n this._remuxer.flushStashedSamples();\n }\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n this._disableStatisticsReporter();\n }\n }\n\n _onIORedirect(redirectedURL) {\n let segmentIndex = this._ioctl.extraData;\n this._mediaDataSource.segments[segmentIndex].redirectedURL = redirectedURL;\n }\n\n _onIORecoveredEarlyEof() {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n }\n\n _onIOException(type, info) {\n Log.e(this.TAG, `IOException: type = ${type}, code = ${info.code}, msg = ${info.msg}`);\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n this._disableStatisticsReporter();\n }\n\n _onDemuxException(type, info) {\n Log.e(this.TAG, `DemuxException: type = ${type}, info = ${info}`);\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n }\n\n _onRemuxerInitSegmentArrival(type, initSegment) {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n }\n\n _onRemuxerMediaSegmentArrival(type, mediaSegment) {\n if (this._pendingSeekTime != null) {\n // Media segments after new-segment cross-seeking should be dropped.\n return;\n }\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n\n // Resolve pending seekPoint\n if (this._pendingResolveSeekPoint != null && type === 'video') {\n let syncPoints = mediaSegment.info.syncPoints;\n let seekpoint = this._pendingResolveSeekPoint;\n this._pendingResolveSeekPoint = null;\n\n // Safari: Pass PTS for recommend_seekpoint\n if (Browser.safari && syncPoints.length > 0 && syncPoints[0].originalDts === seekpoint) {\n seekpoint = syncPoints[0].pts;\n }\n // else: use original DTS (keyframe.milliseconds)\n\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, seekpoint);\n }\n }\n\n _enableStatisticsReporter() {\n if (this._statisticsReporter == null) {\n this._statisticsReporter = self.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n }\n\n _disableStatisticsReporter() {\n if (this._statisticsReporter) {\n self.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n _reportSegmentMediaInfo(segmentIndex) {\n let segmentInfo = this._mediaInfo.segments[segmentIndex];\n let exportInfo = Object.assign({}, segmentInfo);\n\n exportInfo.duration = this._mediaInfo.duration;\n exportInfo.segmentCount = this._mediaInfo.segmentCount;\n delete exportInfo.segments;\n delete exportInfo.keyframesIndex;\n\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, exportInfo);\n }\n\n _reportStatisticsInfo() {\n let info = {};\n\n info.url = this._ioctl.currentURL;\n info.hasRedirect = this._ioctl.hasRedirect;\n if (info.hasRedirect) {\n info.redirectedURL = this._ioctl.currentRedirectedURL;\n }\n\n info.speed = this._ioctl.currentSpeed;\n info.loaderType = this._ioctl.loaderType;\n info.currentSegmentIndex = this._currentSegmentIndex;\n info.totalSegmentCount = this._mediaDataSource.segments.length;\n\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, info);\n }\n\n}\n\nexport default TransmuxingController;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Utility class to calculate realtime network I/O speed\nclass SpeedSampler {\n\n constructor() {\n // milliseconds\n this._firstCheckpoint = 0;\n this._lastCheckpoint = 0;\n this._intervalBytes = 0;\n this._totalBytes = 0;\n this._lastSecondBytes = 0;\n\n // compatibility detection\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n }\n\n reset() {\n this._firstCheckpoint = this._lastCheckpoint = 0;\n this._totalBytes = this._intervalBytes = 0;\n this._lastSecondBytes = 0;\n }\n\n addBytes(bytes) {\n if (this._firstCheckpoint === 0) {\n this._firstCheckpoint = this._now();\n this._lastCheckpoint = this._firstCheckpoint;\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else if (this._now() - this._lastCheckpoint < 1000) {\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else { // duration >= 1000\n this._lastSecondBytes = this._intervalBytes;\n this._intervalBytes = bytes;\n this._totalBytes += bytes;\n this._lastCheckpoint = this._now();\n }\n }\n\n get currentKBps() {\n this.addBytes(0);\n\n let durationSeconds = (this._now() - this._lastCheckpoint) / 1000;\n if (durationSeconds == 0) durationSeconds = 1;\n return (this._intervalBytes / durationSeconds) / 1024;\n }\n\n get lastSecondKBps() {\n this.addBytes(0);\n\n if (this._lastSecondBytes !== 0) {\n return this._lastSecondBytes / 1024;\n } else { // lastSecondBytes === 0\n if (this._now() - this._lastCheckpoint >= 500) {\n // if time interval since last checkpoint has exceeded 500ms\n // the speed is nearly accurate\n return this.currentKBps;\n } else {\n // We don't know\n return 0;\n }\n }\n }\n\n get averageKBps() {\n let durationSeconds = (this._now() - this._firstCheckpoint) / 1000;\n return (this._totalBytes / durationSeconds) / 1024;\n }\n\n}\n\nexport default SpeedSampler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n/* fetch + stream IO loader. Currently working on chrome 43+.\n * fetch provides a better alternative http API to XMLHttpRequest\n *\n * fetch spec https://fetch.spec.whatwg.org/\n * stream spec https://streams.spec.whatwg.org/\n */\nclass FetchStreamLoader extends BaseLoader {\n\n static isSupported() {\n try {\n // fetch + stream is broken on Microsoft Edge. Disable before build 15048.\n // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8196907/\n // Fixed in Jan 10, 2017. Build 15048+ removed from blacklist.\n let isWorkWellEdge = Browser.msedge && Browser.version.minor >= 15048;\n let browserNotBlacklisted = Browser.msedge ? isWorkWellEdge : true;\n return (self.fetch && self.ReadableStream && browserNotBlacklisted);\n } catch (e) {\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('fetch-stream-loader');\n this.TAG = 'FetchStreamLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._requestAbort = false;\n this._abortController = null;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n\n let headers = new self.Headers();\n\n if (typeof seekConfig.headers === 'object') {\n let configHeaders = seekConfig.headers;\n for (let key in configHeaders) {\n if (configHeaders.hasOwnProperty(key)) {\n headers.append(key, configHeaders[key]);\n }\n }\n }\n\n let params = {\n method: 'GET',\n headers: headers,\n mode: 'cors',\n cache: 'default',\n // The default policy of Fetch API in the whatwg standard\n // Safari incorrectly indicates 'no-referrer' as default policy, fuck it\n referrerPolicy: 'no-referrer-when-downgrade'\n };\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n for (let key in this._config.headers) {\n headers.append(key, this._config.headers[key]);\n }\n }\n\n // cors is enabled by default\n if (dataSource.cors === false) {\n // no-cors means 'disregard cors policy', which can only be used in ServiceWorker\n params.mode = 'same-origin';\n }\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n params.credentials = 'include';\n }\n\n // referrerPolicy from config\n if (dataSource.referrerPolicy) {\n params.referrerPolicy = dataSource.referrerPolicy;\n }\n\n if (self.AbortController) {\n this._abortController = new self.AbortController();\n params.signal = this._abortController.signal;\n }\n\n this._status = LoaderStatus.kConnecting;\n self.fetch(seekConfig.url, params).then((res) => {\n if (this._requestAbort) {\n this._status = LoaderStatus.kIdle;\n res.body.cancel();\n return;\n }\n if (res.ok && (res.status >= 200 && res.status <= 299)) {\n if (res.url !== seekConfig.url) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(res.url);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n let lengthHeader = res.headers.get('Content-Length');\n if (lengthHeader != null) {\n this._contentLength = parseInt(lengthHeader);\n if (this._contentLength !== 0) {\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n return this._pump.call(this, res.body.getReader());\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: res.status, msg: res.statusText});\n } else {\n throw new RuntimeException('FetchStreamLoader: Http code invalid, ' + res.status + ' ' + res.statusText);\n }\n }\n }).catch((e) => {\n if (this._abortController && this._abortController.signal.aborted) {\n return;\n }\n\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, {code: -1, msg: e.message});\n } else {\n throw e;\n }\n });\n }\n\n abort() {\n this._requestAbort = true;\n\n if (this._status !== LoaderStatus.kBuffering || !Browser.chrome) {\n // Chrome may throw Exception-like things here, avoid using if is buffering\n if (this._abortController) {\n try {\n this._abortController.abort();\n } catch (e) {}\n }\n }\n }\n\n _pump(reader) { // ReadableStreamReader\n return reader.read().then((result) => {\n if (result.done) {\n // First check received length\n if (this._contentLength !== null && this._receivedLength < this._contentLength) {\n // Report Early-EOF\n this._status = LoaderStatus.kError;\n let type = LoaderErrors.EARLY_EOF;\n let info = {code: -1, msg: 'Fetch stream meet Early-EOF'};\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n } else {\n // OK. Download complete\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n } else {\n if (this._abortController && this._abortController.signal.aborted) {\n this._status = LoaderStatus.kComplete;\n return;\n } else if (this._requestAbort === true) {\n this._status = LoaderStatus.kComplete;\n return reader.cancel();\n }\n\n this._status = LoaderStatus.kBuffering;\n\n let chunk = result.value.buffer;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n this._pump(reader);\n }\n }).catch((e) => {\n if (this._abortController && this._abortController.signal.aborted) {\n this._status = LoaderStatus.kComplete;\n return;\n }\n\n if (e.code === 11 && Browser.msedge) { // InvalidStateError on Microsoft Edge\n // Workaround: Edge may throw InvalidStateError after ReadableStreamReader.cancel() call\n // Ignore the unknown exception.\n // Related issue: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11265202/\n return;\n }\n\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if ((e.code === 19 || e.message === 'network error') && // NETWORK_ERR\n (this._contentLength === null ||\n (this._contentLength !== null && this._receivedLength < this._contentLength))) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: e.code, msg: 'Fetch stream meet Early-EOF'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: e.code, msg: e.message};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n });\n }\n\n}\n\nexport default FetchStreamLoader;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For FireFox browser which supports `xhr.responseType = 'moz-chunked-arraybuffer'`\nclass MozChunkedLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n // Firefox 37- requires .open() to be called before setting responseType\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n return (xhr.responseType === 'moz-chunked-arraybuffer');\n } catch (e) {\n Log.w('MozChunkedLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-moz-chunked-loader');\n this.TAG = 'MozChunkedLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._xhr = null;\n this._requestAbort = false;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onloadend = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._requestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onloadend = this._onLoadEnd.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n // cors is auto detected and enabled by xhr\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n this._status = LoaderStatus.kConnecting;\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n if (this._xhr) {\n this._xhr.abort();\n }\n this._status = LoaderStatus.kComplete;\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined && xhr.responseURL !== this._requestURL) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n if (xhr.status !== 0 && (xhr.status < 200 || xhr.status > 299)) {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('MozChunkedLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n } else {\n this._status = LoaderStatus.kBuffering;\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n if (e.total !== null && e.total !== 0) {\n this._contentLength = e.total;\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onLoadEnd(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n } else if (this._status === LoaderStatus.kError) {\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && e.loaded < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'Moz-Chunked stream meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default MozChunkedLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// Universal IO Loader, implemented by adding Range header in xhr's request header\nclass RangeLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'arraybuffer';\n return (xhr.responseType === 'arraybuffer');\n } catch (e) {\n Log.w('RangeLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-range-loader');\n this.TAG = 'RangeLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = false;\n\n this._chunkSizeKBList = [\n 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192\n ];\n this._currentChunkSizeKB = 384;\n this._currentSpeedNormalized = 0;\n this._zeroSpeedChunkCount = 0;\n\n this._xhr = null;\n this._speedSampler = new SpeedSampler();\n\n this._requestAbort = false;\n this._waitForTotalLength = false;\n this._totalLengthReceived = false;\n\n this._currentRequestURL = null;\n this._currentRedirectedURL = null;\n this._currentRequestRange = null;\n this._totalLength = null; // size of the entire file\n this._contentLength = null; // Content-Length of entire request range\n this._receivedLength = 0; // total received bytes\n this._lastTimeLoaded = 0; // received bytes of current request sub-range\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n get currentSpeed() {\n return this._speedSampler.lastSecondKBps;\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n this._status = LoaderStatus.kConnecting;\n\n let useRefTotalLength = false;\n if (this._dataSource.filesize != undefined && this._dataSource.filesize !== 0) {\n useRefTotalLength = true;\n this._totalLength = this._dataSource.filesize;\n }\n\n if (!this._totalLengthReceived && !useRefTotalLength) {\n // We need total filesize\n this._waitForTotalLength = true;\n this._internalOpen(this._dataSource, {from: 0, to: -1});\n } else {\n // We have filesize, start loading\n this._openSubRange();\n }\n }\n\n _openSubRange() {\n let chunkSize = this._currentChunkSizeKB * 1024;\n\n let from = this._range.from + this._receivedLength;\n let to = from + chunkSize;\n\n if (this._contentLength != null) {\n if (to - this._range.from >= this._contentLength) {\n to = this._range.from + this._contentLength - 1;\n }\n }\n\n this._currentRequestRange = {from, to};\n this._internalOpen(this._dataSource, this._currentRequestRange);\n }\n\n _internalOpen(dataSource, range) {\n this._lastTimeLoaded = 0;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL) {\n if (this._currentRedirectedURL != undefined) {\n sourceURL = this._currentRedirectedURL;\n } else if (dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._currentRequestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onload = this._onLoad.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n this._internalAbort();\n this._status = LoaderStatus.kComplete;\n }\n\n _internalAbort() {\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr.abort();\n this._xhr = null;\n }\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined) { // if the browser support this property\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {\n this._currentRedirectedURL = redirectedURL;\n if (this._onURLRedirect) {\n this._onURLRedirect(redirectedURL);\n }\n }\n }\n\n if ((xhr.status >= 200 && xhr.status <= 299)) {\n if (this._waitForTotalLength) {\n return;\n }\n this._status = LoaderStatus.kBuffering;\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('RangeLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n let openNextRange = false;\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n this._totalLengthReceived = true;\n openNextRange = true;\n\n let total = e.total;\n this._internalAbort();\n if (total != null & total !== 0) {\n this._totalLength = total;\n }\n }\n\n // calculate currrent request range's contentLength\n if (this._range.to === -1) {\n this._contentLength = this._totalLength - this._range.from;\n } else { // to !== -1\n this._contentLength = this._range.to - this._range.from + 1;\n }\n\n if (openNextRange) {\n this._openSubRange();\n return;\n }\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n\n let delta = e.loaded - this._lastTimeLoaded;\n this._lastTimeLoaded = e.loaded;\n this._speedSampler.addBytes(delta);\n }\n\n _normalizeSpeed(input) {\n let list = this._chunkSizeKBList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _onLoad(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n return;\n }\n\n this._lastTimeLoaded = 0;\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps === 0) {\n this._zeroSpeedChunkCount++;\n if (this._zeroSpeedChunkCount >= 3) {\n // Try get currentKBps after 3 chunks\n KBps = this._speedSampler.currentKBps;\n }\n }\n\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._currentSpeedNormalized !== normalized) {\n this._currentSpeedNormalized = normalized;\n this._currentChunkSizeKB = normalized;\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n let reportComplete = false;\n\n if (this._contentLength != null && this._receivedLength < this._contentLength) {\n // continue load next chunk\n this._openSubRange();\n } else {\n reportComplete = true;\n }\n\n // dispatch received chunk\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n if (reportComplete) {\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && this._receivedLength > 0\n && this._receivedLength < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'RangeLoader meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default RangeLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For MPEG-TS/FLV over WebSocket live stream\nclass WebSocketLoader extends BaseLoader {\n\n static isSupported() {\n try {\n return (typeof self.WebSocket !== 'undefined');\n } catch (e) {\n return false;\n }\n }\n\n constructor() {\n super('websocket-loader');\n this.TAG = 'WebSocketLoader';\n\n this._needStash = true;\n\n this._ws = null;\n this._requestAbort = false;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this._ws) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource) {\n try {\n let ws = this._ws = new self.WebSocket(dataSource.url);\n ws.binaryType = 'arraybuffer';\n ws.onopen = this._onWebSocketOpen.bind(this);\n ws.onclose = this._onWebSocketClose.bind(this);\n ws.onmessage = this._onWebSocketMessage.bind(this);\n ws.onerror = this._onWebSocketError.bind(this);\n\n this._status = LoaderStatus.kConnecting;\n } catch (e) {\n this._status = LoaderStatus.kError;\n\n let info = {code: e.code, msg: e.message};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n abort() {\n let ws = this._ws;\n if (ws && (ws.readyState === 0 || ws.readyState === 1)) { // CONNECTING || OPEN\n this._requestAbort = true;\n ws.close();\n }\n\n this._ws = null;\n this._status = LoaderStatus.kComplete;\n }\n\n _onWebSocketOpen(e) {\n this._status = LoaderStatus.kBuffering;\n }\n\n _onWebSocketClose(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n\n if (this._onComplete) {\n this._onComplete(0, this._receivedLength - 1);\n }\n }\n\n _onWebSocketMessage(e) {\n if (e.data instanceof ArrayBuffer) {\n this._dispatchArrayBuffer(e.data);\n } else if (e.data instanceof Blob) {\n let reader = new FileReader();\n reader.onload = () => {\n this._dispatchArrayBuffer(reader.result);\n };\n reader.readAsArrayBuffer(e.data);\n } else {\n this._status = LoaderStatus.kError;\n let info = {code: -1, msg: 'Unsupported WebSocket message type: ' + e.data.constructor.name};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n _dispatchArrayBuffer(arraybuffer) {\n let chunk = arraybuffer;\n let byteStart = this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onWebSocketError(e) {\n this._status = LoaderStatus.kError;\n\n let info = {\n code: e.code,\n msg: e.message\n };\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default WebSocketLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass RangeSeekHandler {\n\n constructor(zeroStart) {\n this._zeroStart = zeroStart || false;\n }\n\n getConfig(url, range) {\n let headers = {};\n\n if (range.from !== 0 || range.to !== -1) {\n let param;\n if (range.to !== -1) {\n param = `bytes=${range.from.toString()}-${range.to.toString()}`;\n } else {\n param = `bytes=${range.from.toString()}-`;\n }\n headers['Range'] = param;\n } else if (this._zeroStart) {\n headers['Range'] = 'bytes=0-';\n }\n\n return {\n url: url,\n headers: headers\n };\n }\n\n removeURLParameters(seekedURL) {\n return seekedURL;\n }\n\n}\n\nexport default RangeSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass ParamSeekHandler {\n\n constructor(paramStart, paramEnd) {\n this._startName = paramStart;\n this._endName = paramEnd;\n }\n\n getConfig(baseUrl, range) {\n let url = baseUrl;\n\n if (range.from !== 0 || range.to !== -1) {\n let needAnd = true;\n if (url.indexOf('?') === -1) {\n url += '?';\n needAnd = false;\n }\n\n if (needAnd) {\n url += '&';\n }\n\n url += `${this._startName}=${range.from.toString()}`;\n\n if (range.to !== -1) {\n url += `&${this._endName}=${range.to.toString()}`;\n }\n }\n\n return {\n url: url,\n headers: {}\n };\n }\n\n removeURLParameters(seekedURL) {\n let baseURL = seekedURL.split('?')[0];\n let params = undefined;\n\n let queryIndex = seekedURL.indexOf('?');\n if (queryIndex !== -1) {\n params = seekedURL.substring(queryIndex + 1);\n }\n\n let resultParams = '';\n\n if (params != undefined && params.length > 0) {\n let pairs = params.split('&');\n\n for (let i = 0; i < pairs.length; i++) {\n let pair = pairs[i].split('=');\n let requireAnd = (i > 0);\n\n if (pair[0] !== this._startName && pair[0] !== this._endName) {\n if (requireAnd) {\n resultParams += '&';\n }\n resultParams += pairs[i];\n }\n }\n }\n\n return (resultParams.length === 0) ? baseURL : baseURL + '?' + resultParams;\n }\n\n}\n\nexport default ParamSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {LoaderStatus, LoaderErrors} from './loader.js';\nimport FetchStreamLoader from './fetch-stream-loader.js';\nimport MozChunkedLoader from './xhr-moz-chunked-loader.js';\nimport MSStreamLoader from './xhr-msstream-loader.js';\nimport RangeLoader from './xhr-range-loader.js';\nimport WebSocketLoader from './websocket-loader.js';\nimport RangeSeekHandler from './range-seek-handler.js';\nimport ParamSeekHandler from './param-seek-handler.js';\nimport {RuntimeException, IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n/**\n * DataSource: {\n * url: string,\n * filesize: number,\n * cors: boolean,\n * withCredentials: boolean\n * }\n * \n */\n\n// Manage IO Loaders\nclass IOController {\n\n constructor(dataSource, config, extraData) {\n this.TAG = 'IOController';\n\n this._config = config;\n this._extraData = extraData;\n\n this._stashInitialSize = 64 * 1024; // default initial size: 64KB\n if (config.stashInitialSize != undefined && config.stashInitialSize > 0) {\n // apply from config\n this._stashInitialSize = config.stashInitialSize;\n }\n\n this._stashUsed = 0;\n this._stashSize = this._stashInitialSize;\n this._bufferSize = 1024 * 1024 * 3; // initial size: 3MB\n this._stashBuffer = new ArrayBuffer(this._bufferSize);\n this._stashByteStart = 0;\n this._enableStash = true;\n if (config.enableStashBuffer === false) {\n this._enableStash = false;\n }\n\n this._loader = null;\n this._loaderClass = null;\n this._seekHandler = null;\n\n this._dataSource = dataSource;\n this._isWebSocketURL = /wss?:\\/\\/(.+?)/.test(dataSource.url);\n this._refTotalLength = dataSource.filesize ? dataSource.filesize : null;\n this._totalLength = this._refTotalLength;\n this._fullRequestFlag = false;\n this._currentRange = null;\n this._redirectedURL = null;\n\n this._speedNormalized = 0;\n this._speedSampler = new SpeedSampler();\n this._speedNormalizeList = [32, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096];\n\n this._isEarlyEofReconnecting = false;\n\n this._paused = false;\n this._resumeFrom = 0;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._selectSeekHandler();\n this._selectLoader();\n this._createLoader();\n }\n\n destroy() {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n this._loader.destroy();\n this._loader = null;\n this._loaderClass = null;\n this._dataSource = null;\n this._stashBuffer = null;\n this._stashUsed = this._stashSize = this._bufferSize = this._stashByteStart = 0;\n this._currentRange = null;\n this._speedSampler = null;\n\n this._isEarlyEofReconnecting = false;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._extraData = null;\n }\n\n isWorking() {\n return this._loader && this._loader.isWorking() && !this._paused;\n }\n\n isPaused() {\n return this._paused;\n }\n\n get status() {\n return this._loader.status;\n }\n\n get extraData() {\n return this._extraData;\n }\n\n set extraData(data) {\n this._extraData = data;\n }\n\n // prototype: function onDataArrival(chunks: ArrayBuffer, byteStart: number): number\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onSeeked() {\n return this._onSeeked;\n }\n\n set onSeeked(callback) {\n this._onSeeked = callback;\n }\n\n // prototype: function onError(type: number, info: {code: number, msg: string}): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n get onRedirect() {\n return this._onRedirect;\n }\n\n set onRedirect(callback) {\n this._onRedirect = callback;\n }\n\n get onRecoveredEarlyEof() {\n return this._onRecoveredEarlyEof;\n }\n\n set onRecoveredEarlyEof(callback) {\n this._onRecoveredEarlyEof = callback;\n }\n\n get currentURL() {\n return this._dataSource.url;\n }\n\n get hasRedirect() {\n return (this._redirectedURL != null || this._dataSource.redirectedURL != undefined);\n }\n\n get currentRedirectedURL() {\n return this._redirectedURL || this._dataSource.redirectedURL;\n }\n\n // in KB/s\n get currentSpeed() {\n if (this._loaderClass === RangeLoader) {\n // SpeedSampler is inaccuracy if loader is RangeLoader\n return this._loader.currentSpeed;\n }\n return this._speedSampler.lastSecondKBps;\n }\n\n get loaderType() {\n return this._loader.type;\n }\n\n _selectSeekHandler() {\n let config = this._config;\n\n if (config.seekType === 'range') {\n this._seekHandler = new RangeSeekHandler(this._config.rangeLoadZeroStart);\n } else if (config.seekType === 'param') {\n let paramStart = config.seekParamStart || 'bstart';\n let paramEnd = config.seekParamEnd || 'bend';\n\n this._seekHandler = new ParamSeekHandler(paramStart, paramEnd);\n } else if (config.seekType === 'custom') {\n if (typeof config.customSeekHandler !== 'function') {\n throw new InvalidArgumentException('Custom seekType specified in config but invalid customSeekHandler!');\n }\n this._seekHandler = new config.customSeekHandler();\n } else {\n throw new InvalidArgumentException(`Invalid seekType in config: ${config.seekType}`);\n }\n }\n\n _selectLoader() {\n if (this._config.customLoader != null) {\n this._loaderClass = this._config.customLoader;\n } else if (this._isWebSocketURL) {\n this._loaderClass = WebSocketLoader;\n } else if (FetchStreamLoader.isSupported()) {\n this._loaderClass = FetchStreamLoader;\n } else if (MozChunkedLoader.isSupported()) {\n this._loaderClass = MozChunkedLoader;\n } else if (RangeLoader.isSupported()) {\n this._loaderClass = RangeLoader;\n } else {\n throw new RuntimeException('Your browser doesn\\'t support xhr with arraybuffer responseType!');\n }\n }\n\n _createLoader() {\n this._loader = new this._loaderClass(this._seekHandler, this._config);\n if (this._loader.needStashBuffer === false) {\n this._enableStash = false;\n }\n this._loader.onContentLengthKnown = this._onContentLengthKnown.bind(this);\n this._loader.onURLRedirect = this._onURLRedirect.bind(this);\n this._loader.onDataArrival = this._onLoaderChunkArrival.bind(this);\n this._loader.onComplete = this._onLoaderComplete.bind(this);\n this._loader.onError = this._onLoaderError.bind(this);\n }\n\n open(optionalFrom) {\n this._currentRange = {from: 0, to: -1};\n if (optionalFrom) {\n this._currentRange.from = optionalFrom;\n }\n\n this._speedSampler.reset();\n if (!optionalFrom) {\n this._fullRequestFlag = true;\n }\n\n this._loader.open(this._dataSource, Object.assign({}, this._currentRange));\n }\n\n abort() {\n this._loader.abort();\n\n if (this._paused) {\n this._paused = false;\n this._resumeFrom = 0;\n }\n }\n\n pause() {\n if (this.isWorking()) {\n this._loader.abort();\n\n if (this._stashUsed !== 0) {\n this._resumeFrom = this._stashByteStart;\n this._currentRange.to = this._stashByteStart - 1;\n } else {\n this._resumeFrom = this._currentRange.to + 1;\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._paused = true;\n }\n }\n\n resume() {\n if (this._paused) {\n this._paused = false;\n let bytes = this._resumeFrom;\n this._resumeFrom = 0;\n this._internalSeek(bytes, true);\n }\n }\n\n seek(bytes) {\n this._paused = false;\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._internalSeek(bytes, true);\n }\n\n /**\n * When seeking request is from media seeking, unconsumed stash data should be dropped\n * However, stash data shouldn't be dropped if seeking requested from http reconnection\n *\n * @dropUnconsumed: Ignore and discard all unconsumed data in stash buffer\n */\n _internalSeek(bytes, dropUnconsumed) {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n\n // dispatch & flush stash buffer before seek\n this._flushStashBuffer(dropUnconsumed);\n\n this._loader.destroy();\n this._loader = null;\n\n let requestRange = {from: bytes, to: -1};\n this._currentRange = {from: requestRange.from, to: -1};\n\n this._speedSampler.reset();\n this._stashSize = this._stashInitialSize;\n this._createLoader();\n this._loader.open(this._dataSource, requestRange);\n\n if (this._onSeeked) {\n this._onSeeked();\n }\n }\n\n updateUrl(url) {\n if (!url || typeof url !== 'string' || url.length === 0) {\n throw new InvalidArgumentException('Url must be a non-empty string!');\n }\n\n this._dataSource.url = url;\n\n // TODO: replace with new url\n }\n\n _expandBuffer(expectedBytes) {\n let bufferNewSize = this._stashSize;\n while (bufferNewSize + 1024 * 1024 * 1 < expectedBytes) {\n bufferNewSize *= 2;\n }\n\n bufferNewSize += 1024 * 1024 * 1; // bufferSize = stashSize + 1MB\n if (bufferNewSize === this._bufferSize) {\n return;\n }\n\n let newBuffer = new ArrayBuffer(bufferNewSize);\n\n if (this._stashUsed > 0) { // copy existing data into new buffer\n let stashOldArray = new Uint8Array(this._stashBuffer, 0, this._stashUsed);\n let stashNewArray = new Uint8Array(newBuffer, 0, bufferNewSize);\n stashNewArray.set(stashOldArray, 0);\n }\n\n this._stashBuffer = newBuffer;\n this._bufferSize = bufferNewSize;\n }\n\n _normalizeSpeed(input) {\n let list = this._speedNormalizeList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n // binary search\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _adjustStashSize(normalized) {\n let stashSizeKB = 0;\n\n if (this._config.isLive) {\n // live stream: always use 1/8 normalized speed for size of stashSizeKB\n stashSizeKB = normalized / 8;\n } else {\n if (normalized < 512) {\n stashSizeKB = normalized;\n } else if (normalized >= 512 && normalized <= 1024) {\n stashSizeKB = Math.floor(normalized * 1.5);\n } else {\n stashSizeKB = normalized * 2;\n }\n }\n\n if (stashSizeKB > 8192) {\n stashSizeKB = 8192;\n }\n\n let bufferSize = stashSizeKB * 1024 + 1024 * 1024 * 1; // stashSize + 1MB\n if (this._bufferSize < bufferSize) {\n this._expandBuffer(bufferSize);\n }\n this._stashSize = stashSizeKB * 1024;\n }\n\n _dispatchChunks(chunks, byteStart) {\n this._currentRange.to = byteStart + chunks.byteLength - 1;\n return this._onDataArrival(chunks, byteStart);\n }\n\n _onURLRedirect(redirectedURL) {\n this._redirectedURL = redirectedURL;\n if (this._onRedirect) {\n this._onRedirect(redirectedURL);\n }\n }\n\n _onContentLengthKnown(contentLength) {\n if (contentLength && this._fullRequestFlag) {\n this._totalLength = contentLength;\n this._fullRequestFlag = false;\n }\n }\n\n _onLoaderChunkArrival(chunk, byteStart, receivedLength) {\n if (!this._onDataArrival) {\n throw new IllegalStateException('IOController: No existing consumer (onDataArrival) callback!');\n }\n if (this._paused) {\n return;\n }\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof succeed, notify to upper-layer by callback\n this._isEarlyEofReconnecting = false;\n if (this._onRecoveredEarlyEof) {\n this._onRecoveredEarlyEof();\n }\n }\n\n this._speedSampler.addBytes(chunk.byteLength);\n\n // adjust stash buffer size according to network speed dynamically\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._speedNormalized !== normalized) {\n this._speedNormalized = normalized;\n this._adjustStashSize(normalized);\n }\n }\n\n if (!this._enableStash) { // disable stash\n if (this._stashUsed === 0) {\n // dispatch chunk directly to consumer;\n // check ret value (consumed bytes) and stash unconsumed to stashBuffer\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) { // unconsumed data remain.\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n } else {\n // else: Merge chunk into stashBuffer, and dispatch stashBuffer to consumer.\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n let consumed = this._dispatchChunks(this._stashBuffer.slice(0, this._stashUsed), this._stashByteStart);\n if (consumed < this._stashUsed && consumed > 0) { // unconsumed data remain\n let remainArray = new Uint8Array(this._stashBuffer, consumed);\n stashArray.set(remainArray, 0);\n }\n this._stashUsed -= consumed;\n this._stashByteStart += consumed;\n }\n } else { // enable stash\n if (this._stashUsed === 0 && this._stashByteStart === 0) { // seeked? or init chunk?\n // This is the first chunk after seek action\n this._stashByteStart = byteStart;\n }\n if (this._stashUsed + chunk.byteLength <= this._stashSize) {\n // just stash\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._stashSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stashUsed + chunkSize > stashSize, size limit exceeded\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n if (this._stashUsed > 0) { // There're stash datas in buffer\n // dispatch the whole stashBuffer, and stash remain data\n // then append chunk to stashBuffer (stash)\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n if (consumed < buffer.byteLength) {\n if (consumed > 0) {\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n } else {\n this._stashUsed = 0;\n this._stashByteStart += consumed;\n }\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stash buffer empty, but chunkSize > stashSize (oh, holy shit)\n // dispatch chunk directly and stash remain data\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) {\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n }\n }\n }\n }\n\n _flushStashBuffer(dropUnconsumed) {\n if (this._stashUsed > 0) {\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n let remain = buffer.byteLength - consumed;\n\n if (consumed < buffer.byteLength) {\n if (dropUnconsumed) {\n Log.w(this.TAG, `${remain} bytes unconsumed data remain when flush buffer, dropped`);\n } else {\n if (consumed > 0) {\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n return 0;\n }\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n return remain;\n }\n return 0;\n }\n\n _onLoaderComplete(from, to) {\n // Force-flush stash buffer, and drop unconsumed data\n this._flushStashBuffer(true);\n\n if (this._onComplete) {\n this._onComplete(this._extraData);\n }\n }\n\n _onLoaderError(type, data) {\n Log.e(this.TAG, `Loader error, code = ${data.code}, msg = ${data.msg}`);\n\n this._flushStashBuffer(false);\n\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof failed, throw UnrecoverableEarlyEof error to upper-layer\n this._isEarlyEofReconnecting = false;\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n }\n\n switch (type) {\n case LoaderErrors.EARLY_EOF: {\n if (!this._config.isLive) {\n // Do internal http reconnect if not live stream\n if (this._totalLength) {\n let nextFrom = this._currentRange.to + 1;\n if (nextFrom < this._totalLength) {\n Log.w(this.TAG, 'Connection lost, trying reconnect...');\n this._isEarlyEofReconnecting = true;\n this._internalSeek(nextFrom, false);\n }\n return;\n }\n // else: We don't know totalLength, throw UnrecoverableEarlyEof\n }\n // live stream: throw UnrecoverableEarlyEof error to upper-layer\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n break;\n }\n case LoaderErrors.UNRECOVERABLE_EARLY_EOF:\n case LoaderErrors.CONNECTING_TIMEOUT:\n case LoaderErrors.HTTP_STATUS_CODE_INVALID:\n case LoaderErrors.EXCEPTION:\n break;\n }\n\n if (this._onError) {\n this._onError(type, data);\n } else {\n throw new RuntimeException('IOException: ' + data.msg);\n }\n }\n\n}\n\nexport default IOController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass Polyfill {\n\n static install() {\n // ES6 Object.setPrototypeOf\n Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {\n obj.__proto__ = proto;\n return obj;\n };\n\n // ES6 Object.assign\n Object.assign = Object.assign || function (target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n let output = Object(target);\n for (let i = 1; i < arguments.length; i++) {\n let source = arguments[i];\n if (source !== undefined && source !== null) {\n for (let key in source) {\n if (source.hasOwnProperty(key)) {\n output[key] = source[key];\n }\n }\n }\n }\n return output;\n };\n\n // ES6 Promise (missing support in IE11)\n if (typeof self.Promise !== 'function') {\n require('es6-promise').polyfill();\n }\n }\n\n}\n\nPolyfill.install();\n\nexport default Polyfill;","function webpackBootstrapFunc (modules) {\n/******/ // The module cache\n/******/ var installedModules = {};\n\n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n\n/******/ // Check if module is in cache\n/******/ if(installedModules[moduleId])\n/******/ return installedModules[moduleId].exports;\n\n/******/ // Create a new module (and put it into the cache)\n/******/ var module = installedModules[moduleId] = {\n/******/ i: moduleId,\n/******/ l: false,\n/******/ exports: {}\n/******/ };\n\n/******/ // Execute the module function\n/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ // Flag the module as loaded\n/******/ module.l = true;\n\n/******/ // Return the exports of the module\n/******/ return module.exports;\n/******/ }\n\n/******/ // expose the modules object (__webpack_modules__)\n/******/ __webpack_require__.m = modules;\n\n/******/ // expose the module cache\n/******/ __webpack_require__.c = installedModules;\n\n/******/ // identity function for calling harmony imports with the correct context\n/******/ __webpack_require__.i = function(value) { return value; };\n\n/******/ // define getter function for harmony exports\n/******/ __webpack_require__.d = function(exports, name, getter) {\n/******/ if(!__webpack_require__.o(exports, name)) {\n/******/ Object.defineProperty(exports, name, {\n/******/ configurable: false,\n/******/ enumerable: true,\n/******/ get: getter\n/******/ });\n/******/ }\n/******/ };\n\n/******/ // define __esModule on exports\n/******/ __webpack_require__.r = function(exports) {\n/******/ Object.defineProperty(exports, '__esModule', { value: true });\n/******/ };\n\n/******/ // getDefaultExport function for compatibility with non-harmony modules\n/******/ __webpack_require__.n = function(module) {\n/******/ var getter = module && module.__esModule ?\n/******/ function getDefault() { return module['default']; } :\n/******/ function getModuleExports() { return module; };\n/******/ __webpack_require__.d(getter, 'a', getter);\n/******/ return getter;\n/******/ };\n\n/******/ // Object.prototype.hasOwnProperty.call\n/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n/******/ // __webpack_public_path__\n/******/ __webpack_require__.p = \"/\";\n\n/******/ // on error function for async loading\n/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n var f = __webpack_require__(__webpack_require__.s = ENTRY_MODULE)\n return f.default || f // try to call default if defined to also support babel esmodule exports\n}\n\nvar moduleNameReqExp = '[\\\\.|\\\\-|\\\\+|\\\\w|\\/|@]+'\nvar dependencyRegExp = '\\\\(\\\\s*(\\/\\\\*.*?\\\\*\\/)?\\\\s*.*?(' + moduleNameReqExp + ').*?\\\\)' // additional chars when output.pathinfo is true\n\n// http://stackoverflow.com/a/2593661/130442\nfunction quoteRegExp (str) {\n return (str + '').replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&')\n}\n\nfunction isNumeric(n) {\n return !isNaN(1 * n); // 1 * n converts integers, integers as string (\"123\"), 1e3 and \"1e3\" to integers and strings to NaN\n}\n\nfunction getModuleDependencies (sources, module, queueName) {\n var retval = {}\n retval[queueName] = []\n\n var fnString = module.toString()\n var wrapperSignature = fnString.match(/^function\\s?\\w*\\(\\w+,\\s*\\w+,\\s*(\\w+)\\)/)\n if (!wrapperSignature) return retval\n var webpackRequireName = wrapperSignature[1]\n\n // main bundle deps\n var re = new RegExp('(\\\\\\\\n|\\\\W)' + quoteRegExp(webpackRequireName) + dependencyRegExp, 'g')\n var match\n while ((match = re.exec(fnString))) {\n if (match[3] === 'dll-reference') continue\n retval[queueName].push(match[3])\n }\n\n // dll deps\n re = new RegExp('\\\\(' + quoteRegExp(webpackRequireName) + '\\\\(\"(dll-reference\\\\s(' + moduleNameReqExp + '))\"\\\\)\\\\)' + dependencyRegExp, 'g')\n while ((match = re.exec(fnString))) {\n if (!sources[match[2]]) {\n retval[queueName].push(match[1])\n sources[match[2]] = __webpack_require__(match[1]).m\n }\n retval[match[2]] = retval[match[2]] || []\n retval[match[2]].push(match[4])\n }\n\n // convert 1e3 back to 1000 - this can be important after uglify-js converted 1000 to 1e3\n var keys = Object.keys(retval);\n for (var i = 0; i < keys.length; i++) {\n for (var j = 0; j < retval[keys[i]].length; j++) {\n if (isNumeric(retval[keys[i]][j])) {\n retval[keys[i]][j] = 1 * retval[keys[i]][j];\n }\n }\n }\n\n return retval\n}\n\nfunction hasValuesInQueues (queues) {\n var keys = Object.keys(queues)\n return keys.reduce(function (hasValues, key) {\n return hasValues || queues[key].length > 0\n }, false)\n}\n\nfunction getRequiredModules (sources, moduleId) {\n var modulesQueue = {\n main: [moduleId]\n }\n var requiredModules = {\n main: []\n }\n var seenModules = {\n main: {}\n }\n\n while (hasValuesInQueues(modulesQueue)) {\n var queues = Object.keys(modulesQueue)\n for (var i = 0; i < queues.length; i++) {\n var queueName = queues[i]\n var queue = modulesQueue[queueName]\n var moduleToCheck = queue.pop()\n seenModules[queueName] = seenModules[queueName] || {}\n if (seenModules[queueName][moduleToCheck] || !sources[queueName][moduleToCheck]) continue\n seenModules[queueName][moduleToCheck] = true\n requiredModules[queueName] = requiredModules[queueName] || []\n requiredModules[queueName].push(moduleToCheck)\n var newModules = getModuleDependencies(sources, sources[queueName][moduleToCheck], queueName)\n var newModulesKeys = Object.keys(newModules)\n for (var j = 0; j < newModulesKeys.length; j++) {\n modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]] || []\n modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]].concat(newModules[newModulesKeys[j]])\n }\n }\n }\n\n return requiredModules\n}\n\nmodule.exports = function (moduleId, options) {\n options = options || {}\n var sources = {\n main: __webpack_modules__\n }\n\n var requiredModules = options.all ? { main: Object.keys(sources.main) } : getRequiredModules(sources, moduleId)\n\n var src = ''\n\n Object.keys(requiredModules).filter(function (m) { return m !== 'main' }).forEach(function (module) {\n var entryModule = 0\n while (requiredModules[module][entryModule]) {\n entryModule++\n }\n requiredModules[module].push(entryModule)\n sources[module][entryModule] = '(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })'\n src = src + 'var ' + module + ' = (' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(entryModule)) + ')({' + requiredModules[module].map(function (id) { return '' + JSON.stringify(id) + ': ' + sources[module][id].toString() }).join(',') + '});\\n'\n })\n\n src = src + 'new ((' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(moduleId)) + ')({' + requiredModules.main.map(function (id) { return '' + JSON.stringify(id) + ': ' + sources.main[id].toString() }).join(',') + '}))(self);'\n\n var blob = new window.Blob([src], { type: 'text/javascript' })\n if (options.bare) { return blob }\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL\n\n var workerUrl = URL.createObjectURL(blob)\n var worker = new window.Worker(workerUrl)\n worker.objectURL = workerUrl\n\n return worker\n}\n","// entry/index file\n\n// make it compatible with browserify's umd wrapper\nmodule.exports = require('./mpegts.js').default;\n","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.8+1e68dce6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var vertx = Function('return this')().require('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n var then$$1 = void 0;\n try {\n then$$1 = value.then;\n } catch (error) {\n reject(promise, error);\n return;\n }\n handleMaybeThenable(promise, value, then$$1);\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = true;\n\n if (hasCallback) {\n try {\n value = callback(detail);\n } catch (e) {\n succeeded = false;\n error = e;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (succeeded === false) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = void 0;\n var error = void 0;\n var didError = false;\n try {\n _then = entry.then;\n } catch (e) {\n didError = true;\n error = e;\n }\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n if (didError) {\n reject(promise, error);\n } else {\n handleMaybeThenable(promise, entry, _then);\n }\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n if (isFunction(callback)) {\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n }\n\n return promise.then(callback, callback);\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport Polyfill from '../utils/polyfill.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\n\n/* post message to worker:\n data: {\n cmd: string\n param: any\n }\n\n receive message from worker:\n data: {\n msg: string,\n data: any\n }\n */\n\nlet TransmuxingWorker = function (self) {\n\n let TAG = 'TransmuxingWorker';\n let controller = null;\n let logcatListener = onLogcatCallback.bind(this);\n\n Polyfill.install();\n\n self.addEventListener('message', function (e) {\n switch (e.data.cmd) {\n case 'init':\n controller = new TransmuxingController(e.data.param[0], e.data.param[1]);\n controller.on(TransmuxingEvents.IO_ERROR, onIOError.bind(this));\n controller.on(TransmuxingEvents.DEMUX_ERROR, onDemuxError.bind(this));\n controller.on(TransmuxingEvents.INIT_SEGMENT, onInitSegment.bind(this));\n controller.on(TransmuxingEvents.MEDIA_SEGMENT, onMediaSegment.bind(this));\n controller.on(TransmuxingEvents.LOADING_COMPLETE, onLoadingComplete.bind(this));\n controller.on(TransmuxingEvents.RECOVERED_EARLY_EOF, onRecoveredEarlyEof.bind(this));\n controller.on(TransmuxingEvents.MEDIA_INFO, onMediaInfo.bind(this));\n controller.on(TransmuxingEvents.METADATA_ARRIVED, onMetaDataArrived.bind(this));\n controller.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, onScriptDataArrived.bind(this));\n controller.on(TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED, onTimedID3MetadataArrived.bind(this));\n controller.on(TransmuxingEvents.SMPTE2038_METADATA_ARRIVED, onSMPTE2038MetadataArrived.bind(this));\n controller.on(TransmuxingEvents.SCTE35_METADATA_ARRIVED, onSCTE35MetadataArrived.bind(this));\n controller.on(TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR, onPESPrivateDataDescriptor.bind(this));\n controller.on(TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED, onPESPrivateDataArrived.bind(this));\n controller.on(TransmuxingEvents.STATISTICS_INFO, onStatisticsInfo.bind(this));\n controller.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, onRecommendSeekpoint.bind(this));\n break;\n case 'destroy':\n if (controller) {\n controller.destroy();\n controller = null;\n }\n self.postMessage({msg: 'destroyed'});\n break;\n case 'start':\n controller.start();\n break;\n case 'stop':\n controller.stop();\n break;\n case 'seek':\n controller.seek(e.data.param);\n break;\n case 'pause':\n controller.pause();\n break;\n case 'resume':\n controller.resume();\n break;\n case 'logging_config': {\n let config = e.data.param;\n LoggingControl.applyConfig(config);\n\n if (config.enableCallback === true) {\n LoggingControl.addLogListener(logcatListener);\n } else {\n LoggingControl.removeLogListener(logcatListener);\n }\n break;\n }\n }\n });\n\n function onInitSegment(type, initSegment) {\n let obj = {\n msg: TransmuxingEvents.INIT_SEGMENT,\n data: {\n type: type,\n data: initSegment\n }\n };\n self.postMessage(obj, [initSegment.data]); // data: ArrayBuffer\n }\n\n function onMediaSegment(type, mediaSegment) {\n let obj = {\n msg: TransmuxingEvents.MEDIA_SEGMENT,\n data: {\n type: type,\n data: mediaSegment\n }\n };\n self.postMessage(obj, [mediaSegment.data]); // data: ArrayBuffer\n }\n\n function onLoadingComplete() {\n let obj = {\n msg: TransmuxingEvents.LOADING_COMPLETE\n };\n self.postMessage(obj);\n }\n\n function onRecoveredEarlyEof() {\n let obj = {\n msg: TransmuxingEvents.RECOVERED_EARLY_EOF\n };\n self.postMessage(obj);\n }\n\n function onMediaInfo(mediaInfo) {\n let obj = {\n msg: TransmuxingEvents.MEDIA_INFO,\n data: mediaInfo\n };\n self.postMessage(obj);\n }\n\n function onMetaDataArrived(metadata) {\n let obj = {\n msg: TransmuxingEvents.METADATA_ARRIVED,\n data: metadata\n };\n self.postMessage(obj);\n }\n\n function onScriptDataArrived(data) {\n let obj = {\n msg: TransmuxingEvents.SCRIPTDATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onTimedID3MetadataArrived (data) {\n let obj = {\n msg: TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onSMPTE2038MetadataArrived (data) {\n let obj = {\n msg: TransmuxingEvents.SMPTE2038_METADATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onSCTE35MetadataArrived (data) {\n let obj = {\n msg: TransmuxingEvents.SCTE35_METADATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onPESPrivateDataDescriptor(data) {\n let obj = {\n msg: TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onPESPrivateDataArrived(data) {\n let obj = {\n msg: TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onStatisticsInfo(statInfo) {\n let obj = {\n msg: TransmuxingEvents.STATISTICS_INFO,\n data: statInfo\n };\n self.postMessage(obj);\n }\n\n function onIOError(type, info) {\n self.postMessage({\n msg: TransmuxingEvents.IO_ERROR,\n data: {\n type: type,\n info: info\n }\n });\n }\n\n function onDemuxError(type, info) {\n self.postMessage({\n msg: TransmuxingEvents.DEMUX_ERROR,\n data: {\n type: type,\n info: info\n }\n });\n }\n\n function onRecommendSeekpoint(milliseconds) {\n self.postMessage({\n msg: TransmuxingEvents.RECOMMEND_SEEKPOINT,\n data: milliseconds\n });\n }\n\n function onLogcatCallback(type, str) {\n self.postMessage({\n msg: 'logcat_callback',\n data: {\n type: type,\n logcat: str\n }\n });\n }\n\n};\n\nexport default TransmuxingWorker;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const defaultConfig = {\n enableWorker: false,\n enableStashBuffer: true,\n stashInitialSize: undefined,\n\n isLive: false,\n\n liveBufferLatencyChasing: false,\n liveBufferLatencyMaxLatency: 1.5,\n liveBufferLatencyMinRemain: 0.5,\n\n lazyLoad: true,\n lazyLoadMaxDuration: 3 * 60,\n lazyLoadRecoverDuration: 30,\n deferLoadAfterSourceOpen: true,\n\n // autoCleanupSourceBuffer: default as false, leave unspecified\n autoCleanupMaxBackwardDuration: 3 * 60,\n autoCleanupMinBackwardDuration: 2 * 60,\n\n statisticsInfoReportInterval: 600,\n\n fixAudioTimestampGap: true,\n\n accurateSeek: false,\n seekType: 'range', // [range, param, custom]\n seekParamStart: 'bstart',\n seekParamEnd: 'bend',\n rangeLoadZeroStart: false,\n customSeekHandler: undefined,\n reuseRedirectedURL: false,\n // referrerPolicy: leave as unspecified\n\n headers: undefined,\n customLoader: undefined\n};\n\nexport function createDefaultConfig() {\n return Object.assign({}, defaultConfig);\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport IOController from '../io/io-controller.js';\nimport {createDefaultConfig} from '../config.js';\n\nclass Features {\n\n static supportMSEH264Playback() {\n return window.MediaSource &&\n window.MediaSource.isTypeSupported('video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"');\n }\n\n static supportMSEH265Playback() {\n return window.MediaSource &&\n window.MediaSource.isTypeSupported('video/mp4; codecs=\"hvc1.1.6.L93.B0\"');\n }\n\n static supportNetworkStreamIO() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType == 'fetch-stream-loader' || loaderType == 'xhr-moz-chunked-loader';\n }\n\n static getNetworkLoaderTypeName() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType;\n }\n\n static supportNativeMediaPlayback(mimeType) {\n if (Features.videoElement == undefined) {\n Features.videoElement = window.document.createElement('video');\n }\n let canPlay = Features.videoElement.canPlayType(mimeType);\n return canPlay === 'probably' || canPlay == 'maybe';\n }\n\n static getFeatureList() {\n let features = {\n msePlayback: false,\n mseLivePlayback: false,\n mseH265Playback: false,\n networkStreamIO: false,\n networkLoaderName: '',\n nativeMP4H264Playback: false,\n nativeMP4H265Playback: false,\n nativeWebmVP8Playback: false,\n nativeWebmVP9Playback: false\n };\n\n features.msePlayback = Features.supportMSEH264Playback();\n features.networkStreamIO = Features.supportNetworkStreamIO();\n features.networkLoaderName = Features.getNetworkLoaderTypeName();\n features.mseLivePlayback = features.msePlayback && features.networkStreamIO;\n features.mseH265Playback = Features.supportMSEH265Playback();\n features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"');\n features.nativeMP4H265Playback = Features.supportNativeMediaPlayback('video/mp4; codecs=\"hvc1.1.6.L93.B0\"');\n features.nativeWebmVP8Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp8.0, vorbis\"');\n features.nativeWebmVP9Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp9\"');\n\n return features;\n }\n\n}\n\nexport default Features;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst PlayerEvents = {\n ERROR: 'error',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n METADATA_ARRIVED: 'metadata_arrived',\n SCRIPTDATA_ARRIVED: 'scriptdata_arrived',\n TIMED_ID3_METADATA_ARRIVED: 'timed_id3_metadata_arrived',\n SMPTE2038_METADATA_ARRIVED: 'smpte2038_metadata_arrived',\n SCTE35_METADATA_ARRIVED: 'scte35_metadata_arrived',\n PES_PRIVATE_DATA_DESCRIPTOR: 'pes_private_data_descriptor',\n PES_PRIVATE_DATA_ARRIVED: 'pes_private_data_arrived',\n STATISTICS_INFO: 'statistics_info'\n};\n\nexport default PlayerEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport work from 'webworkify-webpack';\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport TransmuxingWorker from './transmuxing-worker.js';\nimport MediaInfo from './media-info.js';\n\nclass Transmuxer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'Transmuxer';\n this._emitter = new EventEmitter();\n\n if (config.enableWorker && typeof (Worker) !== 'undefined') {\n try {\n this._worker = work(require.resolve('./transmuxing-worker'));\n this._workerDestroying = false;\n this._worker.addEventListener('message', this._onWorkerMessage.bind(this));\n this._worker.postMessage({cmd: 'init', param: [mediaDataSource, config]});\n this.e = {\n onLoggingConfigChanged: this._onLoggingConfigChanged.bind(this)\n };\n LoggingControl.registerListener(this.e.onLoggingConfigChanged);\n this._worker.postMessage({cmd: 'logging_config', param: LoggingControl.getConfig()});\n } catch (error) {\n Log.e(this.TAG, 'Error while initialize transmuxing worker, fallback to inline transmuxing');\n this._worker = null;\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n } else {\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n\n if (this._controller) {\n let ctl = this._controller;\n ctl.on(TransmuxingEvents.IO_ERROR, this._onIOError.bind(this));\n ctl.on(TransmuxingEvents.DEMUX_ERROR, this._onDemuxError.bind(this));\n ctl.on(TransmuxingEvents.INIT_SEGMENT, this._onInitSegment.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_SEGMENT, this._onMediaSegment.bind(this));\n ctl.on(TransmuxingEvents.LOADING_COMPLETE, this._onLoadingComplete.bind(this));\n ctl.on(TransmuxingEvents.RECOVERED_EARLY_EOF, this._onRecoveredEarlyEof.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_INFO, this._onMediaInfo.bind(this));\n ctl.on(TransmuxingEvents.METADATA_ARRIVED, this._onMetaDataArrived.bind(this));\n ctl.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, this._onScriptDataArrived.bind(this));\n ctl.on(TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED, this._onTimedID3MetadataArrived.bind(this));\n ctl.on(TransmuxingEvents.SMPTE2038_METADATA_ARRIVED, this._onSMPTE2038MetadataArrived.bind(this));\n ctl.on(TransmuxingEvents.SCTE35_METADATA_ARRIVED, this._onSCTE35MetadataArrived.bind(this));\n ctl.on(TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR, this._onPESPrivateDataDescriptor.bind(this));\n ctl.on(TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED, this._onPESPrivateDataArrived.bind(this));\n ctl.on(TransmuxingEvents.STATISTICS_INFO, this._onStatisticsInfo.bind(this));\n ctl.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, this._onRecommendSeekpoint.bind(this));\n }\n }\n\n destroy() {\n if (this._worker) {\n if (!this._workerDestroying) {\n this._workerDestroying = true;\n this._worker.postMessage({cmd: 'destroy'});\n LoggingControl.removeListener(this.e.onLoggingConfigChanged);\n this.e = null;\n }\n } else {\n this._controller.destroy();\n this._controller = null;\n }\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n hasWorker() {\n return this._worker != null;\n }\n\n open() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'start'});\n } else {\n this._controller.start();\n }\n }\n\n close() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'stop'});\n } else {\n this._controller.stop();\n }\n }\n\n seek(milliseconds) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'seek', param: milliseconds});\n } else {\n this._controller.seek(milliseconds);\n }\n }\n\n pause() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'pause'});\n } else {\n this._controller.pause();\n }\n }\n\n resume() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'resume'});\n } else {\n this._controller.resume();\n }\n }\n\n _onInitSegment(type, initSegment) {\n // do async invoke\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n });\n }\n\n _onMediaSegment(type, mediaSegment) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n });\n }\n\n _onLoadingComplete() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n });\n }\n\n _onRecoveredEarlyEof() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n });\n }\n\n _onMediaInfo(mediaInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, mediaInfo);\n });\n }\n\n _onMetaDataArrived(metadata) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);\n });\n }\n\n _onScriptDataArrived(data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);\n });\n }\n\n _onTimedID3MetadataArrived (data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED, data);\n })\n }\n\n _onSMPTE2038MetadataArrived (data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.SMPTE2038_METADATA_ARRIVED, data);\n })\n }\n\n _onSCTE35MetadataArrived (data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.SCTE35_METADATA_ARRIVED, data);\n })\n }\n\n _onPESPrivateDataDescriptor(data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR, data);\n });\n }\n\n _onPESPrivateDataArrived(data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED, data);\n });\n }\n\n _onStatisticsInfo(statisticsInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, statisticsInfo);\n });\n }\n\n _onIOError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n });\n }\n\n _onDemuxError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n });\n }\n\n _onRecommendSeekpoint(milliseconds) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, milliseconds);\n });\n }\n\n _onLoggingConfigChanged(config) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'logging_config', param: config});\n }\n }\n\n _onWorkerMessage(e) {\n let message = e.data;\n let data = message.data;\n\n if (message.msg === 'destroyed' || this._workerDestroying) {\n this._workerDestroying = false;\n this._worker.terminate();\n this._worker = null;\n return;\n }\n\n switch (message.msg) {\n case TransmuxingEvents.INIT_SEGMENT:\n case TransmuxingEvents.MEDIA_SEGMENT:\n this._emitter.emit(message.msg, data.type, data.data);\n break;\n case TransmuxingEvents.LOADING_COMPLETE:\n case TransmuxingEvents.RECOVERED_EARLY_EOF:\n this._emitter.emit(message.msg);\n break;\n case TransmuxingEvents.MEDIA_INFO:\n Object.setPrototypeOf(data, MediaInfo.prototype);\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.METADATA_ARRIVED:\n case TransmuxingEvents.SCRIPTDATA_ARRIVED:\n case TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED:\n case TransmuxingEvents.SMPTE2038_METADATA_ARRIVED:\n case TransmuxingEvents.SCTE35_METADATA_ARRIVED:\n case TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR:\n case TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED:\n case TransmuxingEvents.STATISTICS_INFO:\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.IO_ERROR:\n case TransmuxingEvents.DEMUX_ERROR:\n this._emitter.emit(message.msg, data.type, data.info);\n break;\n case TransmuxingEvents.RECOMMEND_SEEKPOINT:\n this._emitter.emit(message.msg, data);\n break;\n case 'logcat_callback':\n Log.emitter.emit('log', data.type, data.logcat);\n break;\n default:\n break;\n }\n }\n\n}\n\nexport default Transmuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst MSEEvents = {\n ERROR: 'error',\n SOURCE_OPEN: 'source_open',\n UPDATE_END: 'update_end',\n BUFFER_FULL: 'buffer_full'\n};\n\nexport default MSEEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MSEEvents from './mse-events.js';\nimport {SampleInfo, IDRSampleList} from './media-segment-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\n// Media Source Extensions controller\nclass MSEController {\n\n constructor(config) {\n this.TAG = 'MSEController';\n\n this._config = config;\n this._emitter = new EventEmitter();\n\n if (this._config.isLive && this._config.autoCleanupSourceBuffer == undefined) {\n // For live stream, do auto cleanup by default\n this._config.autoCleanupSourceBuffer = true;\n }\n\n this.e = {\n onSourceOpen: this._onSourceOpen.bind(this),\n onSourceEnded: this._onSourceEnded.bind(this),\n onSourceClose: this._onSourceClose.bind(this),\n onSourceBufferError: this._onSourceBufferError.bind(this),\n onSourceBufferUpdateEnd: this._onSourceBufferUpdateEnd.bind(this)\n };\n\n this._mediaSource = null;\n this._mediaSourceObjectURL = null;\n this._mediaElement = null;\n\n this._isBufferFull = false;\n this._hasPendingEos = false;\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n\n this._pendingSourceBufferInit = [];\n this._mimeTypes = {\n video: null,\n audio: null\n };\n this._sourceBuffers = {\n video: null,\n audio: null\n };\n this._lastInitSegments = {\n video: null,\n audio: null\n };\n this._pendingSegments = {\n video: [],\n audio: []\n };\n this._pendingRemoveRanges = {\n video: [],\n audio: []\n };\n this._idrList = new IDRSampleList();\n }\n\n destroy() {\n if (this._mediaElement || this._mediaSource) {\n this.detachMediaElement();\n }\n this.e = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n if (this._mediaSource) {\n throw new IllegalStateException('MediaSource has been attached to an HTMLMediaElement!');\n }\n let ms = this._mediaSource = new window.MediaSource();\n ms.addEventListener('sourceopen', this.e.onSourceOpen);\n ms.addEventListener('sourceended', this.e.onSourceEnded);\n ms.addEventListener('sourceclose', this.e.onSourceClose);\n\n this._mediaElement = mediaElement;\n this._mediaSourceObjectURL = window.URL.createObjectURL(this._mediaSource);\n mediaElement.src = this._mediaSourceObjectURL;\n }\n\n detachMediaElement() {\n if (this._mediaSource) {\n let ms = this._mediaSource;\n for (let type in this._sourceBuffers) {\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n this._pendingSegments[type] = null;\n this._pendingRemoveRanges[type] = null;\n this._lastInitSegments[type] = null;\n\n // remove all sourcebuffers\n let sb = this._sourceBuffers[type];\n if (sb) {\n if (ms.readyState !== 'closed') {\n // ms edge can throw an error: Unexpected call to method or property access\n try {\n ms.removeSourceBuffer(sb);\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n sb.removeEventListener('error', this.e.onSourceBufferError);\n sb.removeEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n }\n this._mimeTypes[type] = null;\n this._sourceBuffers[type] = null;\n }\n }\n if (ms.readyState === 'open') {\n try {\n ms.endOfStream();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n ms.removeEventListener('sourceopen', this.e.onSourceOpen);\n ms.removeEventListener('sourceended', this.e.onSourceEnded);\n ms.removeEventListener('sourceclose', this.e.onSourceClose);\n this._pendingSourceBufferInit = [];\n this._isBufferFull = false;\n this._idrList.clear();\n this._mediaSource = null;\n }\n\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement = null;\n }\n if (this._mediaSourceObjectURL) {\n window.URL.revokeObjectURL(this._mediaSourceObjectURL);\n this._mediaSourceObjectURL = null;\n }\n }\n\n appendInitSegment(initSegment, deferred) {\n if (!this._mediaSource || this._mediaSource.readyState !== 'open') {\n // sourcebuffer creation requires mediaSource.readyState === 'open'\n // so we defer the sourcebuffer creation, until sourceopen event triggered\n this._pendingSourceBufferInit.push(initSegment);\n // make sure that this InitSegment is in the front of pending segments queue\n this._pendingSegments[initSegment.type].push(initSegment);\n return;\n }\n\n let is = initSegment;\n let mimeType = `${is.container}`;\n if (is.codec && is.codec.length > 0) {\n mimeType += `;codecs=${is.codec}`;\n }\n\n let firstInitSegment = false;\n\n Log.v(this.TAG, 'Received Initialization Segment, mimeType: ' + mimeType);\n this._lastInitSegments[is.type] = is;\n\n if (mimeType !== this._mimeTypes[is.type]) {\n if (!this._mimeTypes[is.type]) { // empty, first chance create sourcebuffer\n firstInitSegment = true;\n try {\n let sb = this._sourceBuffers[is.type] = this._mediaSource.addSourceBuffer(mimeType);\n sb.addEventListener('error', this.e.onSourceBufferError);\n sb.addEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n } catch (error) {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n return;\n }\n } else {\n Log.v(this.TAG, `Notice: ${is.type} mimeType changed, origin: ${this._mimeTypes[is.type]}, target: ${mimeType}`);\n }\n this._mimeTypes[is.type] = mimeType;\n }\n\n if (!deferred) {\n // deferred means this InitSegment has been pushed to pendingSegments queue\n this._pendingSegments[is.type].push(is);\n }\n if (!firstInitSegment) { // append immediately only if init segment in subsequence\n if (this._sourceBuffers[is.type] && !this._sourceBuffers[is.type].updating) {\n this._doAppendSegments();\n }\n }\n if (Browser.safari && is.container === 'audio/mpeg' && is.mediaDuration > 0) {\n // 'audio/mpeg' track under Safari may cause MediaElement's duration to be NaN\n // Manually correct MediaSource.duration to make progress bar seekable, and report right duration\n this._requireSetMediaDuration = true;\n this._pendingMediaDuration = is.mediaDuration / 1000; // in seconds\n this._updateMediaSourceDuration();\n }\n }\n\n appendMediaSegment(mediaSegment) {\n let ms = mediaSegment;\n this._pendingSegments[ms.type].push(ms);\n\n if (this._config.autoCleanupSourceBuffer && this._needCleanupSourceBuffer()) {\n this._doCleanupSourceBuffer();\n }\n\n let sb = this._sourceBuffers[ms.type];\n if (sb && !sb.updating && !this._hasPendingRemoveRanges()) {\n this._doAppendSegments();\n }\n }\n\n seek(seconds) {\n // remove all appended buffers\n for (let type in this._sourceBuffers) {\n if (!this._sourceBuffers[type]) {\n continue;\n }\n\n // abort current buffer append algorithm\n let sb = this._sourceBuffers[type];\n if (this._mediaSource.readyState === 'open') {\n try {\n // If range removal algorithm is running, InvalidStateError will be throwed\n // Ignore it.\n sb.abort();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n\n // IDRList should be clear\n this._idrList.clear();\n\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n\n if (this._mediaSource.readyState === 'closed') {\n // Parent MediaSource object has been detached from HTMLMediaElement\n continue;\n }\n\n // record ranges to be remove from SourceBuffer\n for (let i = 0; i < sb.buffered.length; i++) {\n let start = sb.buffered.start(i);\n let end = sb.buffered.end(i);\n this._pendingRemoveRanges[type].push({start, end});\n }\n\n // if sb is not updating, let's remove ranges now!\n if (!sb.updating) {\n this._doRemoveRanges();\n }\n\n // Safari 10 may get InvalidStateError in the later appendBuffer() after SourceBuffer.remove() call\n // Internal parser's state may be invalid at this time. Re-append last InitSegment to workaround.\n // Related issue: https://bugs.webkit.org/show_bug.cgi?id=159230\n if (Browser.safari) {\n let lastInitSegment = this._lastInitSegments[type];\n if (lastInitSegment) {\n this._pendingSegments[type].push(lastInitSegment);\n if (!sb.updating) {\n this._doAppendSegments();\n }\n }\n }\n }\n }\n\n endOfStream() {\n let ms = this._mediaSource;\n let sb = this._sourceBuffers;\n if (!ms || ms.readyState !== 'open') {\n if (ms && ms.readyState === 'closed' && this._hasPendingSegments()) {\n // If MediaSource hasn't turned into open state, and there're pending segments\n // Mark pending endOfStream, defer call until all pending segments appended complete\n this._hasPendingEos = true;\n }\n return;\n }\n if (sb.video && sb.video.updating || sb.audio && sb.audio.updating) {\n // If any sourcebuffer is updating, defer endOfStream operation\n // See _onSourceBufferUpdateEnd()\n this._hasPendingEos = true;\n } else {\n this._hasPendingEos = false;\n // Notify media data loading complete\n // This is helpful for correcting total duration to match last media segment\n // Otherwise MediaElement's ended event may not be triggered\n ms.endOfStream();\n }\n }\n\n getNearestKeyframe(dts) {\n return this._idrList.getLastSyncPointBeforeDts(dts);\n }\n\n _needCleanupSourceBuffer() {\n if (!this._config.autoCleanupSourceBuffer) {\n return false;\n }\n\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n if (buffered.length >= 1) {\n if (currentTime - buffered.start(0) >= this._config.autoCleanupMaxBackwardDuration) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n _doCleanupSourceBuffer() {\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n let doRemove = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n\n if (start <= currentTime && currentTime < end + 3) { // padding 3 seconds\n if (currentTime - start >= this._config.autoCleanupMaxBackwardDuration) {\n doRemove = true;\n let removeEnd = currentTime - this._config.autoCleanupMinBackwardDuration;\n this._pendingRemoveRanges[type].push({start: start, end: removeEnd});\n }\n } else if (end < currentTime) {\n doRemove = true;\n this._pendingRemoveRanges[type].push({start: start, end: end});\n }\n }\n\n if (doRemove && !sb.updating) {\n this._doRemoveRanges();\n }\n }\n }\n }\n\n _updateMediaSourceDuration() {\n let sb = this._sourceBuffers;\n if (this._mediaElement.readyState === 0 || this._mediaSource.readyState !== 'open') {\n return;\n }\n if ((sb.video && sb.video.updating) || (sb.audio && sb.audio.updating)) {\n return;\n }\n\n let current = this._mediaSource.duration;\n let target = this._pendingMediaDuration;\n\n if (target > 0 && (isNaN(current) || target > current)) {\n Log.v(this.TAG, `Update MediaSource duration from ${current} to ${target}`);\n this._mediaSource.duration = target;\n }\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n }\n\n _doRemoveRanges() {\n for (let type in this._pendingRemoveRanges) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n let sb = this._sourceBuffers[type];\n let ranges = this._pendingRemoveRanges[type];\n while (ranges.length && !sb.updating) {\n let range = ranges.shift();\n sb.remove(range.start, range.end);\n }\n }\n }\n\n _doAppendSegments() {\n let pendingSegments = this._pendingSegments;\n\n for (let type in pendingSegments) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n\n if (pendingSegments[type].length > 0) {\n let segment = pendingSegments[type].shift();\n\n if (segment.timestampOffset) {\n // For MPEG audio stream in MSE, if unbuffered-seeking occurred\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n let currentOffset = this._sourceBuffers[type].timestampOffset;\n let targetOffset = segment.timestampOffset / 1000; // in seconds\n\n let delta = Math.abs(currentOffset - targetOffset);\n if (delta > 0.1) { // If time delta > 100ms\n Log.v(this.TAG, `Update MPEG audio timestampOffset from ${currentOffset} to ${targetOffset}`);\n this._sourceBuffers[type].timestampOffset = targetOffset;\n }\n delete segment.timestampOffset;\n }\n\n if (!segment.data || segment.data.byteLength === 0) {\n // Ignore empty buffer\n continue;\n }\n\n try {\n this._sourceBuffers[type].appendBuffer(segment.data);\n this._isBufferFull = false;\n if (type === 'video' && segment.hasOwnProperty('info')) {\n this._idrList.appendArray(segment.info.syncPoints);\n }\n } catch (error) {\n this._pendingSegments[type].unshift(segment);\n if (error.code === 22) { // QuotaExceededError\n /* Notice that FireFox may not throw QuotaExceededError if SourceBuffer is full\n * Currently we can only do lazy-load to avoid SourceBuffer become scattered.\n * SourceBuffer eviction policy may be changed in future version of FireFox.\n *\n * Related issues:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1279885\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1280023\n */\n\n // report buffer full, abort network IO\n if (!this._isBufferFull) {\n this._emitter.emit(MSEEvents.BUFFER_FULL);\n }\n this._isBufferFull = true;\n } else {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n }\n }\n }\n }\n }\n\n _onSourceOpen() {\n Log.v(this.TAG, 'MediaSource onSourceOpen');\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n // deferred sourcebuffer creation / initialization\n if (this._pendingSourceBufferInit.length > 0) {\n let pendings = this._pendingSourceBufferInit;\n while (pendings.length) {\n let segment = pendings.shift();\n this.appendInitSegment(segment, true);\n }\n }\n // there may be some pending media segments, append them\n if (this._hasPendingSegments()) {\n this._doAppendSegments();\n }\n this._emitter.emit(MSEEvents.SOURCE_OPEN);\n }\n\n _onSourceEnded() {\n // fired on endOfStream\n Log.v(this.TAG, 'MediaSource onSourceEnded');\n }\n\n _onSourceClose() {\n // fired on detaching from media element\n Log.v(this.TAG, 'MediaSource onSourceClose');\n if (this._mediaSource && this.e != null) {\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n this._mediaSource.removeEventListener('sourceended', this.e.onSourceEnded);\n this._mediaSource.removeEventListener('sourceclose', this.e.onSourceClose);\n }\n }\n\n _hasPendingSegments() {\n let ps = this._pendingSegments;\n return ps.video.length > 0 || ps.audio.length > 0;\n }\n\n _hasPendingRemoveRanges() {\n let prr = this._pendingRemoveRanges;\n return prr.video.length > 0 || prr.audio.length > 0;\n }\n\n _onSourceBufferUpdateEnd() {\n if (this._requireSetMediaDuration) {\n this._updateMediaSourceDuration();\n } else if (this._hasPendingRemoveRanges()) {\n this._doRemoveRanges();\n } else if (this._hasPendingSegments()) {\n this._doAppendSegments();\n } else if (this._hasPendingEos) {\n this.endOfStream();\n }\n this._emitter.emit(MSEEvents.UPDATE_END);\n }\n\n _onSourceBufferError(e) {\n Log.e(this.TAG, `SourceBuffer Error: ${e}`);\n // this error might not always be fatal, just ignore it\n }\n\n}\n\nexport default MSEController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {LoaderErrors} from '../io/loader.js';\nimport DemuxErrors from '../demux/demux-errors.js';\n\nexport const ErrorTypes = {\n NETWORK_ERROR: 'NetworkError',\n MEDIA_ERROR: 'MediaError',\n OTHER_ERROR: 'OtherError'\n};\n\nexport const ErrorDetails = {\n NETWORK_EXCEPTION: LoaderErrors.EXCEPTION,\n NETWORK_STATUS_CODE_INVALID: LoaderErrors.HTTP_STATUS_CODE_INVALID,\n NETWORK_TIMEOUT: LoaderErrors.CONNECTING_TIMEOUT,\n NETWORK_UNRECOVERABLE_EARLY_EOF: LoaderErrors.UNRECOVERABLE_EARLY_EOF,\n\n MEDIA_MSE_ERROR: 'MediaMSEError',\n\n MEDIA_FORMAT_ERROR: DemuxErrors.FORMAT_ERROR,\n MEDIA_FORMAT_UNSUPPORTED: DemuxErrors.FORMAT_UNSUPPORTED,\n MEDIA_CODEC_UNSUPPORTED: DemuxErrors.CODEC_UNSUPPORTED\n};","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport PlayerEvents from './player-events.js';\nimport Transmuxer from '../core/transmuxer.js';\nimport TransmuxingEvents from '../core/transmuxing-events.js';\nimport MSEController from '../core/mse-controller.js';\nimport MSEEvents from '../core/mse-events.js';\nimport {ErrorTypes, ErrorDetails} from './player-errors.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\nclass MSEPlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'MSEPlayer';\n this._type = 'MSEPlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n let typeLowerCase = mediaDataSource.type.toLowerCase();\n if (typeLowerCase !== 'mse'\n && typeLowerCase !== 'mpegts'\n && typeLowerCase !== 'm2ts'\n && typeLowerCase !== 'flv') {\n throw new InvalidArgumentException('MSEPlayer requires an mpegts/m2ts/flv MediaDataSource input!');\n }\n\n if (mediaDataSource.isLive === true) {\n this._config.isLive = true;\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this),\n onvSeeking: this._onvSeeking.bind(this),\n onvCanPlay: this._onvCanPlay.bind(this),\n onvStalled: this._onvStalled.bind(this),\n onvProgress: this._onvProgress.bind(this)\n };\n\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n\n this._pendingSeekTime = null; // in seconds\n this._requestSetTime = false;\n this._seekpointRecord = null;\n this._progressChecker = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n this._msectl = null;\n this._transmuxer = null;\n\n this._mseSourceOpened = false;\n this._hasPendingLoad = false;\n this._receivedCanPlay = false;\n\n this._mediaInfo = null;\n this._statisticsInfo = null;\n\n let chromeNeedIDRFix = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661)));\n this._alwaysSeekKeyframe = (chromeNeedIDRFix || Browser.msedge || Browser.msie) ? true : false;\n\n if (this._alwaysSeekKeyframe) {\n this._config.accurateSeek = false;\n }\n }\n\n destroy() {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n if (this._transmuxer) {\n this.unload();\n }\n if (this._mediaElement) {\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._statisticsInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n mediaElement.addEventListener('seeking', this.e.onvSeeking);\n mediaElement.addEventListener('canplay', this.e.onvCanPlay);\n mediaElement.addEventListener('stalled', this.e.onvStalled);\n mediaElement.addEventListener('progress', this.e.onvProgress);\n\n this._msectl = new MSEController(this._config);\n\n this._msectl.on(MSEEvents.UPDATE_END, this._onmseUpdateEnd.bind(this));\n this._msectl.on(MSEEvents.BUFFER_FULL, this._onmseBufferFull.bind(this));\n this._msectl.on(MSEEvents.SOURCE_OPEN, () => {\n this._mseSourceOpened = true;\n if (this._hasPendingLoad) {\n this._hasPendingLoad = false;\n this.load();\n }\n });\n this._msectl.on(MSEEvents.ERROR, (info) => {\n this._emitter.emit(PlayerEvents.ERROR,\n ErrorTypes.MEDIA_ERROR,\n ErrorDetails.MEDIA_MSE_ERROR,\n info\n );\n });\n\n this._msectl.attachMediaElement(mediaElement);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // We can defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._msectl.detachMediaElement();\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement.removeEventListener('seeking', this.e.onvSeeking);\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n this._mediaElement.removeEventListener('stalled', this.e.onvStalled);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n this._mediaElement = null;\n }\n if (this._msectl) {\n this._msectl.destroy();\n this._msectl = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n if (this._transmuxer) {\n throw new IllegalStateException('MSEPlayer.load() has been called, please call unload() first!');\n }\n if (this._hasPendingLoad) {\n return;\n }\n\n if (this._config.deferLoadAfterSourceOpen && this._mseSourceOpened === false) {\n this._hasPendingLoad = true;\n return;\n }\n\n if (this._mediaElement.readyState > 0) {\n this._requestSetTime = true;\n // IE11 may throw InvalidStateError if readyState === 0\n this._mediaElement.currentTime = 0;\n }\n\n this._transmuxer = new Transmuxer(this._mediaDataSource, this._config);\n\n this._transmuxer.on(TransmuxingEvents.INIT_SEGMENT, (type, is) => {\n this._msectl.appendInitSegment(is);\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_SEGMENT, (type, ms) => {\n this._msectl.appendMediaSegment(ms);\n\n // lazyLoad check\n if (this._config.lazyLoad && !this._config.isLive) {\n let currentTime = this._mediaElement.currentTime;\n if (ms.info.endDts >= (currentTime + this._config.lazyLoadMaxDuration) * 1000) {\n if (this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n }\n });\n this._transmuxer.on(TransmuxingEvents.LOADING_COMPLETE, () => {\n this._msectl.endOfStream();\n this._emitter.emit(PlayerEvents.LOADING_COMPLETE);\n });\n this._transmuxer.on(TransmuxingEvents.RECOVERED_EARLY_EOF, () => {\n this._emitter.emit(PlayerEvents.RECOVERED_EARLY_EOF);\n });\n this._transmuxer.on(TransmuxingEvents.IO_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.NETWORK_ERROR, detail, info);\n });\n this._transmuxer.on(TransmuxingEvents.DEMUX_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.MEDIA_ERROR, detail, {code: -1, msg: info});\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_INFO, (mediaInfo) => {\n this._mediaInfo = mediaInfo;\n this._emitter.emit(PlayerEvents.MEDIA_INFO, Object.assign({}, mediaInfo));\n });\n this._transmuxer.on(TransmuxingEvents.METADATA_ARRIVED, (metadata) => {\n this._emitter.emit(PlayerEvents.METADATA_ARRIVED, metadata);\n });\n this._transmuxer.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, (data) => {\n this._emitter.emit(PlayerEvents.SCRIPTDATA_ARRIVED, data);\n });\n this._transmuxer.on(TransmuxingEvents.TIMED_ID3_METADATA_ARRIVED, (timed_id3_metadata) => {\n this._emitter.emit(PlayerEvents.TIMED_ID3_METADATA_ARRIVED, timed_id3_metadata);\n });\n this._transmuxer.on(TransmuxingEvents.SMPTE2038_METADATA_ARRIVED, (smpte2038_metadata) => {\n this._emitter.emit(PlayerEvents.SMPTE2038_METADATA_ARRIVED, smpte2038_metadata);\n });\n this._transmuxer.on(TransmuxingEvents.SCTE35_METADATA_ARRIVED, (scte35_metadata) => {\n this._emitter.emit(PlayerEvents.SCTE35_METADATA_ARRIVED, scte35_metadata);\n });\n this._transmuxer.on(TransmuxingEvents.PES_PRIVATE_DATA_DESCRIPTOR, (descriptor) => {\n this._emitter.emit(PlayerEvents.PES_PRIVATE_DATA_DESCRIPTOR, descriptor);\n });\n this._transmuxer.on(TransmuxingEvents.PES_PRIVATE_DATA_ARRIVED, (private_data) => {\n this._emitter.emit(PlayerEvents.PES_PRIVATE_DATA_ARRIVED, private_data);\n });\n this._transmuxer.on(TransmuxingEvents.STATISTICS_INFO, (statInfo) => {\n this._statisticsInfo = this._fillStatisticsInfo(statInfo);\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, Object.assign({}, this._statisticsInfo));\n });\n this._transmuxer.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, (milliseconds) => {\n if (this._mediaElement && !this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = milliseconds / 1000;\n }\n });\n\n this._transmuxer.open();\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.pause();\n }\n if (this._msectl) {\n this._msectl.seek(0);\n }\n if (this._transmuxer) {\n this._transmuxer.close();\n this._transmuxer.destroy();\n this._transmuxer = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._internalSeek(seconds);\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n return Object.assign({}, this._mediaInfo);\n }\n\n get statisticsInfo() {\n if (this._statisticsInfo == null) {\n this._statisticsInfo = {};\n }\n this._statisticsInfo = this._fillStatisticsInfo(this._statisticsInfo);\n return Object.assign({}, this._statisticsInfo);\n }\n\n _fillStatisticsInfo(statInfo) {\n statInfo.playerType = this._type;\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return statInfo;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n statInfo.decodedFrames = decoded;\n statInfo.droppedFrames = dropped;\n }\n\n return statInfo;\n }\n\n _onmseUpdateEnd() {\n let buffered = this._mediaElement.buffered;\n let currentTime = this._mediaElement.currentTime;\n\n if (this._config.isLive\n && this._config.liveBufferLatencyChasing\n && buffered.length > 0\n && !this._mediaElement.paused) {\n let buffered_end = buffered.end(buffered.length - 1);\n if (buffered_end > this._config.liveBufferLatencyMaxLatency) {\n // Ensure there's enough buffered data\n if (buffered_end - currentTime > this._config.liveBufferLatencyMaxLatency) {\n // if remained data duration has larger than config.liveBufferLatencyMaxLatency\n let target_time = buffered_end - this._config.liveBufferLatencyMinRemain;\n this.currentTime = target_time;\n }\n }\n }\n\n if (!this._config.lazyLoad || this._config.isLive) {\n return;\n }\n\n let currentRangeStart = 0;\n let currentRangeEnd = 0;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n if (start <= currentTime && currentTime < end) {\n currentRangeStart = start;\n currentRangeEnd = end;\n break;\n }\n }\n\n if (currentRangeEnd >= currentTime + this._config.lazyLoadMaxDuration && this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n\n _onmseBufferFull() {\n Log.v(this.TAG, 'MSE SourceBuffer is full, suspend transmuxing task');\n if (this._progressChecker == null) {\n this._suspendTransmuxer();\n }\n }\n\n _suspendTransmuxer() {\n if (this._transmuxer) {\n this._transmuxer.pause();\n\n if (this._progressChecker == null) {\n this._progressChecker = window.setInterval(this._checkProgressAndResume.bind(this), 1000);\n }\n }\n }\n\n _checkProgressAndResume() {\n let currentTime = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n let needResume = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (currentTime >= from && currentTime < to) {\n if (currentTime >= to - this._config.lazyLoadRecoverDuration) {\n needResume = true;\n }\n break;\n }\n }\n\n if (needResume) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n if (needResume) {\n Log.v(this.TAG, 'Continue loading from paused position');\n this._transmuxer.resume();\n }\n }\n }\n\n _isTimepointBuffered(seconds) {\n let buffered = this._mediaElement.buffered;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (seconds >= from && seconds < to) {\n return true;\n }\n }\n return false;\n }\n\n _internalSeek(seconds) {\n let directSeek = this._isTimepointBuffered(seconds);\n\n let directSeekBegin = false;\n let directSeekBeginTime = 0;\n\n if (seconds < 1.0 && this._mediaElement.buffered.length > 0) {\n let videoBeginTime = this._mediaElement.buffered.start(0);\n if ((videoBeginTime < 1.0 && seconds < videoBeginTime) || Browser.safari) {\n directSeekBegin = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n directSeekBeginTime = Browser.safari ? 0.1 : videoBeginTime;\n }\n }\n\n if (directSeekBegin) { // seek to video begin, set currentTime directly if beginPTS buffered\n this._requestSetTime = true;\n this._mediaElement.currentTime = directSeekBeginTime;\n } else if (directSeek) { // buffered position\n if (!this._alwaysSeekKeyframe) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n } else {\n let idr = this._msectl.getNearestKeyframe(Math.floor(seconds * 1000));\n this._requestSetTime = true;\n if (idr != null) {\n this._mediaElement.currentTime = idr.dts / 1000;\n } else {\n this._mediaElement.currentTime = seconds;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n } else {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n this._msectl.seek(seconds);\n this._transmuxer.seek(Math.floor(seconds * 1000)); // in milliseconds\n // no need to set mediaElement.currentTime if non-accurateSeek,\n // just wait for the recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n }\n }\n }\n\n _checkAndApplyUnbufferedSeekpoint() {\n if (this._seekpointRecord) {\n if (this._seekpointRecord.recordTime <= this._now() - 100) {\n let target = this._mediaElement.currentTime;\n this._seekpointRecord = null;\n if (!this._isTimepointBuffered(target)) {\n if (this._progressChecker != null) {\n window.clearTimeout(this._progressChecker);\n this._progressChecker = null;\n }\n // .currentTime is consists with .buffered timestamp\n // Chrome/Edge use DTS, while FireFox/Safari use PTS\n this._msectl.seek(target);\n this._transmuxer.seek(Math.floor(target * 1000));\n // set currentTime if accurateSeek, or wait for recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = target;\n }\n }\n } else {\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n }\n }\n\n _checkAndResumeStuckPlayback(stalled) {\n let media = this._mediaElement;\n if (stalled || !this._receivedCanPlay || media.readyState < 2) { // HAVE_CURRENT_DATA\n let buffered = media.buffered;\n if (buffered.length > 0 && media.currentTime < buffered.start(0)) {\n Log.w(this.TAG, `Playback seems stuck at ${media.currentTime}, seek to ${buffered.start(0)}`);\n this._requestSetTime = true;\n this._mediaElement.currentTime = buffered.start(0);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n } else {\n // Playback didn't stuck, remove progress event listener\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n }\n\n _onvSeeking(e) { // handle seeking request from browser's progress bar\n let target = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n if (this._requestSetTime) {\n this._requestSetTime = false;\n return;\n }\n\n if (target < 1.0 && buffered.length > 0) {\n // seek to video begin, set currentTime directly if beginPTS buffered\n let videoBeginTime = buffered.start(0);\n if ((videoBeginTime < 1.0 && target < videoBeginTime) || Browser.safari) {\n this._requestSetTime = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n this._mediaElement.currentTime = Browser.safari ? 0.1 : videoBeginTime;\n return;\n }\n }\n\n if (this._isTimepointBuffered(target)) {\n if (this._alwaysSeekKeyframe) {\n let idr = this._msectl.getNearestKeyframe(Math.floor(target * 1000));\n if (idr != null) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = idr.dts / 1000;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n return;\n }\n\n this._seekpointRecord = {\n seekPoint: target,\n recordTime: this._now()\n };\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n\n _onvCanPlay(e) {\n this._receivedCanPlay = true;\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n }\n\n _onvStalled(e) {\n this._checkAndResumeStuckPlayback(true);\n }\n\n _onvProgress(e) {\n this._checkAndResumeStuckPlayback();\n }\n\n}\n\nexport default MSEPlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport PlayerEvents from './player-events.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\n// Player wrapper for browser's native player (HTMLVideoElement) without MediaSource src. \nclass NativePlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'NativePlayer';\n this._type = 'NativePlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n let typeLowerCase = mediaDataSource.type.toLowerCase();\n\n if (typeLowerCase === 'mse'\n || typeLowerCase === 'mpegts'\n || typeLowerCase === 'm2ts'\n || typeLowerCase === 'flv') {\n throw new InvalidArgumentException('NativePlayer does\\'t support mse/mpegts/m2ts/flv MediaDataSource input!');\n }\n if (mediaDataSource.hasOwnProperty('segments')) {\n throw new InvalidArgumentException(`NativePlayer(${mediaDataSource.type}) doesn't support multipart playback!`);\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this)\n };\n\n this._pendingSeekTime = null;\n this._statisticsReporter = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n }\n\n destroy() {\n if (this._mediaElement) {\n this.unload();\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) { // HAVE_NOTHING\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // Defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement = null;\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n this._mediaElement.src = this._mediaDataSource.url;\n\n if (this._mediaElement.readyState > 0) {\n this._mediaElement.currentTime = 0;\n }\n\n this._mediaElement.preload = 'auto';\n this._mediaElement.load();\n this._statisticsReporter = window.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._mediaElement.currentTime = seconds;\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n let mediaPrefix = (this._mediaElement instanceof HTMLAudioElement) ? 'audio/' : 'video/';\n let info = {\n mimeType: mediaPrefix + this._mediaDataSource.type\n };\n if (this._mediaElement) {\n info.duration = Math.floor(this._mediaElement.duration * 1000);\n if (this._mediaElement instanceof HTMLVideoElement) {\n info.width = this._mediaElement.videoWidth;\n info.height = this._mediaElement.videoHeight;\n }\n }\n return info;\n }\n\n get statisticsInfo() {\n let info = {\n playerType: this._type,\n url: this._mediaDataSource.url\n };\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return info;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n info.decodedFrames = decoded;\n info.droppedFrames = dropped;\n }\n \n return info;\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n }\n\n _reportStatisticsInfo() {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n }\n\n}\n\nexport default NativePlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Polyfill from './utils/polyfill.js';\nimport Features from './core/features.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './io/loader.js';\nimport MSEPlayer from './player/mse-player.js';\nimport NativePlayer from './player/native-player.js';\nimport PlayerEvents from './player/player-events.js';\nimport {ErrorTypes, ErrorDetails} from './player/player-errors.js';\nimport LoggingControl from './utils/logging-control.js';\nimport {InvalidArgumentException} from './utils/exception.js';\n\n// here are all the interfaces\n\n// install polyfills\nPolyfill.install();\n\n\n// factory method\nfunction createPlayer(mediaDataSource, optionalConfig) {\n let mds = mediaDataSource;\n if (mds == null || typeof mds !== 'object') {\n throw new InvalidArgumentException('MediaDataSource must be an javascript object!');\n }\n\n if (!mds.hasOwnProperty('type')) {\n throw new InvalidArgumentException('MediaDataSource must has type field to indicate video file type!');\n }\n\n switch (mds.type) {\n case 'mse':\n case 'mpegts':\n case 'm2ts':\n case 'flv':\n return new MSEPlayer(mds, optionalConfig);\n default:\n return new NativePlayer(mds, optionalConfig);\n }\n}\n\n\n// feature detection\nfunction isSupported() {\n return Features.supportMSEH264Playback();\n}\n\nfunction getFeatureList() {\n return Features.getFeatureList();\n}\n\n\n// interfaces\nlet mpegts = {};\n\nmpegts.createPlayer = createPlayer;\nmpegts.isSupported = isSupported;\nmpegts.getFeatureList = getFeatureList;\n\nmpegts.BaseLoader = BaseLoader;\nmpegts.LoaderStatus = LoaderStatus;\nmpegts.LoaderErrors = LoaderErrors;\n\nmpegts.Events = PlayerEvents;\nmpegts.ErrorTypes = ErrorTypes;\nmpegts.ErrorDetails = ErrorDetails;\n\nmpegts.MSEPlayer = MSEPlayer;\nmpegts.NativePlayer = NativePlayer;\nmpegts.LoggingControl = LoggingControl;\n\nObject.defineProperty(mpegts, 'version', {\n enumerable: true,\n get: function () {\n // replaced by webpack.DefinePlugin\n return __VERSION__;\n }\n});\n\nexport default mpegts;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/trunk/research/players/srs_player.html b/trunk/research/players/srs_player.html index 7424bf6e54..bcf1850458 100755 --- a/trunk/research/players/srs_player.html +++ b/trunk/research/players/srs_player.html @@ -102,7 +102,7 @@ - + diff --git a/trunk/src/core/srs_core_version6.hpp b/trunk/src/core/srs_core_version6.hpp index f9df4209e9..5de6bf17f7 100644 --- a/trunk/src/core/srs_core_version6.hpp +++ b/trunk/src/core/srs_core_version6.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 -#define VERSION_REVISION 41 +#define VERSION_REVISION 42 #endif diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index 116c6a6ca9..727a9e7c44 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -153,8 +153,10 @@ bool SrsFlvVideo::keyframe(char* data, int size) if (size < 1) { return false; } - - char frame_type = data[0]; + + // See rtmp_specification_1.0.pdf + // See https://github.com/veovera/enhanced-rtmp + uint8_t frame_type = data[0] & 0x7f; frame_type = (frame_type >> 4) & 0x0F; return frame_type == SrsVideoAvcFrameTypeKeyFrame; @@ -173,14 +175,23 @@ bool SrsFlvVideo::sh(char* data, int size) if (size < 2) { return false; } - - char frame_type = data[0]; - frame_type = (frame_type >> 4) & 0x0F; - - char avc_packet_type = data[1]; - + + uint8_t frame_type = data[0]; + bool is_ext_header = frame_type & 0x80; + SrsVideoAvcFrameTrait avc_packet_type = SrsVideoAvcFrameTraitForbidden; + if (!is_ext_header) { + // See rtmp_specification_1.0.pdf + frame_type = (frame_type >> 4) & 0x0F; + avc_packet_type = (SrsVideoAvcFrameTrait)data[1]; + } else { + // See https://github.com/veovera/enhanced-rtmp + avc_packet_type = (SrsVideoAvcFrameTrait)(frame_type & 0x0f); + frame_type = (frame_type >> 4) & 0x07; + } + + // Note that SrsVideoHEVCFrameTraitPacketTypeSequenceStart is equal to SrsVideoAvcFrameTraitSequenceHeader return frame_type == SrsVideoAvcFrameTypeKeyFrame - && avc_packet_type == SrsVideoAvcFrameTraitSequenceHeader; + && avc_packet_type == SrsVideoAvcFrameTraitSequenceHeader; } bool SrsFlvVideo::h264(char* data, int size) @@ -204,8 +215,24 @@ bool SrsFlvVideo::hevc(char* data, int size) return false; } - char codec_id = data[0]; - codec_id = codec_id & 0x0F; + uint8_t frame_type = data[0]; + bool is_ext_header = frame_type & 0x80; + SrsVideoCodecId codec_id = SrsVideoCodecIdForbidden; + if (!is_ext_header) { + // See rtmp_specification_1.0.pdf + codec_id = (SrsVideoCodecId)(frame_type & 0x0F); + } else { + // See https://github.com/veovera/enhanced-rtmp + if (size < 5) { + return false; + } + + // Video FourCC + if (data[1] != 'h' || data[2] != 'v' || data[3] != 'c' || data[4] != '1') { + return false; + } + codec_id = SrsVideoCodecIdHEVC; + } return codec_id == SrsVideoCodecIdHEVC; } @@ -218,12 +245,34 @@ bool SrsFlvVideo::acceptable(char* data, int size) return false; } - char frame_type = data[0]; - SrsVideoCodecId codec_id = (SrsVideoCodecId)(uint8_t)(frame_type & 0x0f); - frame_type = (frame_type >> 4) & 0x0f; - - if (frame_type < 1 || frame_type > 5) { - return false; + uint8_t frame_type = data[0]; + bool is_ext_header = frame_type & 0x80; + SrsVideoCodecId codec_id = SrsVideoCodecIdForbidden; + if (!is_ext_header) { + // See rtmp_specification_1.0.pdf + codec_id = (SrsVideoCodecId)(frame_type & 0x0f); + frame_type = (frame_type >> 4) & 0x0f; + + if (frame_type < 1 || frame_type > 5) { + return false; + } + } else { + // See https://github.com/veovera/enhanced-rtmp + uint8_t packet_type = frame_type & 0x0f; + frame_type = (frame_type >> 4) & 0x07; + + if (packet_type > SrsVideoHEVCFrameTraitPacketTypeMPEG2TSSequenceStart || frame_type > SrsVideoAvcFrameTypeVideoInfoFrame) { + return false; + } + + if (size < 5) { + return false; + } + + if (data[1] != 'h' || data[2] != 'v' || data[3] != 'c' || data[4] != '1') { + return false; + } + codec_id = SrsVideoCodecIdHEVC; } if (codec_id != SrsVideoCodecIdAVC && codec_id != SrsVideoCodecIdAV1 && codec_id != SrsVideoCodecIdHEVC) { @@ -775,33 +824,7 @@ srs_error_t SrsFormat::on_video(int64_t timestamp, char* data, int size) SrsBuffer* buffer = new SrsBuffer(data, size); SrsAutoFree(SrsBuffer, buffer); - - // We already checked the size is positive and data is not NULL. - srs_assert(buffer->require(1)); - - // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 - int8_t frame_type = buffer->read_1bytes(); - SrsVideoCodecId codec_id = (SrsVideoCodecId)(frame_type & 0x0f); - // Check codec for H.264 and H.265. - bool codec_ok = (codec_id == SrsVideoCodecIdAVC); -#ifdef SRS_H265 - codec_ok = codec_ok ? true : (codec_id == SrsVideoCodecIdHEVC); -#endif - if (!codec_ok) return err; - - if (!vcodec) { - vcodec = new SrsVideoCodecConfig(); - } - if (!video) { - video = new SrsVideoFrame(); - } - - if ((err = video->initialize(vcodec)) != srs_success) { - return srs_error_wrap(err, "init video"); - } - - buffer->skip(-1 * buffer->pos()); return video_avc_demux(buffer, timestamp); } @@ -847,18 +870,55 @@ bool SrsFormat::is_avc_sequence_header() srs_error_t SrsFormat::video_avc_demux(SrsBuffer* stream, int64_t timestamp) { srs_error_t err = srs_success; - + + if (!stream->require(1)) { + return srs_error_new(ERROR_HLS_DECODE_ERROR, "video avc demux shall atleast 1bytes"); + } + + // Parse the frame type and the first bit indicates the ext header. + uint8_t frame_type = stream->read_1bytes(); + bool is_ext_header = frame_type & 0x80; + // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 - int8_t frame_type = stream->read_1bytes(); - SrsVideoCodecId codec_id = (SrsVideoCodecId)(frame_type & 0x0f); - frame_type = (frame_type >> 4) & 0x0f; - + SrsVideoCodecId codec_id = SrsVideoCodecIdForbidden; + SrsVideoAvcFrameTrait packet_type = SrsVideoAvcFrameTraitForbidden; + if (!is_ext_header) { + // See rtmp_specification_1.0.pdf + codec_id = (SrsVideoCodecId)(frame_type & 0x0f); + frame_type = (frame_type >> 4) & 0x0f; + } else { + // See https://github.com/veovera/enhanced-rtmp + packet_type = (SrsVideoAvcFrameTrait)(frame_type & 0x0f); + frame_type = (frame_type >> 4) & 0x07; + + if (!stream->require(4)) { + return srs_error_new(ERROR_HLS_DECODE_ERROR, "fourCC requires 4bytes, only %dbytes", stream->left()); + } + + uint32_t four_cc = stream->read_4bytes(); + if (four_cc == 0x68766331) { // 'hvc1'=0x68766331 + codec_id = SrsVideoCodecIdHEVC; + } + } + + if (!vcodec) { + vcodec = new SrsVideoCodecConfig(); + } + + if (!video) { + video = new SrsVideoFrame(); + } + + if ((err = video->initialize(vcodec)) != srs_success) { + return srs_error_wrap(err, "init video"); + } + video->frame_type = (SrsVideoAvcFrameType)frame_type; // ignore info frame without error, // @see https://github.com/ossrs/srs/issues/288#issuecomment-69863909 if (video->frame_type == SrsVideoAvcFrameTypeVideoInfoFrame) { - srs_warn("avc igone the info frame"); + srs_warn("avc ignore the info frame"); return err; } @@ -871,17 +931,29 @@ srs_error_t SrsFormat::video_avc_demux(SrsBuffer* stream, int64_t timestamp) return srs_error_new(ERROR_HLS_DECODE_ERROR, "only support video H.264/H.265, actual=%d", codec_id); } vcodec->id = codec_id; - - if (!stream->require(4)) { - return srs_error_new(ERROR_HLS_DECODE_ERROR, "avc decode avc_packet_type"); + + int32_t composition_time = 0; + if (!is_ext_header) { + // See rtmp_specification_1.0.pdf + if (!stream->require(4)) { + return srs_error_new(ERROR_HLS_DECODE_ERROR, "requires 4bytes, only %dbytes", stream->left()); + } + packet_type = (SrsVideoAvcFrameTrait)stream->read_1bytes(); + composition_time = stream->read_3bytes(); + } else { + // See https://github.com/veovera/enhanced-rtmp + if (packet_type == SrsVideoHEVCFrameTraitPacketTypeCodedFrames) { + if (!stream->require(3)) { + return srs_error_new(ERROR_HLS_DECODE_ERROR, "requires 3 bytes, only %dbytes", stream->left()); + } + composition_time = stream->read_3bytes(); + } } - int8_t avc_packet_type = stream->read_1bytes(); - int32_t composition_time = stream->read_3bytes(); - + // pts = dts + cts. video->dts = timestamp; video->cts = composition_time; - video->avc_packet_type = (SrsVideoAvcFrameTrait)avc_packet_type; + video->avc_packet_type = packet_type; // Update the RAW AVC data. raw = stream->data() + stream->pos(); @@ -890,12 +962,12 @@ srs_error_t SrsFormat::video_avc_demux(SrsBuffer* stream, int64_t timestamp) // Parse sequence header for H.265/HEVC. if (codec_id == SrsVideoCodecIdHEVC) { #ifdef SRS_H265 - if (avc_packet_type == SrsVideoAvcFrameTraitSequenceHeader) { + if (packet_type == SrsVideoAvcFrameTraitSequenceHeader) { // TODO: demux vps/sps/pps for hevc if ((err = hevc_demux_hvcc(stream)) != srs_success) { return srs_error_wrap(err, "demux hevc VPS/SPS/PPS"); } - } else if (avc_packet_type == SrsVideoAvcFrameTraitNALU) { + } else if (packet_type == SrsVideoAvcFrameTraitNALU || packet_type == SrsVideoHEVCFrameTraitPacketTypeCodedFramesX) { // TODO: demux nalu for hevc if ((err = video_nalu_demux(stream)) != srs_success) { return srs_error_wrap(err, "demux hevc NALU"); @@ -908,12 +980,12 @@ srs_error_t SrsFormat::video_avc_demux(SrsBuffer* stream, int64_t timestamp) } // Parse sequence header for H.264/AVC. - if (avc_packet_type == SrsVideoAvcFrameTraitSequenceHeader) { + if (packet_type == SrsVideoAvcFrameTraitSequenceHeader) { // TODO: FIXME: Maybe we should ignore any error for parsing sps/pps. if ((err = avc_demux_sps_pps(stream)) != srs_success) { return srs_error_wrap(err, "demux SPS/PPS"); } - } else if (avc_packet_type == SrsVideoAvcFrameTraitNALU){ + } else if (packet_type == SrsVideoAvcFrameTraitNALU){ if ((err = video_nalu_demux(stream)) != srs_success) { return srs_error_wrap(err, "demux NALU"); } diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index 7af52cde79..6cfc390350 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -64,12 +64,32 @@ std::string srs_video_codec_id2str(SrsVideoCodecId codec); enum SrsVideoAvcFrameTrait { // set to the max value to reserved, for array map. - SrsVideoAvcFrameTraitReserved = 3, - SrsVideoAvcFrameTraitForbidden = 3, + SrsVideoAvcFrameTraitReserved = 6, + SrsVideoAvcFrameTraitForbidden = 6, SrsVideoAvcFrameTraitSequenceHeader = 0, SrsVideoAvcFrameTraitNALU = 1, SrsVideoAvcFrameTraitSequenceHeaderEOF = 2, + + SrsVideoHEVCFrameTraitPacketTypeSequenceStart = 0, + SrsVideoHEVCFrameTraitPacketTypeCodedFrames = 1, + SrsVideoHEVCFrameTraitPacketTypeSequenceEnd = 2, + // CompositionTime Offset is implied to equal zero. This is + // an optimization to save putting SI24 composition time value of zero on + // the wire. See pseudo code below in the VideoTagBody section + SrsVideoHEVCFrameTraitPacketTypeCodedFramesX = 3, + // VideoTagBody does not contain video data. VideoTagBody + // instead contains an AMF encoded metadata. See Metadata Frame + // section for an illustration of its usage. As an example, the metadata + // can be HDR information. This is a good way to signal HDR + // information. This also opens up future ways to express additional + // metadata that is meant for the next video sequence. + // + // note: presence of PacketTypeMetadata means that FrameType + // flags at the top of this table should be ignored + SrsVideoHEVCFrameTraitPacketTypeMetadata = 4, + // Carriage of bitstream in MPEG-2 TS format + SrsVideoHEVCFrameTraitPacketTypeMPEG2TSSequenceStart = 5, }; /** diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index e2bbe21fed..f2b2e32b17 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -3897,7 +3897,8 @@ VOID TEST(KernelCodecTest, VideoFormat) HELPER_EXPECT_SUCCESS(f.on_video(0, NULL, 0)); HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)"\x00", 0)); - HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)"\x00", 1)); + HELPER_EXPECT_FAILED(f.on_video(0, (char*)"\x00", 1)); + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)"\x57", 1)); } if (true) { @@ -4001,7 +4002,16 @@ VOID TEST(KernelCodecTest, HevcVideoFormat) HELPER_EXPECT_SUCCESS(f.on_video(0, NULL, 0)); HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)"\x00", 0)); - HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)"\x00", 1)); + HELPER_EXPECT_FAILED(f.on_video(0, (char*)"\x00", 1)); + + // enhanced rtmp/flv + HELPER_EXPECT_SUCCESS(f.on_video(0, NULL, 0)); + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)"\x80", 0)); + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)"\x90", 0)); + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)"\xd0\x68\x76\x63\x31", 5)); + HELPER_EXPECT_FAILED(f.on_video(0, (char*)"\x80", 1)); + HELPER_EXPECT_FAILED(f.on_video(0, (char*)"\x90", 1)); + HELPER_EXPECT_FAILED(f.on_video(0, (char*)"\x90\x68\x76\x63\x31", 5)); } if (true) { @@ -4010,11 +4020,22 @@ VOID TEST(KernelCodecTest, HevcVideoFormat) //HEVC: 0x5c HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)"\x5c", 1)); + HELPER_EXPECT_FAILED(f.on_video(0, (char*)"\x1c", 1)); // CodecId: 0x00 SrsBuffer b((char*)"\x00", 1); srs_error_t err = f.video_avc_demux(&b, 0); HELPER_EXPECT_FAILED(err); + + // enhanced rtmp/flv + SrsBuffer b1((char*)"\x80", 1); + HELPER_EXPECT_FAILED(f.video_avc_demux(&b1, 0)); + SrsBuffer b2((char*)"\x90", 1); + HELPER_EXPECT_FAILED(f.video_avc_demux(&b2, 0)); + SrsBuffer b3((char*)"\x90\x68\x76\x63\x31", 5); + HELPER_EXPECT_FAILED(f.video_avc_demux(&b3, 0)); + SrsBuffer b4((char*)"\xd0\x68\x76\x63\x31", 5); + HELPER_EXPECT_SUCCESS(f.video_avc_demux(&b4, 0)); } uint8_t vps_sps_pps[] = { @@ -4075,6 +4096,93 @@ VOID TEST(KernelCodecTest, HevcVideoFormat) HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)rawIBMF, sizeof(rawIBMF))); EXPECT_EQ(1, f.video->nb_samples); } + + // enhanced rtmp + uint8_t ext_vps_sps_pps[] = { + // IsExHeader | FrameType: UB[4] + // PacketType: UB[4] + 0x90, + // Video FourCC + 0x68, 0x76, 0x63, 0x31, + // SrsHevcDecoderConfigurationRecord + 0x01, 0x01, 0x60, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xf0, 0x00, 0xfc, 0xfd, 0xf8, 0xf8, 0x00, 0x00, 0x0f, 0x03, + // Nalus + // data_byte(1B)+num_nalus(2B)+nal_unit_length(2B) + 0x20, 0x00, 0x01, 0x00, 0x18, + // VPS + 0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5d, 0x95, 0x98, 0x09, + // data_byte(1B)+num_nalus(2B)+nal_unit_length(2B) + 0x21, 0x00, 0x01, 0x00, 0x28, + // SPS + 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5d, 0xa0, 0x02, 0x80, 0x80, 0x2d, 0x16, + 0x59, 0x59, 0xa4, 0x93, 0x2b, 0xc0, 0x40, 0x40, 0x00, 0x00, 0xfa, 0x40, 0x00, 0x17, 0x70, 0x02, + // data_byte(1B)+num_nalus(2B)+nal_unit_length(2B) + 0x22, 0x00, 0x01, 0x00, 0x07, + // PPS + 0x44, 0x01, 0xc1, 0x72, 0xb4, 0x62, 0x40 + }; + + uint8_t ext_rawIBMF[] = { + // IsExHeader | FrameType: UB[4] + // PacketType: UB[4] + 0x93, + // Video FourCC + 0x68, 0x76, 0x63, 0x31, + // HEVC NALU + 0x00, 0x00, 0x00, 0x0b, + 0x28, 0x1, 0xaf, 0x1d, 0x18, 0x38, 0xd4, 0x38, 0x32, 0xda, 0x23 + }; + + uint8_t ext_rawIBMF1[] = { + // IsExHeader | FrameType: UB[4] + // PacketType: UB[4] + 0x91, + // Video FourCC + 0x68, 0x76, 0x63, 0x31, + // CompositionTime Offset + 0x00, 0x00, 0x7d, + // HEVC NALU + 0x00, 0x00, 0x00, 0x0b, + 0x28, 0x1, 0xaf, 0x1d, 0x18, 0x38, 0xd4, 0x38, 0x32, 0xda, 0x23 + }; + + if (true) { + SrsFormat f; + HELPER_EXPECT_SUCCESS(f.initialize()); + + // firstly demux sequence header + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)ext_vps_sps_pps, sizeof(ext_vps_sps_pps))); + EXPECT_EQ(1, f.video->frame_type); + EXPECT_EQ(0, f.video->avc_packet_type); + EXPECT_EQ(3, f.vcodec->hevc_dec_conf_record_.nalu_vec.size()); + EXPECT_EQ(1280, f.vcodec->width); + EXPECT_EQ(720, f.vcodec->height); + + // secondly demux sequence header + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)ext_vps_sps_pps, sizeof(ext_vps_sps_pps))); + EXPECT_EQ(1, f.video->frame_type); + EXPECT_EQ(0, f.video->avc_packet_type); + EXPECT_EQ(3, f.vcodec->hevc_dec_conf_record_.nalu_vec.size()); + EXPECT_EQ(1280, f.vcodec->width); + EXPECT_EQ(720, f.vcodec->height); + + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)ext_rawIBMF, sizeof(ext_rawIBMF))); + EXPECT_EQ(1, f.video->frame_type); + EXPECT_EQ(3, f.video->avc_packet_type); + EXPECT_EQ(1, f.video->nb_samples); + + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)ext_rawIBMF, sizeof(ext_rawIBMF))); + EXPECT_EQ(1, f.video->frame_type); + EXPECT_EQ(3, f.video->avc_packet_type); + EXPECT_EQ(1, f.video->nb_samples); + + // check cts + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)ext_rawIBMF1, sizeof(ext_rawIBMF1))); + EXPECT_EQ(1, f.video->frame_type); + EXPECT_EQ(125, f.video->cts); + EXPECT_EQ(1, f.video->avc_packet_type); + EXPECT_EQ(1, f.video->nb_samples); + } } #endif diff --git a/trunk/src/utest/srs_utest_kernel2.cpp b/trunk/src/utest/srs_utest_kernel2.cpp index 44f617f1df..bf9fcce76b 100644 --- a/trunk/src/utest/srs_utest_kernel2.cpp +++ b/trunk/src/utest/srs_utest_kernel2.cpp @@ -411,3 +411,75 @@ VOID TEST(KernelFileWriterTest, RealfileTest) EXPECT_STREQ("HelloWorld", str.substr(20).c_str()); } +VOID TEST(KernelRTMPExtTest, ExtRTMPTest) +{ + srs_error_t err; + + // For legacy RTMP specification, without ext tag header. + if (true) { + SrsFormat f; + HELPER_ASSERT_SUCCESS(f.initialize()); + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*) "\x17\x01\x00\x00\x12", 5)); + + // Verify the frame type, codec id, avc packet type and composition time. + EXPECT_EQ(SrsVideoAvcFrameTypeKeyFrame, f.video->frame_type); + EXPECT_EQ(SrsVideoCodecIdAVC, f.vcodec->id); + EXPECT_EQ(SrsVideoAvcFrameTraitNALU, f.video->avc_packet_type); + EXPECT_EQ(0x12, f.video->cts); + } + + // For new RTMP enhanced specification, with ext tag header. + if (true) { + SrsFormat f; + HELPER_ASSERT_SUCCESS(f.initialize()); + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*) "\x91hvc1\x00\x00\x12", 8)); + + // Verify the frame type, codec id, avc packet type and composition time. + EXPECT_EQ(SrsVideoAvcFrameTypeKeyFrame, f.video->frame_type); + EXPECT_EQ(SrsVideoCodecIdHEVC, f.vcodec->id); + EXPECT_EQ(SrsVideoHEVCFrameTraitPacketTypeCodedFrames, f.video->avc_packet_type); + EXPECT_EQ(0x12, f.video->cts); + } + + // If packet type is 3, which is coded frame X, the composition time is 0. + if (true) { + SrsFormat f; + HELPER_ASSERT_SUCCESS(f.initialize()); + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*) "\x93hvc1", 5)); + + // Verify the frame type, codec id, avc packet type and composition time. + EXPECT_EQ(SrsVideoAvcFrameTypeKeyFrame, f.video->frame_type); + EXPECT_EQ(SrsVideoCodecIdHEVC, f.vcodec->id); + EXPECT_EQ(SrsVideoHEVCFrameTraitPacketTypeCodedFramesX, f.video->avc_packet_type); + EXPECT_EQ(0, f.video->cts); + } + + // Should fail if only 1 byte for ext tag header, should be more bytes for fourcc. + if (true) { + SrsFormat f; + HELPER_ASSERT_SUCCESS(f.initialize()); + HELPER_EXPECT_FAILED(f.on_video(0, (char*) "\x91", 1)); + } + + // Should fail if only 5 bytes for ext tag header, should be more bytes for fourcc. + if (true) { + SrsFormat f; + HELPER_ASSERT_SUCCESS(f.initialize()); + HELPER_EXPECT_FAILED(f.on_video(0, (char*) "\x91hvc1", 5)); + } + + // Should fail if codec id is hvc2 for ext tag header, should be hvc1. + if (true) { + SrsFormat f; + HELPER_ASSERT_SUCCESS(f.initialize()); + HELPER_EXPECT_FAILED(f.on_video(0, (char*) "\x93hvc2", 5)); + } + + // Should fail if codec id is mvc1 for ext tag header, should be hvc1. + if (true) { + SrsFormat f; + HELPER_ASSERT_SUCCESS(f.initialize()); + HELPER_EXPECT_FAILED(f.on_video(0, (char*) "\x93mvc1", 5)); + } +} +