{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/es6-promise/dist/es6-promise.js","node_modules/events/events.js","node_modules/process/browser.js","node_modules/webworkify/index.js","src/config.js","src/core/features.js","src/core/media-info.js","src/core/media-segment-info.js","src/core/mse-controller.js","src/core/mse-events.js","src/core/transmuxer.js","src/core/transmuxing-controller.js","src/core/transmuxing-events.js","src/core/transmuxing-worker.js","src/demux/amf-parser.js","src/demux/demux-errors.js","src/demux/exp-golomb.js","src/demux/flv-demuxer.js","src/demux/sps-parser.js","src/flv.js","src/index.js","src/io/fetch-stream-loader.js","src/io/io-controller.js","src/io/loader.js","src/io/param-seek-handler.js","src/io/range-seek-handler.js","src/io/speed-sampler.js","src/io/websocket-loader.js","src/io/xhr-moz-chunked-loader.js","src/io/xhr-msstream-loader.js","src/io/xhr-range-loader.js","src/player/flv-player.js","src/player/native-player.js","src/player/player-errors.js","src/player/player-events.js","src/remux/aac-silent.js","src/remux/mp4-generator.js","src/remux/mp4-remuxer.js","src/utils/browser.js","src/utils/exception.js","src/utils/logger.js","src/utils/logging-control.js","src/utils/polyfill.js","src/utils/utf8-conv.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","flvjs","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","_dereq_","factory","ES6Promise","objectOrFunction","x","isFunction","setScheduler","scheduleFn","customSchedulerFn","setAsap","asapFn","asap","useVertxTimer","vertxNext","flush","useSetTimeout","globalSetTimeout","setTimeout","len","callback","queue","undefined","then","onFulfillment","onRejection","_arguments","arguments","parent","child","constructor","noop","PROMISE_ID","makePromise","_state","invokeCallback","_result","subscribe","resolve","object","Constructor","promise","_resolve","selfFulfillment","TypeError","cannotReturnOwn","getThen","error","GET_THEN_ERROR","tryThen","value","fulfillmentHandler","rejectionHandler","handleForeignThenable","thenable","sealed","fulfill","reason","_reject","_label","handleOwnThenable","FULFILLED","REJECTED","handleMaybeThenable","maybeThenable","then$$","publishRejection","_onerror","publish","PENDING","_subscribers","subscribers","settled","detail","ErrorObject","tryCatch","TRY_CATCH_ERROR","hasCallback","succeeded","failed","initializePromise","resolver","nextId","id","Enumerator","input","_instanceConstructor","isArray","_input","_remaining","Array","_enumerate","validationError","all","entries","race","reject","_","needsResolver","needsNew","Promise","polyfill","local","Function","P","promiseToString","Object","prototype","toString","cast","_isArray","arg","scheduleFlush","browserWindow","browserGlobal","BrowserMutationObserver","MutationObserver","WebKitMutationObserver","isNode","process","isWorker","Uint8ClampedArray","importScripts","MessageChannel","nextTick","iterations","observer","node","document","createTextNode","observe","characterData","data","channel","port1","onmessage","port2","postMessage","vertx","runOnLoop","runOnContext","Math","random","substring","_eachEntry","entry","c","resolve$$","_then","_settledAt","_willSettleAt","state","enumerator","_setScheduler","_setAsap","_asap","catch","EventEmitter","_events","_maxListeners","isNumber","isObject","isUndefined","defaultMaxListeners","setMaxListeners","isNaN","emit","type","er","handler","args","listeners","err","context","slice","apply","addListener","listener","m","newListener","push","warned","console","trace","on","once","removeListener","fired","list","position","splice","removeAllListeners","key","listenerCount","evlistener","emitter","defaultSetTimout","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","runClearTimeout","marker","cachedClearTimeout","clearTimeout","cleanUpNextTick","draining","currentQueue","concat","queueIndex","drainQueue","timeout","run","Item","array","title","browser","env","argv","version","versions","off","prependListener","prependOnceListener","name","binding","cwd","chdir","dir","umask","bundleFn","sources","cache","stringify","JSON","fn","options","resolveSources","workerSources","depPath","depKey","wkey","cacheKeys","keys","exp","default","floor","pow","wcache","skey","scache","src","map","join","URL","webkitURL","mozURL","msURL","blob","Blob","bare","workerUrl","createObjectURL","worker","Worker","objectURL","createDefaultConfig","assign","defaultConfig","enableWorker","enableStashBuffer","stashInitialSize","isLive","lazyLoad","lazyLoadMaxDuration","lazyLoadRecoverDuration","deferLoadAfterSourceOpen","autoCleanupMaxBackwardDuration","autoCleanupMinBackwardDuration","statisticsInfoReportInterval","fixAudioTimestampGap","accurateSeek","seekType","seekParamStart","seekParamEnd","rangeLoadZeroStart","customSeekHandler","reuseRedirectedURL","_ioController","_config","Features","MediaSource","isTypeSupported","ioctl","_ioController2","loaderType","destroy","mimeType","videoElement","createElement","canPlay","canPlayType","features","mseFlvPlayback","mseLiveFlvPlayback","networkStreamIO","networkLoaderName","nativeMP4H264Playback","nativeWebmVP8Playback","nativeWebmVP9Playback","supportMSEH264Playback","supportNetworkStreamIO","getNetworkLoaderTypeName","supportNativeMediaPlayback","MediaInfo","_classCallCheck","duration","hasAudio","hasVideo","audioCodec","videoCodec","audioDataRate","videoDataRate","audioSampleRate","audioChannelCount","width","height","fps","profile","level","refFrames","chromaFormat","sarNum","sarDen","metadata","segments","segmentCount","hasKeyframesIndex","keyframesIndex","audioInfoComplete","videoInfoComplete","milliseconds","table","keyframeIdx","_search","times","index","fileposition","filepositions","idx","last","mid","lbound","ubound","SampleInfo","dts","pts","originalDts","isSync","isSyncPoint","MediaSegmentInfo","beginDts","endDts","beginPts","endPts","originalBeginDts","originalEndDts","syncPoints","firstSample","lastSample","sampleInfo","IDRSampleList","_list","clear","MediaSegmentInfoList","_type","_lastAppendLocation","_searchNearestSegmentBefore","mediaSegmentInfo","msi","lastAppendIdx","insertIdx","segment","getLastSegmentBefore","segmentIdx","_logger","_browser","_mseEvents","_mediaSegmentInfo","_exception","MSEController","config","TAG","_emitter","_events2","autoCleanupSourceBuffer","onSourceOpen","_onSourceOpen","bind","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","event","mediaElement","IllegalStateException","ms","addEventListener","ps","sb","readyState","removeSourceBuffer","removeEventListener","endOfStream","_logger2","message","removeAttribute","revokeObjectURL","initSegment","deferred","is","container","codec","firstInitSegment","v","addSourceBuffer","_mseEvents2","ERROR","msg","updating","_doAppendSegments","_browser2","safari","mediaDuration","_updateMediaSourceDuration","mediaSegment","_needCleanupSourceBuffer","_doCleanupSourceBuffer","_hasPendingRemoveRanges","seconds","abort","buffered","start","end","_doRemoveRanges","lastInitSegment","_hasPendingSegments","getLastSyncPointBeforeDts","currentTime","doRemove","removeEnd","current","target","ranges","range","shift","remove","pendingSegments","timestampOffset","currentOffset","targetOffset","delta","abs","byteLength","appendBuffer","hasOwnProperty","appendArray","info","unshift","BUFFER_FULL","pendings","appendInitSegment","SOURCE_OPEN","prr","UPDATE_END","MSEEvents","_loggingControl","_transmuxingController","_transmuxingEvents","_transmuxingWorker","_mediaInfo","Transmuxer","mediaDataSource","work","_worker","_transmuxingWorker2","_workerDestroying","_onWorkerMessage","cmd","param","onLoggingConfigChanged","_onLoggingConfigChanged","_loggingControl2","registerListener","getConfig","_controller","_transmuxingController2","ctl","_transmuxingEvents2","IO_ERROR","_onIOError","DEMUX_ERROR","_onDemuxError","INIT_SEGMENT","_onInitSegment","MEDIA_SEGMENT","_onMediaSegment","LOADING_COMPLETE","_onLoadingComplete","RECOVERED_EARLY_EOF","_onRecoveredEarlyEof","MEDIA_INFO","_onMediaInfo","STATISTICS_INFO","_onStatisticsInfo","RECOMMEND_SEEKPOINT","_onRecommendSeekpoint","stop","seek","pause","resume","_this","_this2","_this3","_this4","mediaInfo","_this5","statisticsInfo","_this6","_this7","_this8","_this9","terminate","setPrototypeOf","_mediaInfo2","logcat","_flvDemuxer","_mp4Remuxer","_demuxErrors","TransmuxingController","filesize","url","cors","withCredentials","_mediaDataSource","_currentSegmentIndex","totalDuration","forEach","timestampBase","referrerPolicy","_demuxer","_remuxer","_ioctl","_pendingSeekTime","_pendingResolveSeekPoint","_statisticsReporter","_disableStatisticsReporter","_loadSegment","_enableStatisticsReporter","segmentIndex","optionalFrom","dataSource","onError","_onIOException","onSeeked","_onIOSeeked","onComplete","_onIOComplete","onRedirect","_onIORedirect","onRecoveredEarlyEof","_onIORecoveredEarlyEof","bindDataSource","onDataArrival","_onInitChunkArrival","open","_internalAbort","isWorking","isPaused","isSeekable","targetSegmentIndex","_searchSegmentIndexContains","segmentInfo","keyframe","getNearestKeyframe","targetSegmentInfo","insertDiscontinuity","_keyframe","resetMediaInfo","_reportSegmentMediaInfo","byteStart","probeData","consumed","parseChunks","_flvDemuxer2","probe","match","_mp4Remuxer2","mds","overridedDuration","overridedHasAudio","overridedHasVideo","_onDemuxException","onMediaInfo","onInitSegment","_onRemuxerInitSegmentArrival","onMediaSegment","_onRemuxerMediaSegmentArrival","_demuxErrors2","FORMAT_UNSUPPORTED","extraData","nextSegmentIndex","flushStashedSamples","redirectedURL","seekpoint","setInterval","_reportStatisticsInfo","clearInterval","exportInfo","currentURL","hasRedirect","currentRedirectedURL","speed","currentSpeed","currentSegmentIndex","totalSegmentCount","TransmuxingEvents","_polyfill","TransmuxingWorker","obj","onLoadingComplete","onStatisticsInfo","statInfo","onIOError","onDemuxError","onRecommendSeekpoint","onLogcatCallback","str","controller","logcatListener","_polyfill2","install","applyConfig","enableCallback","addLogListener","removeLogListener","_utf8Conv","le","buf","ArrayBuffer","DataView","setInt16","Int16Array","AMF","arrayBuffer","dataOffset","dataSize","parseValue","size","parseString","isObjectEnd","objectEnd","parseObject","getUint16","_utf8Conv2","Uint8Array","getUint32","timestamp","getFloat64","getInt16","Date","offset","getUint8","amfstr","terminal","amfobj","_terminal","amfvar","parseVariable","strictArrayLength","val","date","parseDate","amfLongStr","w","DemuxErrors","OK","FORMAT_ERROR","CODEC_UNSUPPORTED","ExpGolomb","uint8array","_buffer","_buffer_index","_total_bytes","_total_bits","_current_word","_current_word_bits_left","buffer_bytes_left","bytes_read","min","word","set","subarray","buffer","bits","InvalidArgumentException","result","bits_need_left","_fillCurrentWord","bits_read_next","result2","readBits","zero_count","_skipLeadingZero","leading_zeros","readUEG","ReadBig32","_amfParser","_spsParser","FLVDemuxer","_onError","_onTrackMetadata","_onDataAvailable","_dataOffset","_firstParse","_dispatch","_hasAudio","hasAudioTrack","_hasVideo","hasVideoTrack","_hasAudioFlagOverrided","_hasVideoFlagOverrided","_audioInitialMetadataDispatched","_videoInitialMetadataDispatched","_metadata","_audioMetadata","_videoMetadata","_naluLengthSize","_timestampBase","_timescale","_duration","_durationOverrided","_referenceFrameRate","fixed","fps_num","fps_den","_flvSoundRateTable","_mpegSamplingRates","_mpegAudioV10SampleRateTable","_mpegAudioV20SampleRateTable","_mpegAudioV25SampleRateTable","_mpegAudioL1BitRateTable","_mpegAudioL2BitRateTable","_mpegAudioL3BitRateTable","_videoTrack","sequenceNumber","samples","_audioTrack","_littleEndian","loader","chunk","_v","tagType","ts2","ts1","ts0","ts3","_parseAudioData","_parseVideoData","_parseScriptData","prevTagSize","_isInitialMetadataDispatched","scriptData","_amfParser2","parseScriptData","onMetaData","_typeof","audiodatarate","videodatarate","framerate","keyframes","_parseKeyframesIndex","isComplete","time","tagTimestamp","soundSpec","soundFormat","soundRate","soundRateIndex","soundType","meta","track","timescale","channelCount","aacData","_parseAACAudioData","packetType","misc","samplingRate","originalCodec","refSampleDuration","mi","aacSample","unit","_misc","_parseMP3AudioData","_mi","bitRate","_dts","mp3Sample","_parseAACAudioSpecificConfig","audioObjectType","originalAudioObjectType","samplingIndex","extensionSamplingIndex","samplingFrequence","channelConfig","userAgent","navigator","toLowerCase","indexOf","requestHeader","ver","layer","bitrate_index","sampling_freq_index","channel_mode","channel_count","sample_rate","bit_rate","tagPosition","spec","frameType","codecId","_parseAVCVideoPacket","cts_unsigned","cts","_parseAVCDecoderConfigurationRecord","_parseAVCVideoData","avcc","avcProfile","spsCount","sps","_spsParser2","parseSPS","codecWidth","codec_size","codecHeight","presentWidth","present_size","presentHeight","profile_string","level_string","bitDepth","bit_depth","chroma_format","sarRatio","sar_ratio","frameRate","frame_rate","codecArray","codecString","j","h","ref_frames","chroma_format_string","ppsCount","_i","_len","units","lengthSize","naluSize","unitType","avcSample","isKeyframe","base","mismatch","_expGolomb","SPSParser","src_length","dst","dst_idx","rbsp","_ebsp2rbsp","gb","_expGolomb2","readByte","profile_idc","level_idc","getProfileString","getLevelString","chroma_format_idc","chroma_format_table","readBool","scaling_list_count","_skipScalingList","pic_order_cnt_type","readSEG","num_ref_frames_in_pic_order_cnt_cycle","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","aspect_ratio_idc","sar_w_table","sar_h_table","num_units_in_tick","time_scale","sarScale","crop_unit_x","crop_unit_y","sub_wc","sub_hc","codec_width","codec_height","present_width","ceil","getChromaFormatString","count","last_scale","next_scale","delta_scale","toFixed","chroma","createPlayer","optionalConfig","_flvPlayer2","_nativePlayer2","isSupported","_features2","getFeatureList","_features","_flvPlayer","_nativePlayer","_playerEvents","_playerErrors","Events","_playerEvents2","ErrorTypes","ErrorDetails","FlvPlayer","NativePlayer","LoggingControl","defineProperty","enumerable","get","_loader","FetchStreamLoader","seekHandler","_possibleConstructorReturn","__proto__","getPrototypeOf","_seekHandler","_needStash","_requestAbort","_contentLength","_receivedLength","isWorkWellEdge","msedge","minor","browserNotBlacklisted","fetch","ReadableStream","_get","_dataSource","_range","sourceURL","seekConfig","headers","Headers","configHeaders","append","params","method","mode","credentials","_status","LoaderStatus","kConnecting","res","kIdle","ok","status","_onURLRedirect","removeURLParameters","lengthHeader","parseInt","_onContentLengthKnown","_pump","body","getReader","kError","RuntimeException","statusText","LoaderErrors","HTTP_STATUS_CODE_INVALID","EXCEPTION","reader","read","done","EARLY_EOF","kComplete","_onComplete","from","cancel","kBuffering","_onDataArrival","_speedSampler","_fetchStreamLoader","_xhrMozChunkedLoader","_xhrMsstreamLoader","_xhrRangeLoader","_websocketLoader","_rangeSeekHandler","_paramSeekHandler","IOController","_extraData","_stashInitialSize","_stashUsed","_stashSize","_bufferSize","_stashBuffer","_stashByteStart","_enableStash","_loaderClass","_isWebSocketURL","test","_refTotalLength","_totalLength","_fullRequestFlag","_currentRange","_redirectedURL","_speedNormalized","_speedSampler2","_speedNormalizeList","_isEarlyEofReconnecting","_paused","_resumeFrom","_onSeeked","_onRedirect","_selectSeekHandler","_selectLoader","_createLoader","_rangeSeekHandler2","paramStart","paramEnd","_paramSeekHandler2","_websocketLoader2","_fetchStreamLoader2","_xhrMozChunkedLoader2","_xhrRangeLoader2","needStashBuffer","onContentLengthKnown","onURLRedirect","_onLoaderChunkArrival","_onLoaderComplete","_onLoaderError","to","reset","bytes","_internalSeek","dropUnconsumed","_flushStashBuffer","requestRange","expectedBytes","bufferNewSize","newBuffer","stashOldArray","normalized","stashSizeKB","bufferSize","_expandBuffer","chunks","contentLength","receivedLength","addBytes","KBps","lastSecondKBps","_normalizeSpeed","_adjustStashSize","_stashArray2","_stashArray3","_consumed2","_dispatchChunks","_remainArray","_consumed3","_remain","remain","stashArray","_stashArray","_consumed","remainArray","UNRECOVERABLE_EARLY_EOF","nextFrom","CONNECTING_TIMEOUT","BaseLoader","typeName","NotImplementedException","ParamSeekHandler","_startName","_endName","baseUrl","needAnd","seekedURL","baseURL","split","queryIndex","resultParams","pairs","pair","requireAnd","RangeSeekHandler","zeroStart","_zeroStart","SpeedSampler","_firstCheckpoint","_lastCheckpoint","_intervalBytes","_totalBytes","_lastSecondBytes","performance","now","_now","durationSeconds","currentKBps","WebSocketLoader","_ws","WebSocket","ws","binaryType","onopen","_onWebSocketOpen","onclose","_onWebSocketClose","_onWebSocketMessage","onerror","_onWebSocketError","close","_dispatchArrayBuffer","FileReader","onload","readAsArrayBuffer","arraybuffer","MozChunkedLoader","_xhr","xhr","XMLHttpRequest","responseType","onreadystatechange","onprogress","onloadend","_requestURL","_onReadyStateChange","_onProgress","_onLoadEnd","_onXhrError","setRequestHeader","send","responseURL","total","response","loaded","MSStreamLoader","_reader","_totalRange","_currentRequestURL","_currentRedirectedURL","_bufferLimit","_lastTimeBufferSize","_isReconnecting","MSStream","MSStreamReader","_internalOpen","isSubrange","_msrOnProgress","_msrOnLoad","_msrOnError","_xhrOnReadyStateChange","_xhrOnError","getResponseHeader","msstream","bigbuffer","_doReconnectIfNeeded","RangeLoader","_chunkSizeKBList","_currentChunkSizeKB","_currentSpeedNormalized","_zeroSpeedChunkCount","_waitForTotalLength","_totalLengthReceived","_currentRequestRange","_lastTimeLoaded","useRefTotalLength","_openSubRange","chunkSize","_onLoad","openNextRange","reportComplete","_transmuxer","_mseController","onvLoadedMetadata","_onvLoadedMetadata","onvSeeking","_onvSeeking","onvCanPlay","_onvCanPlay","onvStalled","_onvStalled","onvProgress","_onvProgress","_requestSetTime","_seekpointRecord","_progressChecker","_msectl","_mseSourceOpened","_hasPendingLoad","_receivedCanPlay","_statisticsInfo","chromeNeedIDRFix","chrome","major","build","_alwaysSeekKeyframe","msie","unload","_mseController2","_onmseUpdateEnd","_onmseBufferFull","load","MEDIA_ERROR","MEDIA_MSE_ERROR","attachMediaElement","_transmuxer2","appendMediaSegment","_suspendTransmuxer","NETWORK_ERROR","_fillStatisticsInfo","play","playerType","HTMLVideoElement","hasQualityInfo","decoded","dropped","getVideoPlaybackQuality","quality","totalVideoFrames","droppedVideoFrames","webkitDecodedFrameCount","webkitDroppedFrameCount","decodedFrames","droppedFrames","currentRangeEnd","_checkProgressAndResume","needResume","directSeek","_isTimepointBuffered","directSeekBegin","directSeekBeginTime","videoBeginTime","idr","recordTime","_checkAndApplyUnbufferedSeekpoint","stalled","media","seekPoint","_checkAndResumeStuckPlayback","volume","muted","preload","mediaPrefix","HTMLAudioElement","videoWidth","videoHeight","OTHER_ERROR","NETWORK_EXCEPTION","NETWORK_STATUS_CODE_INVALID","NETWORK_TIMEOUT","NETWORK_UNRECOVERABLE_EARLY_EOF","MEDIA_FORMAT_ERROR","MEDIA_FORMAT_UNSUPPORTED","MEDIA_CODEC_UNSUPPORTED","PlayerEvents","AAC","MP4","types","avc1","avcC","btrt","dinf","dref","esds","ftyp","hdlr","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",".mp3","charCodeAt","constants","FTYP","STSD_PREFIX","STTS","STSC","STCO","STSZ","HDLR_VIDEO","HDLR_AUDIO","DREF","SMHD","VMHD","datas","arrayCount","box","trackId","xmhd","mp3","sampleRate","configSize","baseMediaDecodeTime","sampleCount","flags","isLeading","dependsOn","isDependedOn","hasRedundancy","isNonSync","init","_mp4Generator","_aacSilent","MP4Remuxer","_isLive","_dtsBase","_dtsBaseInited","_audioDtsBase","Infinity","_videoDtsBase","_audioNextDts","_videoNextDts","_audioStashedLastSample","_videoStashedLastSample","_audioMeta","_videoMeta","_audioSegmentInfoList","_videoSegmentInfoList","_forceFirstIDR","_fillSilentAfterSeek","_mp3UseMpegAudio","firefox","_fillAudioTimestampGap","producer","onDataAvailable","remux","onTrackMetadata","_onTrackMetadataReceived","audioTrack","videoTrack","_calculateDtsBase","_remuxVideo","_remuxAudio","metabox","_mp4Generator2","generateInitSegment","videoSample","audioSample","force","dtsCorrection","firstDts","lastDts","mpegRawTrack","firstSegmentAfterSeek","insertPrefixSilentFrame","mdatbox","mdatBytes","pop","sample","firstSampleOriginalDts","isEmpty","_lastSample","getLastSampleBefore","distance","expectedDts","firstSampleDts","videoSegment","silentUnit","_aacSilent2","getSilentFrame","silentFrameDuration","mp4Samples","_sample","sampleDuration","_nextDts","needFillSilentFrames","silentFrames","frameCount","currentDts","round","_silentUnit","intDts","previousFrame","frame","lastFrame","_unit","latest","moofbox","_mergeBoxes","firstPts","lastPts","_lastSample2","_sample2","_nextDts2","syncPoint","appendSyncPoint","_i2","Browser","ua","exec","platform_match","matched","majorVersion","platform","versionArray","string","opr","webkit","rv","iemobile","edge","android","_message","Log","tag","FORCE_GLOBAL_TAG","GLOBAL_TAG","ENABLE_CALLBACK","ENABLE_ERROR","warn","log","ENABLE_INFO","ENABLE_WARN","ENABLE_DEBUG","debug","ENABLE_VERBOSE","globalTag","forceGlobalTag","enableVerbose","enableDebug","enableInfo","enableWarn","enableError","_notifyChange","enable","Polyfill","proto","output","source","checkContinuation","checkLength","decodeUTF8","out","String","fromCharCode","ucs4","_ucs","_ucs2"],"mappings":"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","file":"flv.min.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 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*/\nfunction 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\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = resolve;\nPromise.reject = reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;\n\nPromise.prototype = {\n constructor: Promise,\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 \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 \n Chaining\n --------\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 \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 \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 \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 \n Assimilation\n ------------\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 \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 \n If the assimliated promise rejects, then the downstream promise will also reject.\n \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 \n Simple Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let result;\n \n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n \n Advanced Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let author, books;\n \n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n \n function foundBooks(books) {\n \n }\n \n function failure(reason) {\n \n }\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 \n Promise Example;\n \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 \n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n then: then,\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 \n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n \n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n \n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n \n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n 'catch': function _catch(onRejection) {\n return this.then(null, onRejection);\n }\n};\n\nfunction polyfill() {\n var local = undefined;\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;\n}\n\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\n\nreturn Promise;\n\n})));\n//# sourceMappingURL=es6-promise.map\n","// 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\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\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.\nEventEmitter.defaultMaxListeners = 10;\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(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\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 bundleFn = arguments[3];\nvar sources = arguments[4];\nvar cache = arguments[5];\n\nvar stringify = JSON.stringify;\n\nmodule.exports = function (fn, options) {\n var wkey;\n var cacheKeys = Object.keys(cache);\n\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n var exp = cache[key].exports;\n // Using babel as a transpiler to use esmodule, the export will always\n // be an object with the default export as a property of it. To ensure\n // the existing api and babel esmodule exports are both supported we\n // check for both\n if (exp === fn || exp && exp.default === fn) {\n wkey = key;\n break;\n }\n }\n\n if (!wkey) {\n wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n var wcache = {};\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n wcache[key] = key;\n }\n sources[wkey] = [\n Function(['require','module','exports'], '(' + fn + ')(self)'),\n wcache\n ];\n }\n var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n\n var scache = {}; scache[wkey] = wkey;\n sources[skey] = [\n Function(['require'], (\n // try to call default if defined to also support babel esmodule\n // exports\n 'var f = require(' + stringify(wkey) + ');' +\n '(f.default ? f.default : f)(self);'\n )),\n scache\n ];\n\n var workerSources = {};\n resolveSources(skey);\n\n function resolveSources(key) {\n workerSources[key] = true;\n\n for (var depPath in sources[key][1]) {\n var depKey = sources[key][1][depPath];\n if (!workerSources[depKey]) {\n resolveSources(depKey);\n }\n }\n }\n\n var src = '(' + bundleFn + ')({'\n + Object.keys(workerSources).map(function (key) {\n return stringify(key) + ':['\n + sources[key][0]\n + ',' + stringify(sources[key][1]) + ']'\n ;\n }).join(',')\n + '},{},[' + stringify(skey) + '])'\n ;\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n var blob = new Blob([src], { type: 'text/javascript' });\n if (options && options.bare) { return blob; }\n var workerUrl = URL.createObjectURL(blob);\n var worker = new Worker(workerUrl);\n worker.objectURL = workerUrl;\n return worker;\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 const defaultConfig = {\n enableWorker: false,\n enableStashBuffer: true,\n stashInitialSize: undefined,\n\n isLive: false,\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\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 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 mseFlvPlayback: false,\n mseLiveFlvPlayback: false,\n networkStreamIO: false,\n networkLoaderName: '',\n nativeMP4H264Playback: false,\n nativeWebmVP8Playback: false,\n nativeWebmVP9Playback: false\n };\n\n features.mseFlvPlayback = Features.supportMSEH264Playback();\n features.networkStreamIO = Features.supportNetworkStreamIO();\n features.networkLoaderName = Features.getNetworkLoaderTypeName();\n features.mseLiveFlvPlayback = features.mseFlvPlayback && features.networkStreamIO;\n features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"');\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\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 this.duration != null &&\n this.metadata != null &&\n this.hasKeyframesIndex != 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\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\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.removeSourceBuffer(sb);\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\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 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 let work = require('webworkify');\n this._worker = work(TransmuxingWorker);\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.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 _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.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\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 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 probeData = null;\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 if ((probeData = FLVDemuxer.probe(data)).match) {\n // Always create new FLVDemuxer\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\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 consumed = this._demuxer.parseChunks(data, byteStart);\n } else {\n probeData = null;\n Log.e(this.TAG, 'Non-FLV, Unsupported media type!');\n Promise.resolve().then(() => {\n this._internalAbort();\n });\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, DemuxErrors.FORMAT_UNSUPPORTED, 'Non-FLV, Unsupported media type');\n\n consumed = 0;\n }\n\n return consumed;\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 _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 this._remuxer.flushStashedSamples();\n this._loadSegment(nextSegmentIndex);\n } else {\n this._remuxer.flushStashedSamples();\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 * 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 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 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.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 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\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\nconst DemuxErrors = {\n OK: 'OK',\n FORMAT_ERROR: 'FormatError',\n FORMAT_UNSUPPORTED: 'FormatUnsupported',\n CODEC_UNSUPPORTED: 'CodecUnsupported'\n};\n\nexport default DemuxErrors;","/*\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 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';\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._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._onTrackMetadata = null;\n this._onDataAvailable = null;\n }\n\n static probe(buffer) {\n let data = new Uint8Array(buffer);\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 // 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 (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\n _parseKeyframesIndex(keyframes) {\n let times = [];\n let filepositions = [];\n\n // ignore first keyframe which is actually AVC Sequence Header (AVCDecoderConfigurationRecord)\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 Log.w(this.TAG, 'Found another AudioSpecificConfig!');\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) {\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, `Flv: Unsupported codec in video frame: ${codecId}`);\n return;\n }\n\n this._parseAVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);\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 _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 Log.w(this.TAG, 'Found another AVCDecoderConfigurationRecord!');\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 _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}\n\nexport default FLVDemuxer;","/*\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 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 = 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 = gb.readUEG() + 8; // bit_depth_luma_minus8\n gb.readUEG(); // 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 profile_string: profile_string, // baseline, high, high10, ...\n level_string: level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...\n bit_depth: bit_depth, // 8bit, 10bit, ...\n ref_frames: ref_frames,\n chroma_format: 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) 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 FlvPlayer from './player/flv-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 'flv':\n return new FlvPlayer(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 flvjs = {};\n\nflvjs.createPlayer = createPlayer;\nflvjs.isSupported = isSupported;\nflvjs.getFeatureList = getFeatureList;\n\nflvjs.Events = PlayerEvents;\nflvjs.ErrorTypes = ErrorTypes;\nflvjs.ErrorDetails = ErrorDetails;\n\nflvjs.FlvPlayer = FlvPlayer;\nflvjs.NativePlayer = NativePlayer;\nflvjs.LoggingControl = LoggingControl;\n\nObject.defineProperty(flvjs, 'version', {\n enumerable: true,\n get: function () {\n // replaced by browserify-versionify transform\n return '__VERSION__';\n }\n});\n\nexport default flvjs;","// entry/index file\n\n// make it compatible with browserify's umd wrapper\nmodule.exports = require('./flv.js').default;\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 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._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 // 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 this._status = LoaderStatus.kConnecting;\n self.fetch(seekConfig.url, params).then((res) => {\n if (this._requestAbort) {\n this._requestAbort = false;\n this._status = LoaderStatus.kIdle;\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 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\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._requestAbort === true) {\n this._requestAbort = false;\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 (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 * 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 = 1024 * 384; // default initial size: 384KB\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 = [64, 128, 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._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 single normalized speed for size of stashSizeKB\n stashSizeKB = normalized;\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\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\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\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\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 {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For 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\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 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 {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n/* Notice: ms-stream may cause IE/Edge browser crash if seek too frequently!!!\n * The browser may crash in wininet.dll. Disable for now.\n *\n * For IE11/Edge browser by microsoft which supports `xhr.responseType = 'ms-stream'`\n * Notice that ms-stream API sucks. The buffer is always expanding along with downloading.\n *\n * We need to abort the xhr if buffer size exceeded limit size (e.g. 16 MiB), then do reconnect.\n * in order to release previous ArrayBuffer to avoid memory leak\n *\n * Otherwise, the ArrayBuffer will increase to a terrible size that equals final file size.\n */\nclass MSStreamLoader extends BaseLoader {\n\n static isSupported() {\n try {\n if (typeof self.MSStream === 'undefined' || typeof self.MSStreamReader === 'undefined') {\n return false;\n }\n\n let xhr = new XMLHttpRequest();\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'ms-stream';\n return (xhr.responseType === 'ms-stream');\n } catch (e) {\n Log.w('MSStreamLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-msstream-loader');\n this.TAG = 'MSStreamLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._xhr = null;\n this._reader = null; // MSStreamReader\n\n this._totalRange = null;\n this._currentRange = null;\n\n this._currentRequestURL = null;\n this._currentRedirectedURL = null;\n\n this._contentLength = null;\n this._receivedLength = 0;\n\n this._bufferLimit = 16 * 1024 * 1024; // 16MB\n this._lastTimeBufferSize = 0;\n this._isReconnecting = false;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._reader) {\n this._reader.onprogress = null;\n this._reader.onload = null;\n this._reader.onerror = null;\n this._reader = null;\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._internalOpen(dataSource, range, false);\n }\n\n _internalOpen(dataSource, range, isSubrange) {\n this._dataSource = dataSource;\n\n if (!isSubrange) {\n this._totalRange = range;\n } else {\n this._currentRange = range;\n }\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 reader = this._reader = new self.MSStreamReader();\n reader.onprogress = this._msrOnProgress.bind(this);\n reader.onload = this._msrOnLoad.bind(this);\n reader.onerror = this._msrOnError.bind(this);\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'ms-stream';\n xhr.onreadystatechange = this._xhrOnReadyStateChange.bind(this);\n xhr.onerror = this._xhrOnError.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 if (this._isReconnecting) {\n this._isReconnecting = false;\n } else {\n this._status = LoaderStatus.kConnecting;\n }\n xhr.send();\n }\n\n abort() {\n this._internalAbort();\n this._status = LoaderStatus.kComplete;\n }\n\n _internalAbort() {\n if (this._reader) {\n if (this._reader.readyState === 1) { // LOADING\n this._reader.abort();\n }\n this._reader.onprogress = null;\n this._reader.onload = null;\n this._reader.onerror = null;\n this._reader = null;\n }\n if (this._xhr) {\n this._xhr.abort();\n this._xhr.onreadystatechange = null;\n this._xhr = null;\n }\n }\n\n _xhrOnReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.status >= 200 && xhr.status <= 299) {\n this._status = LoaderStatus.kBuffering;\n\n if (xhr.responseURL != undefined) {\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 let lengthHeader = xhr.getResponseHeader('Content-Length');\n if (lengthHeader != null && this._contentLength == null) {\n let length = parseInt(lengthHeader);\n if (length > 0) {\n this._contentLength = length;\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\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('MSStreamLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n }\n } else if (xhr.readyState === 3) { // LOADING\n if (xhr.status >= 200 && xhr.status <= 299) {\n this._status = LoaderStatus.kBuffering;\n\n let msstream = xhr.response;\n this._reader.readAsArrayBuffer(msstream);\n }\n }\n }\n\n _xhrOnError(e) {\n this._status = LoaderStatus.kError;\n let type = LoaderErrors.EXCEPTION;\n let info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n _msrOnProgress(e) {\n let reader = e.target;\n let bigbuffer = reader.result;\n if (bigbuffer == null) { // result may be null, workaround for buggy M$\n this._doReconnectIfNeeded();\n return;\n }\n\n let slice = bigbuffer.slice(this._lastTimeBufferSize);\n this._lastTimeBufferSize = bigbuffer.byteLength;\n let byteStart = this._totalRange.from + this._receivedLength;\n this._receivedLength += slice.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(slice, byteStart, this._receivedLength);\n }\n\n if (bigbuffer.byteLength >= this._bufferLimit) {\n Log.v(this.TAG, `MSStream buffer exceeded max size near ${byteStart + slice.byteLength}, reconnecting...`);\n this._doReconnectIfNeeded();\n }\n }\n\n _doReconnectIfNeeded() {\n if (this._contentLength == null || this._receivedLength < this._contentLength) {\n this._isReconnecting = true;\n this._lastTimeBufferSize = 0;\n this._internalAbort();\n\n let range = {\n from: this._totalRange.from + this._receivedLength,\n to: -1\n };\n this._internalOpen(this._dataSource, range, true);\n }\n }\n\n _msrOnLoad(e) { // actually it is onComplete event\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._totalRange.from, this._totalRange.from + this._receivedLength - 1);\n }\n }\n\n _msrOnError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && this._receivedLength < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'MSStream meet Early-Eof'};\n } else {\n type = LoaderErrors.EARLY_EOF;\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\nexport default MSStreamLoader;","/*\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 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 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 FlvPlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'FlvPlayer';\n this._type = 'FlvPlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n if (mediaDataSource.type.toLowerCase() !== 'flv') {\n throw new InvalidArgumentException('FlvPlayer requires an 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('FlvPlayer.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.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 if (!this._config.lazyLoad || this._config.isLive) {\n return;\n }\n\n let buffered = this._mediaElement.buffered;\n let currentTime = this._mediaElement.currentTime;\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 FlvPlayer;","/*\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 if (mediaDataSource.type.toLowerCase() === 'flv') {\n throw new InvalidArgumentException('NativePlayer does\\'t support 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 {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\nconst PlayerEvents = {\n ERROR: 'error',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n STATISTICS_INFO: 'statistics_info'\n};\n\nexport default PlayerEvents;","/*\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 * 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 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 {\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 // 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 * @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 this._remuxVideo(videoTrack);\n this._remuxAudio(audioTrack);\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.samples && audioTrack.samples.length) {\n this._audioDtsBase = audioTrack.samples[0].dts;\n }\n if (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 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 - dtsCorrection;\n\n if (firstDts === -1) {\n firstDts = dts;\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(refSampleDuration);\n }\n }\n\n let needFillSilentFrames = false;\n let silentFrames = null;\n\n // Silent frame generation, if large timestamp gap detected && config.fixAudioTimestampGap\n if (sampleDuration > refSampleDuration * 1.5 && this._audioMeta.codec !== 'mp3' && this._fillAudioTimestampGap && !Browser.safari) {\n // We need to insert silent frames to fill timestamp gap\n needFillSilentFrames = true;\n let delta = Math.abs(sampleDuration - refSampleDuration);\n let frameCount = Math.ceil(delta / refSampleDuration);\n let currentDts = dts + refSampleDuration; // Notice: in float\n\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 `dts: ${dts + sampleDuration} ms, expected: ${dts + Math.round(refSampleDuration)} ms, ` +\n `delta: ${Math.round(delta)} ms, generate: ${frameCount} frames`);\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 let intDts = Math.round(currentDts); // round to integer\n if (silentFrames.length > 0) {\n // Set previous frame sample duration\n let previousFrame = silentFrames[silentFrames.length - 1];\n previousFrame.duration = intDts - previousFrame.dts;\n }\n let frame = {\n dts: intDts,\n pts: intDts,\n cts: 0,\n unit: silentUnit,\n size: silentUnit.byteLength,\n duration: 0, // 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 += unit.byteLength;\n currentDts += refSampleDuration;\n }\n\n // last frame: align end time to next frame dts\n let lastFrame = silentFrames[silentFrames.length - 1];\n lastFrame.duration = dts + sampleDuration - lastFrame.dts;\n\n // silentFrames.forEach((frame) => {\n // Log.w(this.TAG, `SilentAudio: dts: ${frame.dts}, duration: ${frame.duration}`);\n // });\n\n // Set correct sample duration for current frame\n sampleDuration = Math.round(refSampleDuration);\n }\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 // 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 * 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\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\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 = 'flv.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\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 * @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;","/*\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;"]}