jsmpeg.min.js 182 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247
  1. var JSMpeg = {
  2. Player: null,
  3. VideoElement: null,
  4. BitBuffer: null,
  5. Source: {},
  6. Demuxer: {},
  7. Decoder: {},
  8. Renderer: {},
  9. AudioOutput: {},
  10. Now: function() {
  11. return window.performance ? window.performance.now() / 1e3 : Date.now() / 1e3
  12. },
  13. CreateVideoElements: function() {
  14. var elements = document.querySelectorAll(".jsmpeg");
  15. for (var i = 0; i < elements.length; i++) {
  16. new JSMpeg.VideoElement(elements[i])
  17. }
  18. },
  19. Fill: function(array, value) {
  20. if (array.fill) {
  21. array.fill(value)
  22. } else {
  23. for (var i = 0; i < array.length; i++) {
  24. array[i] = value
  25. }
  26. }
  27. },
  28. Base64ToArrayBuffer: function(base64) {
  29. var binary = window.atob(base64);
  30. var length = binary.length;
  31. var bytes = new Uint8Array(length);
  32. for (var i = 0; i < length; i++) {
  33. bytes[i] = binary.charCodeAt(i)
  34. }
  35. return bytes.buffer
  36. },
  37. WASM_BINARY_INLINED: null
  38. };
  39. if (document.readyState === "complete") {
  40. JSMpeg.CreateVideoElements()
  41. } else {
  42. document.addEventListener("DOMContentLoaded", JSMpeg.CreateVideoElements)
  43. }
  44. JSMpeg.VideoElement = function() {
  45. "use strict";
  46. var VideoElement = function(element) {
  47. var url = element.dataset.url;
  48. if (!url) {
  49. throw "VideoElement has no `data-url` attribute"
  50. }
  51. var addStyles = function(element, styles) {
  52. for (var name in styles) {
  53. element.style[name] = styles[name]
  54. }
  55. };
  56. this.container = element;
  57. addStyles(this.container, {
  58. display: "inline-block",
  59. position: "relative",
  60. minWidth: "80px",
  61. minHeight: "80px"
  62. });
  63. this.canvas = document.createElement("canvas");
  64. this.canvas.width = 960;
  65. this.canvas.height = 540;
  66. addStyles(this.canvas, {
  67. display: "block",
  68. width: "100%"
  69. });
  70. this.container.appendChild(this.canvas);
  71. this.playButton = document.createElement("div");
  72. this.playButton.innerHTML = VideoElement.PLAY_BUTTON;
  73. addStyles(this.playButton, {
  74. zIndex: 2,
  75. position: "absolute",
  76. top: "0",
  77. bottom: "0",
  78. left: "0",
  79. right: "0",
  80. maxWidth: "75px",
  81. maxHeight: "75px",
  82. margin: "auto",
  83. opacity: "0.7",
  84. cursor: "pointer"
  85. });
  86. this.container.appendChild(this.playButton);
  87. var options = {
  88. canvas: this.canvas
  89. };
  90. for (var option in element.dataset) {
  91. try {
  92. options[option] = JSON.parse(element.dataset[option])
  93. } catch (err) {
  94. options[option] = element.dataset[option]
  95. }
  96. }
  97. this.player = new JSMpeg.Player(url,options);
  98. element.playerInstance = this.player;
  99. if (options.poster && !options.autoplay && !this.player.options.streaming) {
  100. options.decodeFirstFrame = false;
  101. this.poster = new Image;
  102. this.poster.src = options.poster;
  103. this.poster.addEventListener("load", this.posterLoaded);
  104. addStyles(this.poster, {
  105. display: "block",
  106. zIndex: 1,
  107. position: "absolute",
  108. top: 0,
  109. left: 0,
  110. bottom: 0,
  111. right: 0
  112. });
  113. this.container.appendChild(this.poster)
  114. }
  115. if (!this.player.options.streaming) {
  116. this.container.addEventListener("click", this.onClick.bind(this))
  117. }
  118. if (options.autoplay || this.player.options.streaming) {
  119. this.playButton.style.display = "none"
  120. }
  121. if (this.player.audioOut && !this.player.audioOut.unlocked) {
  122. var unlockAudioElement = this.container;
  123. if (options.autoplay || this.player.options.streaming) {
  124. this.unmuteButton = document.createElement("div");
  125. this.unmuteButton.innerHTML = VideoElement.UNMUTE_BUTTON;
  126. addStyles(this.unmuteButton, {
  127. zIndex: 2,
  128. position: "absolute",
  129. bottom: "10px",
  130. right: "20px",
  131. width: "75px",
  132. height: "75px",
  133. margin: "auto",
  134. opacity: "0.7",
  135. cursor: "pointer"
  136. });
  137. this.container.appendChild(this.unmuteButton);
  138. unlockAudioElement = this.unmuteButton
  139. }
  140. this.unlockAudioBound = this.onUnlockAudio.bind(this, unlockAudioElement);
  141. unlockAudioElement.addEventListener("touchstart", this.unlockAudioBound, false);
  142. unlockAudioElement.addEventListener("click", this.unlockAudioBound, true)
  143. }
  144. };
  145. VideoElement.prototype.onUnlockAudio = function(element, ev) {
  146. if (this.unmuteButton) {
  147. ev.preventDefault();
  148. ev.stopPropagation()
  149. }
  150. this.player.audioOut.unlock(function() {
  151. if (this.unmuteButton) {
  152. this.unmuteButton.style.display = "none"
  153. }
  154. element.removeEventListener("touchstart", this.unlockAudioBound);
  155. element.removeEventListener("click", this.unlockAudioBound)
  156. }
  157. .bind(this))
  158. }
  159. ;
  160. VideoElement.prototype.onClick = function(ev) {
  161. if (this.player.isPlaying) {
  162. this.player.pause();
  163. this.playButton.style.display = "block"
  164. } else {
  165. this.player.play();
  166. this.playButton.style.display = "none";
  167. if (this.poster) {
  168. this.poster.style.display = "none"
  169. }
  170. }
  171. }
  172. ;
  173. VideoElement.PLAY_BUTTON = '<svg style="max-width: 75px; max-height: 75px;" ' + 'viewBox="0 0 200 200" alt="Play video">' + '<circle cx="100" cy="100" r="90" fill="none" ' + 'stroke-width="15" stroke="#fff"/>' + '<polygon points="70, 55 70, 145 145, 100" fill="#fff"/>' + "</svg>";
  174. VideoElement.UNMUTE_BUTTON = '<svg style="max-width: 75px; max-height: 75px;" viewBox="0 0 75 75">' + '<polygon class="audio-speaker" stroke="none" fill="#fff" ' + 'points="39,13 22,28 6,28 6,47 21,47 39,62 39,13"/>' + '<g stroke="#fff" stroke-width="5">' + '<path d="M 49,50 69,26"/>' + '<path d="M 69,50 49,26"/>' + "</g>" + "</svg>";
  175. return VideoElement
  176. }();
  177. JSMpeg.Player = function() {
  178. "use strict";
  179. var Player = function(url, options) {
  180. this.options = options || {};
  181. if (options.source) {
  182. this.source = new options.source(url,options);
  183. options.streaming = !!this.source.streaming
  184. } else if (url.match(/^wss?:\/\//)) {
  185. this.source = new JSMpeg.Source.WebSocket(url,options);
  186. options.streaming = true
  187. } else if (options.progressive !== false) {
  188. this.source = new JSMpeg.Source.AjaxProgressive(url,options);
  189. options.streaming = false
  190. } else {
  191. this.source = new JSMpeg.Source.Ajax(url,options);
  192. options.streaming = false
  193. }
  194. this.maxAudioLag = options.maxAudioLag || .25;
  195. this.loop = options.loop !== false;
  196. this.autoplay = !!options.autoplay || options.streaming;
  197. this.demuxer = new JSMpeg.Demuxer.TS(options);
  198. this.source.connect(this.demuxer);
  199. if (!options.disableWebAssembly && JSMpeg.WASMModule.IsSupported()) {
  200. this.wasmModule = new JSMpeg.WASMModule;
  201. options.wasmModule = this.wasmModule
  202. }
  203. if (options.video !== false) {
  204. this.video = options.wasmModule ? new JSMpeg.Decoder.MPEG1VideoWASM(options) : new JSMpeg.Decoder.MPEG1Video(options);
  205. this.renderer = !options.disableGl && JSMpeg.Renderer.WebGL.IsSupported() ? new JSMpeg.Renderer.WebGL(options) : new JSMpeg.Renderer.Canvas2D(options);
  206. this.demuxer.connect(JSMpeg.Demuxer.TS.STREAM.VIDEO_1, this.video);
  207. this.video.connect(this.renderer)
  208. }
  209. if (options.audio !== false && JSMpeg.AudioOutput.WebAudio.IsSupported()) {
  210. this.audio = options.wasmModule ? new JSMpeg.Decoder.MP2AudioWASM(options) : new JSMpeg.Decoder.MP2Audio(options);
  211. this.audioOut = new JSMpeg.AudioOutput.WebAudio(options);
  212. this.demuxer.connect(JSMpeg.Demuxer.TS.STREAM.AUDIO_1, this.audio);
  213. this.audio.connect(this.audioOut)
  214. }
  215. Object.defineProperty(this, "currentTime", {
  216. get: this.getCurrentTime,
  217. set: this.setCurrentTime
  218. });
  219. Object.defineProperty(this, "volume", {
  220. get: this.getVolume,
  221. set: this.setVolume
  222. });
  223. this.paused = true;
  224. this.unpauseOnShow = false;
  225. if (options.pauseWhenHidden !== false) {
  226. document.addEventListener("visibilitychange", this.showHide.bind(this))
  227. }
  228. if (this.wasmModule) {
  229. if (JSMpeg.WASM_BINARY_INLINED) {
  230. var wasm = JSMpeg.Base64ToArrayBuffer(JSMpeg.WASM_BINARY_INLINED);
  231. this.wasmModule.loadFromBuffer(wasm, this.startLoading.bind(this))
  232. } else {
  233. this.wasmModule.loadFromFile("jsmpeg.wasm", this.startLoading.bind(this))
  234. }
  235. } else {
  236. this.startLoading()
  237. }
  238. };
  239. Player.prototype.startLoading = function() {
  240. this.source.start();
  241. if (this.autoplay) {
  242. this.play()
  243. }
  244. }
  245. ;
  246. Player.prototype.showHide = function(ev) {
  247. if (document.visibilityState === "hidden") {
  248. this.unpauseOnShow = this.wantsToPlay;
  249. this.pause()
  250. } else if (this.unpauseOnShow) {
  251. this.play()
  252. }
  253. }
  254. ;
  255. Player.prototype.play = function(ev) {
  256. if (this.animationId) {
  257. return
  258. }
  259. this.animationId = requestAnimationFrame(this.update.bind(this));
  260. this.wantsToPlay = true;
  261. this.paused = false
  262. }
  263. ;
  264. Player.prototype.pause = function(ev) {
  265. if (this.paused) {
  266. return
  267. }
  268. cancelAnimationFrame(this.animationId);
  269. this.animationId = null;
  270. this.wantsToPlay = false;
  271. this.isPlaying = false;
  272. this.paused = true;
  273. if (this.audio && this.audio.canPlay) {
  274. this.audioOut.stop();
  275. this.seek(this.currentTime)
  276. }
  277. if (this.options.onPause) {
  278. this.options.onPause(this)
  279. }
  280. }
  281. ;
  282. Player.prototype.getVolume = function() {
  283. return this.audioOut ? this.audioOut.volume : 0
  284. }
  285. ;
  286. Player.prototype.setVolume = function(volume) {
  287. if (this.audioOut) {
  288. this.audioOut.volume = volume
  289. }
  290. }
  291. ;
  292. Player.prototype.stop = function(ev) {
  293. this.pause();
  294. this.seek(0);
  295. if (this.video && this.options.decodeFirstFrame !== false) {
  296. this.video.decode()
  297. }
  298. }
  299. ;
  300. Player.prototype.destroy = function() {
  301. this.pause();
  302. this.source.destroy();
  303. this.video && this.video.destroy();
  304. this.renderer && this.renderer.destroy();
  305. this.audio && this.audio.destroy();
  306. this.audioOut && this.audioOut.destroy()
  307. }
  308. ;
  309. Player.prototype.seek = function(time) {
  310. var startOffset = this.audio && this.audio.canPlay ? this.audio.startTime : this.video.startTime;
  311. if (this.video) {
  312. this.video.seek(time + startOffset)
  313. }
  314. if (this.audio) {
  315. this.audio.seek(time + startOffset)
  316. }
  317. this.startTime = JSMpeg.Now() - time
  318. }
  319. ;
  320. Player.prototype.getCurrentTime = function() {
  321. return this.audio && this.audio.canPlay ? this.audio.currentTime - this.audio.startTime : this.video.currentTime - this.video.startTime
  322. }
  323. ;
  324. Player.prototype.setCurrentTime = function(time) {
  325. this.seek(time)
  326. }
  327. ;
  328. Player.prototype.update = function() {
  329. this.animationId = requestAnimationFrame(this.update.bind(this));
  330. if (!this.source.established) {
  331. if (this.renderer) {
  332. this.renderer.renderProgress(this.source.progress)
  333. }
  334. return
  335. }
  336. if (!this.isPlaying) {
  337. this.isPlaying = true;
  338. this.startTime = JSMpeg.Now() - this.currentTime;
  339. if (this.options.onPlay) {
  340. this.options.onPlay(this)
  341. }
  342. }
  343. if (this.options.streaming) {
  344. this.updateForStreaming()
  345. } else {
  346. this.updateForStaticFile()
  347. }
  348. }
  349. ;
  350. Player.prototype.updateForStreaming = function() {
  351. if (this.video) {
  352. this.video.decode()
  353. }
  354. if (this.audio) {
  355. var decoded = false;
  356. do {
  357. if (this.audioOut.enqueuedTime > this.maxAudioLag) {
  358. this.audioOut.resetEnqueuedTime();
  359. this.audioOut.enabled = false
  360. }
  361. decoded = this.audio.decode()
  362. } while (decoded);this.audioOut.enabled = true
  363. }
  364. }
  365. ;
  366. Player.prototype.nextFrame = function() {
  367. if (this.source.established && this.video) {
  368. return this.video.decode()
  369. }
  370. return false
  371. }
  372. ;
  373. Player.prototype.updateForStaticFile = function() {
  374. var notEnoughData = false
  375. , headroom = 0;
  376. if (this.audio && this.audio.canPlay) {
  377. while (!notEnoughData && this.audio.decodedTime - this.audio.currentTime < .25) {
  378. notEnoughData = !this.audio.decode()
  379. }
  380. if (this.video && this.video.currentTime < this.audio.currentTime) {
  381. notEnoughData = !this.video.decode()
  382. }
  383. headroom = this.demuxer.currentTime - this.audio.currentTime
  384. } else if (this.video) {
  385. var targetTime = JSMpeg.Now() - this.startTime + this.video.startTime
  386. , lateTime = targetTime - this.video.currentTime
  387. , frameTime = 1 / this.video.frameRate;
  388. if (this.video && lateTime > 0) {
  389. if (lateTime > frameTime * 2) {
  390. this.startTime += lateTime
  391. }
  392. notEnoughData = !this.video.decode()
  393. }
  394. headroom = this.demuxer.currentTime - targetTime
  395. }
  396. this.source.resume(headroom);
  397. if (notEnoughData && this.source.completed) {
  398. if (this.loop) {
  399. this.seek(0)
  400. } else {
  401. this.pause();
  402. if (this.options.onEnded) {
  403. this.options.onEnded(this)
  404. }
  405. }
  406. } else if (notEnoughData && this.options.onStalled) {
  407. this.options.onStalled(this)
  408. }
  409. }
  410. ;
  411. return Player
  412. }();
  413. JSMpeg.BitBuffer = function() {
  414. "use strict";
  415. var BitBuffer = function(bufferOrLength, mode) {
  416. if (typeof bufferOrLength === "object") {
  417. this.bytes = bufferOrLength instanceof Uint8Array ? bufferOrLength : new Uint8Array(bufferOrLength);
  418. this.byteLength = this.bytes.length
  419. } else {
  420. this.bytes = new Uint8Array(bufferOrLength || 1024 * 1024);
  421. this.byteLength = 0
  422. }
  423. this.mode = mode || BitBuffer.MODE.EXPAND;
  424. this.index = 0
  425. };
  426. BitBuffer.prototype.resize = function(size) {
  427. var newBytes = new Uint8Array(size);
  428. if (this.byteLength !== 0) {
  429. this.byteLength = Math.min(this.byteLength, size);
  430. newBytes.set(this.bytes, 0, this.byteLength)
  431. }
  432. this.bytes = newBytes;
  433. this.index = Math.min(this.index, this.byteLength << 3)
  434. }
  435. ;
  436. BitBuffer.prototype.evict = function(sizeNeeded) {
  437. var bytePos = this.index >> 3
  438. , available = this.bytes.length - this.byteLength;
  439. if (this.index === this.byteLength << 3 || sizeNeeded > available + bytePos) {
  440. this.byteLength = 0;
  441. this.index = 0;
  442. return
  443. } else if (bytePos === 0) {
  444. return
  445. }
  446. if (this.bytes.copyWithin) {
  447. this.bytes.copyWithin(0, bytePos, this.byteLength)
  448. } else {
  449. this.bytes.set(this.bytes.subarray(bytePos, this.byteLength))
  450. }
  451. this.byteLength = this.byteLength - bytePos;
  452. this.index -= bytePos << 3;
  453. return
  454. }
  455. ;
  456. BitBuffer.prototype.write = function(buffers) {
  457. var isArrayOfBuffers = typeof buffers[0] === "object"
  458. , totalLength = 0
  459. , available = this.bytes.length - this.byteLength;
  460. if (isArrayOfBuffers) {
  461. var totalLength = 0;
  462. for (var i = 0; i < buffers.length; i++) {
  463. totalLength += buffers[i].byteLength
  464. }
  465. } else {
  466. totalLength = buffers.byteLength
  467. }
  468. if (totalLength > available) {
  469. if (this.mode === BitBuffer.MODE.EXPAND) {
  470. var newSize = Math.max(this.bytes.length * 2, totalLength - available);
  471. this.resize(newSize)
  472. } else {
  473. this.evict(totalLength)
  474. }
  475. }
  476. if (isArrayOfBuffers) {
  477. for (var i = 0; i < buffers.length; i++) {
  478. this.appendSingleBuffer(buffers[i])
  479. }
  480. } else {
  481. this.appendSingleBuffer(buffers)
  482. }
  483. return totalLength
  484. }
  485. ;
  486. BitBuffer.prototype.appendSingleBuffer = function(buffer) {
  487. buffer = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
  488. this.bytes.set(buffer, this.byteLength);
  489. this.byteLength += buffer.length
  490. }
  491. ;
  492. BitBuffer.prototype.findNextStartCode = function() {
  493. for (var i = this.index + 7 >> 3; i < this.byteLength; i++) {
  494. if (this.bytes[i] == 0 && this.bytes[i + 1] == 0 && this.bytes[i + 2] == 1) {
  495. this.index = i + 4 << 3;
  496. return this.bytes[i + 3]
  497. }
  498. }
  499. this.index = this.byteLength << 3;
  500. return -1
  501. }
  502. ;
  503. BitBuffer.prototype.findStartCode = function(code) {
  504. var current = 0;
  505. while (true) {
  506. current = this.findNextStartCode();
  507. if (current === code || current === -1) {
  508. return current
  509. }
  510. }
  511. return -1
  512. }
  513. ;
  514. BitBuffer.prototype.nextBytesAreStartCode = function() {
  515. var i = this.index + 7 >> 3;
  516. return i >= this.byteLength || this.bytes[i] == 0 && this.bytes[i + 1] == 0 && this.bytes[i + 2] == 1
  517. }
  518. ;
  519. BitBuffer.prototype.peek = function(count) {
  520. var offset = this.index;
  521. var value = 0;
  522. while (count) {
  523. var currentByte = this.bytes[offset >> 3]
  524. , remaining = 8 - (offset & 7)
  525. , read = remaining < count ? remaining : count
  526. , shift = remaining - read
  527. , mask = 255 >> 8 - read;
  528. value = value << read | (currentByte & mask << shift) >> shift;
  529. offset += read;
  530. count -= read
  531. }
  532. return value
  533. }
  534. ;
  535. BitBuffer.prototype.read = function(count) {
  536. var value = this.peek(count);
  537. this.index += count;
  538. return value
  539. }
  540. ;
  541. BitBuffer.prototype.skip = function(count) {
  542. return this.index += count
  543. }
  544. ;
  545. BitBuffer.prototype.rewind = function(count) {
  546. this.index = Math.max(this.index - count, 0)
  547. }
  548. ;
  549. BitBuffer.prototype.has = function(count) {
  550. return (this.byteLength << 3) - this.index >= count
  551. }
  552. ;
  553. BitBuffer.MODE = {
  554. EVICT: 1,
  555. EXPAND: 2
  556. };
  557. return BitBuffer
  558. }();
  559. JSMpeg.Source.Ajax = function() {
  560. "use strict";
  561. var AjaxSource = function(url, options) {
  562. this.url = url;
  563. this.destination = null;
  564. this.request = null;
  565. this.streaming = false;
  566. this.completed = false;
  567. this.established = false;
  568. this.progress = 0;
  569. this.onEstablishedCallback = options.onSourceEstablished;
  570. this.onCompletedCallback = options.onSourceCompleted
  571. };
  572. AjaxSource.prototype.connect = function(destination) {
  573. this.destination = destination
  574. }
  575. ;
  576. AjaxSource.prototype.start = function() {
  577. this.request = new XMLHttpRequest;
  578. this.request.onreadystatechange = function() {
  579. if (this.request.readyState === this.request.DONE && this.request.status === 200) {
  580. this.onLoad(this.request.response)
  581. }
  582. }
  583. .bind(this);
  584. this.request.onprogress = this.onProgress.bind(this);
  585. this.request.open("GET", this.url);
  586. this.request.responseType = "arraybuffer";
  587. this.request.send()
  588. }
  589. ;
  590. AjaxSource.prototype.resume = function(secondsHeadroom) {}
  591. ;
  592. AjaxSource.prototype.destroy = function() {
  593. this.request.abort()
  594. }
  595. ;
  596. AjaxSource.prototype.onProgress = function(ev) {
  597. this.progress = ev.loaded / ev.total
  598. }
  599. ;
  600. AjaxSource.prototype.onLoad = function(data) {
  601. this.established = true;
  602. this.completed = true;
  603. this.progress = 1;
  604. if (this.onEstablishedCallback) {
  605. this.onEstablishedCallback(this)
  606. }
  607. if (this.onCompletedCallback) {
  608. this.onCompletedCallback(this)
  609. }
  610. if (this.destination) {
  611. this.destination.write(data)
  612. }
  613. }
  614. ;
  615. return AjaxSource
  616. }();
  617. JSMpeg.Source.Fetch = function() {
  618. "use strict";
  619. var FetchSource = function(url, options) {
  620. this.url = url;
  621. this.destination = null;
  622. this.request = null;
  623. this.streaming = true;
  624. this.completed = false;
  625. this.established = false;
  626. this.progress = 0;
  627. this.aborted = false;
  628. this.onEstablishedCallback = options.onSourceEstablished;
  629. this.onCompletedCallback = options.onSourceCompleted
  630. };
  631. FetchSource.prototype.connect = function(destination) {
  632. this.destination = destination
  633. }
  634. ;
  635. FetchSource.prototype.start = function() {
  636. var params = {
  637. method: "GET",
  638. headers: new Headers,
  639. cache: "default"
  640. };
  641. self.fetch(this.url, params).then(function(res) {
  642. if (res.ok && (res.status >= 200 && res.status <= 299)) {
  643. this.progress = 1;
  644. this.established = true;
  645. return this.pump(res.body.getReader())
  646. } else {}
  647. }
  648. .bind(this)).catch(function(err) {
  649. throw err
  650. })
  651. }
  652. ;
  653. FetchSource.prototype.pump = function(reader) {
  654. return reader.read().then(function(result) {
  655. if (result.done) {
  656. this.completed = true
  657. } else {
  658. if (this.aborted) {
  659. return reader.cancel()
  660. }
  661. if (this.destination) {
  662. this.destination.write(result.value.buffer)
  663. }
  664. return this.pump(reader)
  665. }
  666. }
  667. .bind(this)).catch(function(err) {
  668. throw err
  669. })
  670. }
  671. ;
  672. FetchSource.prototype.resume = function(secondsHeadroom) {}
  673. ;
  674. FetchSource.prototype.abort = function() {
  675. this.aborted = true
  676. }
  677. ;
  678. return FetchSource
  679. }();
  680. JSMpeg.Source.AjaxProgressive = function() {
  681. "use strict";
  682. var AjaxProgressiveSource = function(url, options) {
  683. this.url = url;
  684. this.destination = null;
  685. this.request = null;
  686. this.streaming = false;
  687. this.completed = false;
  688. this.established = false;
  689. this.progress = 0;
  690. this.fileSize = 0;
  691. this.loadedSize = 0;
  692. this.chunkSize = options.chunkSize || 1024 * 1024;
  693. this.isLoading = false;
  694. this.loadStartTime = 0;
  695. this.throttled = options.throttled !== false;
  696. this.aborted = false;
  697. this.onEstablishedCallback = options.onSourceEstablished;
  698. this.onCompletedCallback = options.onSourceCompleted
  699. };
  700. AjaxProgressiveSource.prototype.connect = function(destination) {
  701. this.destination = destination
  702. }
  703. ;
  704. AjaxProgressiveSource.prototype.start = function(fileSize) {
  705. this.request = new XMLHttpRequest;
  706. this.request.onreadystatechange = function() {
  707. if (this.request.readyState === this.request.DONE) {
  708. this.fileSize = fileSize;
  709. this.loadNextChunk()
  710. }
  711. }
  712. .bind(this);
  713. this.request.onprogress = this.onProgress.bind(this);
  714. this.request.open("HEAD", this.url);
  715. this.request.send()
  716. }
  717. ;
  718. AjaxProgressiveSource.prototype.resume = function(secondsHeadroom) {
  719. if (this.isLoading || !this.throttled) {
  720. return
  721. }
  722. var worstCaseLoadingTime = this.loadTime * 8 + 2 + 5;
  723. if (worstCaseLoadingTime > secondsHeadroom) {
  724. this.loadNextChunk()
  725. }
  726. }
  727. ;
  728. AjaxProgressiveSource.prototype.destroy = function() {
  729. this.request.abort();
  730. this.aborted = true
  731. }
  732. ;
  733. AjaxProgressiveSource.prototype.loadNextChunk = function() {
  734. var start = this.loadedSize
  735. , end = Math.min(this.loadedSize + this.chunkSize - 1, this.fileSize - 1);
  736. if (start >= this.fileSize || this.aborted) {
  737. this.completed = true;
  738. if (this.onCompletedCallback) {
  739. this.onCompletedCallback(this)
  740. }
  741. return
  742. }
  743. this.isLoading = true;
  744. this.loadStartTime = JSMpeg.Now();
  745. this.request = new XMLHttpRequest;
  746. this.request.onreadystatechange = function() {
  747. if (this.request.readyState === this.request.DONE && this.request.status >= 200 && this.request.status < 300) {
  748. this.onChunkLoad(this.request.response)
  749. } else if (this.request.readyState === this.request.DONE) {
  750. if (this.loadFails++ < 3) {
  751. this.loadNextChunk()
  752. }
  753. }
  754. }
  755. .bind(this);
  756. if (start === 0) {
  757. this.request.onprogress = this.onProgress.bind(this)
  758. }
  759. this.request.open("GET", this.url + "?" + start + "-" + end);
  760. this.request.setRequestHeader("Range", "bytes=" + start + "-" + end);
  761. this.request.responseType = "arraybuffer";
  762. this.request.send()
  763. }
  764. ;
  765. AjaxProgressiveSource.prototype.onProgress = function(ev) {
  766. this.progress = ev.loaded / ev.total
  767. }
  768. ;
  769. AjaxProgressiveSource.prototype.onChunkLoad = function(data) {
  770. var isFirstChunk = !this.established;
  771. this.established = true;
  772. this.progress = 1;
  773. this.loadedSize += data.byteLength;
  774. this.loadFails = 0;
  775. this.isLoading = false;
  776. if (isFirstChunk && this.onEstablishedCallback) {
  777. this.onEstablishedCallback(this)
  778. }
  779. if (this.destination) {
  780. this.destination.write(data)
  781. }
  782. this.loadTime = JSMpeg.Now() - this.loadStartTime;
  783. if (!this.throttled) {
  784. this.loadNextChunk()
  785. }
  786. }
  787. ;
  788. return AjaxProgressiveSource
  789. }();
  790. JSMpeg.Source.WebSocket = function() {
  791. "use strict";
  792. var WSSource = function(url, options) {
  793. this.url = url;
  794. this.options = options;
  795. this.socket = null;
  796. this.streaming = true;
  797. this.callbacks = {
  798. connect: [],
  799. data: []
  800. };
  801. this.destination = null;
  802. this.reconnectInterval = options.reconnectInterval !== undefined ? options.reconnectInterval : 5;
  803. this.shouldAttemptReconnect = !!this.reconnectInterval;
  804. this.completed = false;
  805. this.established = false;
  806. this.progress = 0;
  807. this.reconnectTimeoutId = 0;
  808. this.onEstablishedCallback = options.onSourceEstablished;
  809. this.onCompletedCallback = options.onSourceCompleted
  810. };
  811. WSSource.prototype.connect = function(destination) {
  812. this.destination = destination
  813. }
  814. ;
  815. WSSource.prototype.destroy = function() {
  816. clearTimeout(this.reconnectTimeoutId);
  817. this.shouldAttemptReconnect = false;
  818. this.socket.close()
  819. }
  820. ;
  821. WSSource.prototype.start = function() {
  822. this.shouldAttemptReconnect = !!this.reconnectInterval;
  823. this.progress = 0;
  824. this.established = false;
  825. this.socket = new WebSocket(this.url,this.options.protocols || null);
  826. this.socket.binaryType = "arraybuffer";
  827. this.socket.onmessage = this.onMessage.bind(this);
  828. this.socket.onopen = this.onOpen.bind(this);
  829. this.socket.onerror = this.onClose.bind(this);
  830. this.socket.onclose = this.onClose.bind(this)
  831. }
  832. ;
  833. WSSource.prototype.resume = function(secondsHeadroom) {}
  834. ;
  835. WSSource.prototype.onOpen = function() {
  836. this.progress = 1
  837. }
  838. ;
  839. WSSource.prototype.onClose = function() {
  840. if (this.shouldAttemptReconnect) {
  841. clearTimeout(this.reconnectTimeoutId);
  842. this.reconnectTimeoutId = setTimeout(function() {
  843. this.start()
  844. }
  845. .bind(this), this.reconnectInterval * 1e3)
  846. }
  847. }
  848. ;
  849. WSSource.prototype.onMessage = function(ev) {
  850. var isFirstChunk = !this.established;
  851. this.established = true;
  852. if (isFirstChunk && this.onEstablishedCallback) {
  853. this.onEstablishedCallback(this)
  854. }
  855. if (this.destination) {
  856. this.destination.write(ev.data)
  857. }
  858. }
  859. ;
  860. return WSSource
  861. }();
  862. JSMpeg.Demuxer.TS = function() {
  863. "use strict";
  864. var TS = function(options) {
  865. this.bits = null;
  866. this.leftoverBytes = null;
  867. this.guessVideoFrameEnd = true;
  868. this.pidsToStreamIds = {};
  869. this.pesPacketInfo = {};
  870. this.startTime = 0;
  871. this.currentTime = 0
  872. };
  873. TS.prototype.connect = function(streamId, destination) {
  874. this.pesPacketInfo[streamId] = {
  875. destination: destination,
  876. currentLength: 0,
  877. totalLength: 0,
  878. pts: 0,
  879. buffers: []
  880. }
  881. }
  882. ;
  883. TS.prototype.write = function(buffer) {
  884. if (this.leftoverBytes) {
  885. var totalLength = buffer.byteLength + this.leftoverBytes.byteLength;
  886. this.bits = new JSMpeg.BitBuffer(totalLength);
  887. this.bits.write([this.leftoverBytes, buffer])
  888. } else {
  889. this.bits = new JSMpeg.BitBuffer(buffer)
  890. }
  891. while (this.bits.has(188 << 3) && this.parsePacket()) {}
  892. var leftoverCount = this.bits.byteLength - (this.bits.index >> 3);
  893. this.leftoverBytes = leftoverCount > 0 ? this.bits.bytes.subarray(this.bits.index >> 3) : null
  894. }
  895. ;
  896. TS.prototype.parsePacket = function() {
  897. if (this.bits.read(8) !== 71) {
  898. if (!this.resync()) {
  899. return false
  900. }
  901. }
  902. var end = (this.bits.index >> 3) + 187;
  903. var transportError = this.bits.read(1)
  904. , payloadStart = this.bits.read(1)
  905. , transportPriority = this.bits.read(1)
  906. , pid = this.bits.read(13)
  907. , transportScrambling = this.bits.read(2)
  908. , adaptationField = this.bits.read(2)
  909. , continuityCounter = this.bits.read(4);
  910. var streamId = this.pidsToStreamIds[pid];
  911. if (payloadStart && streamId) {
  912. var pi = this.pesPacketInfo[streamId];
  913. if (pi && pi.currentLength) {
  914. this.packetComplete(pi)
  915. }
  916. }
  917. if (adaptationField & 1) {
  918. if (adaptationField & 2) {
  919. var adaptationFieldLength = this.bits.read(8);
  920. this.bits.skip(adaptationFieldLength << 3)
  921. }
  922. if (payloadStart && this.bits.nextBytesAreStartCode()) {
  923. this.bits.skip(24);
  924. streamId = this.bits.read(8);
  925. this.pidsToStreamIds[pid] = streamId;
  926. var packetLength = this.bits.read(16);
  927. this.bits.skip(8);
  928. var ptsDtsFlag = this.bits.read(2);
  929. this.bits.skip(6);
  930. var headerLength = this.bits.read(8);
  931. var payloadBeginIndex = this.bits.index + (headerLength << 3);
  932. var pi = this.pesPacketInfo[streamId];
  933. if (pi) {
  934. var pts = 0;
  935. if (ptsDtsFlag & 2) {
  936. this.bits.skip(4);
  937. var p32_30 = this.bits.read(3);
  938. this.bits.skip(1);
  939. var p29_15 = this.bits.read(15);
  940. this.bits.skip(1);
  941. var p14_0 = this.bits.read(15);
  942. this.bits.skip(1);
  943. pts = (p32_30 * 1073741824 + p29_15 * 32768 + p14_0) / 9e4;
  944. this.currentTime = pts;
  945. if (this.startTime === -1) {
  946. this.startTime = pts
  947. }
  948. }
  949. var payloadLength = packetLength ? packetLength - headerLength - 3 : 0;
  950. this.packetStart(pi, pts, payloadLength)
  951. }
  952. this.bits.index = payloadBeginIndex
  953. }
  954. if (streamId) {
  955. var pi = this.pesPacketInfo[streamId];
  956. if (pi) {
  957. var start = this.bits.index >> 3;
  958. var complete = this.packetAddData(pi, start, end);
  959. var hasPadding = !payloadStart && adaptationField & 2;
  960. if (complete || this.guessVideoFrameEnd && hasPadding) {
  961. this.packetComplete(pi)
  962. }
  963. }
  964. }
  965. }
  966. this.bits.index = end << 3;
  967. return true
  968. }
  969. ;
  970. TS.prototype.resync = function() {
  971. if (!this.bits.has(188 * 6 << 3)) {
  972. return false
  973. }
  974. var byteIndex = this.bits.index >> 3;
  975. for (var i = 0; i < 187; i++) {
  976. if (this.bits.bytes[byteIndex + i] === 71) {
  977. var foundSync = true;
  978. for (var j = 1; j < 5; j++) {
  979. if (this.bits.bytes[byteIndex + i + 188 * j] !== 71) {
  980. foundSync = false;
  981. break
  982. }
  983. }
  984. if (foundSync) {
  985. this.bits.index = byteIndex + i + 1 << 3;
  986. return true
  987. }
  988. }
  989. }
  990. console.warn("JSMpeg: Possible garbage data. Skipping.");
  991. this.bits.skip(187 << 3);
  992. return false
  993. }
  994. ;
  995. TS.prototype.packetStart = function(pi, pts, payloadLength) {
  996. pi.totalLength = payloadLength;
  997. pi.currentLength = 0;
  998. pi.pts = pts
  999. }
  1000. ;
  1001. TS.prototype.packetAddData = function(pi, start, end) {
  1002. pi.buffers.push(this.bits.bytes.subarray(start, end));
  1003. pi.currentLength += end - start;
  1004. var complete = pi.totalLength !== 0 && pi.currentLength >= pi.totalLength;
  1005. return complete
  1006. }
  1007. ;
  1008. TS.prototype.packetComplete = function(pi) {
  1009. pi.destination.write(pi.pts, pi.buffers);
  1010. pi.totalLength = 0;
  1011. pi.currentLength = 0;
  1012. pi.buffers = []
  1013. }
  1014. ;
  1015. TS.STREAM = {
  1016. PACK_HEADER: 186,
  1017. SYSTEM_HEADER: 187,
  1018. PROGRAM_MAP: 188,
  1019. PRIVATE_1: 189,
  1020. PADDING: 190,
  1021. PRIVATE_2: 191,
  1022. AUDIO_1: 192,
  1023. VIDEO_1: 224,
  1024. DIRECTORY: 255
  1025. };
  1026. return TS
  1027. }();
  1028. JSMpeg.Decoder.Base = function() {
  1029. "use strict";
  1030. var BaseDecoder = function(options) {
  1031. this.destination = null;
  1032. this.canPlay = false;
  1033. this.collectTimestamps = !options.streaming;
  1034. this.bytesWritten = 0;
  1035. this.timestamps = [];
  1036. this.timestampIndex = 0;
  1037. this.startTime = 0;
  1038. this.decodedTime = 0;
  1039. Object.defineProperty(this, "currentTime", {
  1040. get: this.getCurrentTime
  1041. })
  1042. };
  1043. BaseDecoder.prototype.destroy = function() {}
  1044. ;
  1045. BaseDecoder.prototype.connect = function(destination) {
  1046. this.destination = destination
  1047. }
  1048. ;
  1049. BaseDecoder.prototype.bufferGetIndex = function() {
  1050. return this.bits.index
  1051. }
  1052. ;
  1053. BaseDecoder.prototype.bufferSetIndex = function(index) {
  1054. this.bits.index = index
  1055. }
  1056. ;
  1057. BaseDecoder.prototype.bufferWrite = function(buffers) {
  1058. return this.bits.write(buffers)
  1059. }
  1060. ;
  1061. BaseDecoder.prototype.write = function(pts, buffers) {
  1062. if (this.collectTimestamps) {
  1063. if (this.timestamps.length === 0) {
  1064. this.startTime = pts;
  1065. this.decodedTime = pts
  1066. }
  1067. this.timestamps.push({
  1068. index: this.bytesWritten << 3,
  1069. time: pts
  1070. })
  1071. }
  1072. this.bytesWritten += this.bufferWrite(buffers);
  1073. this.canPlay = true
  1074. }
  1075. ;
  1076. BaseDecoder.prototype.seek = function(time) {
  1077. if (!this.collectTimestamps) {
  1078. return
  1079. }
  1080. this.timestampIndex = 0;
  1081. for (var i = 0; i < this.timestamps.length; i++) {
  1082. if (this.timestamps[i].time > time) {
  1083. break
  1084. }
  1085. this.timestampIndex = i
  1086. }
  1087. var ts = this.timestamps[this.timestampIndex];
  1088. if (ts) {
  1089. this.bufferSetIndex(ts.index);
  1090. this.decodedTime = ts.time
  1091. } else {
  1092. this.bufferSetIndex(0);
  1093. this.decodedTime = this.startTime
  1094. }
  1095. }
  1096. ;
  1097. BaseDecoder.prototype.decode = function() {
  1098. this.advanceDecodedTime(0)
  1099. }
  1100. ;
  1101. BaseDecoder.prototype.advanceDecodedTime = function(seconds) {
  1102. if (this.collectTimestamps) {
  1103. var newTimestampIndex = -1;
  1104. var currentIndex = this.bufferGetIndex();
  1105. for (var i = this.timestampIndex; i < this.timestamps.length; i++) {
  1106. if (this.timestamps[i].index > currentIndex) {
  1107. break
  1108. }
  1109. newTimestampIndex = i
  1110. }
  1111. if (newTimestampIndex !== -1 && newTimestampIndex !== this.timestampIndex) {
  1112. this.timestampIndex = newTimestampIndex;
  1113. this.decodedTime = this.timestamps[this.timestampIndex].time;
  1114. return
  1115. }
  1116. }
  1117. this.decodedTime += seconds
  1118. }
  1119. ;
  1120. BaseDecoder.prototype.getCurrentTime = function() {
  1121. return this.decodedTime
  1122. }
  1123. ;
  1124. return BaseDecoder
  1125. }();
  1126. JSMpeg.Decoder.MPEG1Video = function() {
  1127. "use strict";
  1128. var MPEG1 = function(options) {
  1129. JSMpeg.Decoder.Base.call(this, options);
  1130. this.onDecodeCallback = options.onVideoDecode;
  1131. var bufferSize = options.videoBufferSize || 512 * 1024;
  1132. var bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
  1133. this.bits = new JSMpeg.BitBuffer(bufferSize,bufferMode);
  1134. this.customIntraQuantMatrix = new Uint8Array(64);
  1135. this.customNonIntraQuantMatrix = new Uint8Array(64);
  1136. this.blockData = new Int32Array(64);
  1137. this.currentFrame = 0;
  1138. this.decodeFirstFrame = options.decodeFirstFrame !== false
  1139. };
  1140. MPEG1.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
  1141. MPEG1.prototype.constructor = MPEG1;
  1142. MPEG1.prototype.write = function(pts, buffers) {
  1143. JSMpeg.Decoder.Base.prototype.write.call(this, pts, buffers);
  1144. if (!this.hasSequenceHeader) {
  1145. if (this.bits.findStartCode(MPEG1.START.SEQUENCE) === -1) {
  1146. return false
  1147. }
  1148. this.decodeSequenceHeader();
  1149. if (this.decodeFirstFrame) {
  1150. this.decode()
  1151. }
  1152. }
  1153. }
  1154. ;
  1155. MPEG1.prototype.decode = function() {
  1156. var startTime = JSMpeg.Now();
  1157. if (!this.hasSequenceHeader) {
  1158. return false
  1159. }
  1160. if (this.bits.findStartCode(MPEG1.START.PICTURE) === -1) {
  1161. var bufferedBytes = this.bits.byteLength - (this.bits.index >> 3);
  1162. return false
  1163. }
  1164. this.decodePicture();
  1165. this.advanceDecodedTime(1 / this.frameRate);
  1166. var elapsedTime = JSMpeg.Now() - startTime;
  1167. if (this.onDecodeCallback) {
  1168. this.onDecodeCallback(this, elapsedTime)
  1169. }
  1170. return true
  1171. }
  1172. ;
  1173. MPEG1.prototype.readHuffman = function(codeTable) {
  1174. var state = 0;
  1175. do {
  1176. state = codeTable[state + this.bits.read(1)]
  1177. } while (state >= 0 && codeTable[state] !== 0);return codeTable[state + 2]
  1178. }
  1179. ;
  1180. MPEG1.prototype.frameRate = 30;
  1181. MPEG1.prototype.decodeSequenceHeader = function() {
  1182. var newWidth = this.bits.read(12)
  1183. , newHeight = this.bits.read(12);
  1184. this.bits.skip(4);
  1185. this.frameRate = MPEG1.PICTURE_RATE[this.bits.read(4)];
  1186. this.bits.skip(18 + 1 + 10 + 1);
  1187. if (newWidth !== this.width || newHeight !== this.height) {
  1188. this.width = newWidth;
  1189. this.height = newHeight;
  1190. this.initBuffers();
  1191. if (this.destination) {
  1192. this.destination.resize(newWidth, newHeight)
  1193. }
  1194. }
  1195. if (this.bits.read(1)) {
  1196. for (var i = 0; i < 64; i++) {
  1197. this.customIntraQuantMatrix[MPEG1.ZIG_ZAG[i]] = this.bits.read(8)
  1198. }
  1199. this.intraQuantMatrix = this.customIntraQuantMatrix
  1200. }
  1201. if (this.bits.read(1)) {
  1202. for (var i = 0; i < 64; i++) {
  1203. var idx = MPEG1.ZIG_ZAG[i];
  1204. this.customNonIntraQuantMatrix[idx] = this.bits.read(8)
  1205. }
  1206. this.nonIntraQuantMatrix = this.customNonIntraQuantMatrix
  1207. }
  1208. this.hasSequenceHeader = true
  1209. }
  1210. ;
  1211. MPEG1.prototype.initBuffers = function() {
  1212. this.intraQuantMatrix = MPEG1.DEFAULT_INTRA_QUANT_MATRIX;
  1213. this.nonIntraQuantMatrix = MPEG1.DEFAULT_NON_INTRA_QUANT_MATRIX;
  1214. this.mbWidth = this.width + 15 >> 4;
  1215. this.mbHeight = this.height + 15 >> 4;
  1216. this.mbSize = this.mbWidth * this.mbHeight;
  1217. this.codedWidth = this.mbWidth << 4;
  1218. this.codedHeight = this.mbHeight << 4;
  1219. this.codedSize = this.codedWidth * this.codedHeight;
  1220. this.halfWidth = this.mbWidth << 3;
  1221. this.halfHeight = this.mbHeight << 3;
  1222. this.currentY = new Uint8ClampedArray(this.codedSize);
  1223. this.currentY32 = new Uint32Array(this.currentY.buffer);
  1224. this.currentCr = new Uint8ClampedArray(this.codedSize >> 2);
  1225. this.currentCr32 = new Uint32Array(this.currentCr.buffer);
  1226. this.currentCb = new Uint8ClampedArray(this.codedSize >> 2);
  1227. this.currentCb32 = new Uint32Array(this.currentCb.buffer);
  1228. this.forwardY = new Uint8ClampedArray(this.codedSize);
  1229. this.forwardY32 = new Uint32Array(this.forwardY.buffer);
  1230. this.forwardCr = new Uint8ClampedArray(this.codedSize >> 2);
  1231. this.forwardCr32 = new Uint32Array(this.forwardCr.buffer);
  1232. this.forwardCb = new Uint8ClampedArray(this.codedSize >> 2);
  1233. this.forwardCb32 = new Uint32Array(this.forwardCb.buffer)
  1234. }
  1235. ;
  1236. MPEG1.prototype.currentY = null;
  1237. MPEG1.prototype.currentCr = null;
  1238. MPEG1.prototype.currentCb = null;
  1239. MPEG1.prototype.pictureType = 0;
  1240. MPEG1.prototype.forwardY = null;
  1241. MPEG1.prototype.forwardCr = null;
  1242. MPEG1.prototype.forwardCb = null;
  1243. MPEG1.prototype.fullPelForward = false;
  1244. MPEG1.prototype.forwardFCode = 0;
  1245. MPEG1.prototype.forwardRSize = 0;
  1246. MPEG1.prototype.forwardF = 0;
  1247. MPEG1.prototype.decodePicture = function(skipOutput) {
  1248. this.currentFrame++;
  1249. this.bits.skip(10);
  1250. this.pictureType = this.bits.read(3);
  1251. this.bits.skip(16);
  1252. if (this.pictureType <= 0 || this.pictureType >= MPEG1.PICTURE_TYPE.B) {
  1253. return
  1254. }
  1255. if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
  1256. this.fullPelForward = this.bits.read(1);
  1257. this.forwardFCode = this.bits.read(3);
  1258. if (this.forwardFCode === 0) {
  1259. return
  1260. }
  1261. this.forwardRSize = this.forwardFCode - 1;
  1262. this.forwardF = 1 << this.forwardRSize
  1263. }
  1264. var code = 0;
  1265. do {
  1266. code = this.bits.findNextStartCode()
  1267. } while (code === MPEG1.START.EXTENSION || code === MPEG1.START.USER_DATA);while (code >= MPEG1.START.SLICE_FIRST && code <= MPEG1.START.SLICE_LAST) {
  1268. this.decodeSlice(code & 255);
  1269. code = this.bits.findNextStartCode()
  1270. }
  1271. if (code !== -1) {
  1272. this.bits.rewind(32)
  1273. }
  1274. if (this.destination) {
  1275. this.destination.render(this.currentY, this.currentCr, this.currentCb, true)
  1276. }
  1277. if (this.pictureType === MPEG1.PICTURE_TYPE.INTRA || this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
  1278. var tmpY = this.forwardY
  1279. , tmpY32 = this.forwardY32
  1280. , tmpCr = this.forwardCr
  1281. , tmpCr32 = this.forwardCr32
  1282. , tmpCb = this.forwardCb
  1283. , tmpCb32 = this.forwardCb32;
  1284. this.forwardY = this.currentY;
  1285. this.forwardY32 = this.currentY32;
  1286. this.forwardCr = this.currentCr;
  1287. this.forwardCr32 = this.currentCr32;
  1288. this.forwardCb = this.currentCb;
  1289. this.forwardCb32 = this.currentCb32;
  1290. this.currentY = tmpY;
  1291. this.currentY32 = tmpY32;
  1292. this.currentCr = tmpCr;
  1293. this.currentCr32 = tmpCr32;
  1294. this.currentCb = tmpCb;
  1295. this.currentCb32 = tmpCb32
  1296. }
  1297. }
  1298. ;
  1299. MPEG1.prototype.quantizerScale = 0;
  1300. MPEG1.prototype.sliceBegin = false;
  1301. MPEG1.prototype.decodeSlice = function(slice) {
  1302. this.sliceBegin = true;
  1303. this.macroblockAddress = (slice - 1) * this.mbWidth - 1;
  1304. this.motionFwH = this.motionFwHPrev = 0;
  1305. this.motionFwV = this.motionFwVPrev = 0;
  1306. this.dcPredictorY = 128;
  1307. this.dcPredictorCr = 128;
  1308. this.dcPredictorCb = 128;
  1309. this.quantizerScale = this.bits.read(5);
  1310. while (this.bits.read(1)) {
  1311. this.bits.skip(8)
  1312. }
  1313. do {
  1314. this.decodeMacroblock()
  1315. } while (!this.bits.nextBytesAreStartCode())
  1316. }
  1317. ;
  1318. MPEG1.prototype.macroblockAddress = 0;
  1319. MPEG1.prototype.mbRow = 0;
  1320. MPEG1.prototype.mbCol = 0;
  1321. MPEG1.prototype.macroblockType = 0;
  1322. MPEG1.prototype.macroblockIntra = false;
  1323. MPEG1.prototype.macroblockMotFw = false;
  1324. MPEG1.prototype.motionFwH = 0;
  1325. MPEG1.prototype.motionFwV = 0;
  1326. MPEG1.prototype.motionFwHPrev = 0;
  1327. MPEG1.prototype.motionFwVPrev = 0;
  1328. MPEG1.prototype.decodeMacroblock = function() {
  1329. var increment = 0
  1330. , t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT);
  1331. while (t === 34) {
  1332. t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT)
  1333. }
  1334. while (t === 35) {
  1335. increment += 33;
  1336. t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT)
  1337. }
  1338. increment += t;
  1339. if (this.sliceBegin) {
  1340. this.sliceBegin = false;
  1341. this.macroblockAddress += increment
  1342. } else {
  1343. if (this.macroblockAddress + increment >= this.mbSize) {
  1344. return
  1345. }
  1346. if (increment > 1) {
  1347. this.dcPredictorY = 128;
  1348. this.dcPredictorCr = 128;
  1349. this.dcPredictorCb = 128;
  1350. if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
  1351. this.motionFwH = this.motionFwHPrev = 0;
  1352. this.motionFwV = this.motionFwVPrev = 0
  1353. }
  1354. }
  1355. while (increment > 1) {
  1356. this.macroblockAddress++;
  1357. this.mbRow = this.macroblockAddress / this.mbWidth | 0;
  1358. this.mbCol = this.macroblockAddress % this.mbWidth;
  1359. this.copyMacroblock(this.motionFwH, this.motionFwV, this.forwardY, this.forwardCr, this.forwardCb);
  1360. increment--
  1361. }
  1362. this.macroblockAddress++
  1363. }
  1364. this.mbRow = this.macroblockAddress / this.mbWidth | 0;
  1365. this.mbCol = this.macroblockAddress % this.mbWidth;
  1366. var mbTable = MPEG1.MACROBLOCK_TYPE[this.pictureType];
  1367. this.macroblockType = this.readHuffman(mbTable);
  1368. this.macroblockIntra = this.macroblockType & 1;
  1369. this.macroblockMotFw = this.macroblockType & 8;
  1370. if ((this.macroblockType & 16) !== 0) {
  1371. this.quantizerScale = this.bits.read(5)
  1372. }
  1373. if (this.macroblockIntra) {
  1374. this.motionFwH = this.motionFwHPrev = 0;
  1375. this.motionFwV = this.motionFwVPrev = 0
  1376. } else {
  1377. this.dcPredictorY = 128;
  1378. this.dcPredictorCr = 128;
  1379. this.dcPredictorCb = 128;
  1380. this.decodeMotionVectors();
  1381. this.copyMacroblock(this.motionFwH, this.motionFwV, this.forwardY, this.forwardCr, this.forwardCb)
  1382. }
  1383. var cbp = (this.macroblockType & 2) !== 0 ? this.readHuffman(MPEG1.CODE_BLOCK_PATTERN) : this.macroblockIntra ? 63 : 0;
  1384. for (var block = 0, mask = 32; block < 6; block++) {
  1385. if ((cbp & mask) !== 0) {
  1386. this.decodeBlock(block)
  1387. }
  1388. mask >>= 1
  1389. }
  1390. }
  1391. ;
  1392. MPEG1.prototype.decodeMotionVectors = function() {
  1393. var code, d, r = 0;
  1394. if (this.macroblockMotFw) {
  1395. code = this.readHuffman(MPEG1.MOTION);
  1396. if (code !== 0 && this.forwardF !== 1) {
  1397. r = this.bits.read(this.forwardRSize);
  1398. d = (Math.abs(code) - 1 << this.forwardRSize) + r + 1;
  1399. if (code < 0) {
  1400. d = -d
  1401. }
  1402. } else {
  1403. d = code
  1404. }
  1405. this.motionFwHPrev += d;
  1406. if (this.motionFwHPrev > (this.forwardF << 4) - 1) {
  1407. this.motionFwHPrev -= this.forwardF << 5
  1408. } else if (this.motionFwHPrev < -this.forwardF << 4) {
  1409. this.motionFwHPrev += this.forwardF << 5
  1410. }
  1411. this.motionFwH = this.motionFwHPrev;
  1412. if (this.fullPelForward) {
  1413. this.motionFwH <<= 1
  1414. }
  1415. code = this.readHuffman(MPEG1.MOTION);
  1416. if (code !== 0 && this.forwardF !== 1) {
  1417. r = this.bits.read(this.forwardRSize);
  1418. d = (Math.abs(code) - 1 << this.forwardRSize) + r + 1;
  1419. if (code < 0) {
  1420. d = -d
  1421. }
  1422. } else {
  1423. d = code
  1424. }
  1425. this.motionFwVPrev += d;
  1426. if (this.motionFwVPrev > (this.forwardF << 4) - 1) {
  1427. this.motionFwVPrev -= this.forwardF << 5
  1428. } else if (this.motionFwVPrev < -this.forwardF << 4) {
  1429. this.motionFwVPrev += this.forwardF << 5
  1430. }
  1431. this.motionFwV = this.motionFwVPrev;
  1432. if (this.fullPelForward) {
  1433. this.motionFwV <<= 1
  1434. }
  1435. } else if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
  1436. this.motionFwH = this.motionFwHPrev = 0;
  1437. this.motionFwV = this.motionFwVPrev = 0
  1438. }
  1439. }
  1440. ;
  1441. MPEG1.prototype.copyMacroblock = function(motionH, motionV, sY, sCr, sCb) {
  1442. var width, scan, H, V, oddH, oddV, src, dest, last;
  1443. var dY = this.currentY32
  1444. , dCb = this.currentCb32
  1445. , dCr = this.currentCr32;
  1446. width = this.codedWidth;
  1447. scan = width - 16;
  1448. H = motionH >> 1;
  1449. V = motionV >> 1;
  1450. oddH = (motionH & 1) === 1;
  1451. oddV = (motionV & 1) === 1;
  1452. src = ((this.mbRow << 4) + V) * width + (this.mbCol << 4) + H;
  1453. dest = this.mbRow * width + this.mbCol << 2;
  1454. last = dest + (width << 2);
  1455. var x, y1, y2, y;
  1456. if (oddH) {
  1457. if (oddV) {
  1458. while (dest < last) {
  1459. y1 = sY[src] + sY[src + width];
  1460. src++;
  1461. for (x = 0; x < 4; x++) {
  1462. y2 = sY[src] + sY[src + width];
  1463. src++;
  1464. y = y1 + y2 + 2 >> 2 & 255;
  1465. y1 = sY[src] + sY[src + width];
  1466. src++;
  1467. y |= y1 + y2 + 2 << 6 & 65280;
  1468. y2 = sY[src] + sY[src + width];
  1469. src++;
  1470. y |= y1 + y2 + 2 << 14 & 16711680;
  1471. y1 = sY[src] + sY[src + width];
  1472. src++;
  1473. y |= y1 + y2 + 2 << 22 & 4278190080;
  1474. dY[dest++] = y
  1475. }
  1476. dest += scan >> 2;
  1477. src += scan - 1
  1478. }
  1479. } else {
  1480. while (dest < last) {
  1481. y1 = sY[src++];
  1482. for (x = 0; x < 4; x++) {
  1483. y2 = sY[src++];
  1484. y = y1 + y2 + 1 >> 1 & 255;
  1485. y1 = sY[src++];
  1486. y |= y1 + y2 + 1 << 7 & 65280;
  1487. y2 = sY[src++];
  1488. y |= y1 + y2 + 1 << 15 & 16711680;
  1489. y1 = sY[src++];
  1490. y |= y1 + y2 + 1 << 23 & 4278190080;
  1491. dY[dest++] = y
  1492. }
  1493. dest += scan >> 2;
  1494. src += scan - 1
  1495. }
  1496. }
  1497. } else {
  1498. if (oddV) {
  1499. while (dest < last) {
  1500. for (x = 0; x < 4; x++) {
  1501. y = sY[src] + sY[src + width] + 1 >> 1 & 255;
  1502. src++;
  1503. y |= sY[src] + sY[src + width] + 1 << 7 & 65280;
  1504. src++;
  1505. y |= sY[src] + sY[src + width] + 1 << 15 & 16711680;
  1506. src++;
  1507. y |= sY[src] + sY[src + width] + 1 << 23 & 4278190080;
  1508. src++;
  1509. dY[dest++] = y
  1510. }
  1511. dest += scan >> 2;
  1512. src += scan
  1513. }
  1514. } else {
  1515. while (dest < last) {
  1516. for (x = 0; x < 4; x++) {
  1517. y = sY[src];
  1518. src++;
  1519. y |= sY[src] << 8;
  1520. src++;
  1521. y |= sY[src] << 16;
  1522. src++;
  1523. y |= sY[src] << 24;
  1524. src++;
  1525. dY[dest++] = y
  1526. }
  1527. dest += scan >> 2;
  1528. src += scan
  1529. }
  1530. }
  1531. }
  1532. width = this.halfWidth;
  1533. scan = width - 8;
  1534. H = motionH / 2 >> 1;
  1535. V = motionV / 2 >> 1;
  1536. oddH = (motionH / 2 & 1) === 1;
  1537. oddV = (motionV / 2 & 1) === 1;
  1538. src = ((this.mbRow << 3) + V) * width + (this.mbCol << 3) + H;
  1539. dest = this.mbRow * width + this.mbCol << 1;
  1540. last = dest + (width << 1);
  1541. var cr1, cr2, cr, cb1, cb2, cb;
  1542. if (oddH) {
  1543. if (oddV) {
  1544. while (dest < last) {
  1545. cr1 = sCr[src] + sCr[src + width];
  1546. cb1 = sCb[src] + sCb[src + width];
  1547. src++;
  1548. for (x = 0; x < 2; x++) {
  1549. cr2 = sCr[src] + sCr[src + width];
  1550. cb2 = sCb[src] + sCb[src + width];
  1551. src++;
  1552. cr = cr1 + cr2 + 2 >> 2 & 255;
  1553. cb = cb1 + cb2 + 2 >> 2 & 255;
  1554. cr1 = sCr[src] + sCr[src + width];
  1555. cb1 = sCb[src] + sCb[src + width];
  1556. src++;
  1557. cr |= cr1 + cr2 + 2 << 6 & 65280;
  1558. cb |= cb1 + cb2 + 2 << 6 & 65280;
  1559. cr2 = sCr[src] + sCr[src + width];
  1560. cb2 = sCb[src] + sCb[src + width];
  1561. src++;
  1562. cr |= cr1 + cr2 + 2 << 14 & 16711680;
  1563. cb |= cb1 + cb2 + 2 << 14 & 16711680;
  1564. cr1 = sCr[src] + sCr[src + width];
  1565. cb1 = sCb[src] + sCb[src + width];
  1566. src++;
  1567. cr |= cr1 + cr2 + 2 << 22 & 4278190080;
  1568. cb |= cb1 + cb2 + 2 << 22 & 4278190080;
  1569. dCr[dest] = cr;
  1570. dCb[dest] = cb;
  1571. dest++
  1572. }
  1573. dest += scan >> 2;
  1574. src += scan - 1
  1575. }
  1576. } else {
  1577. while (dest < last) {
  1578. cr1 = sCr[src];
  1579. cb1 = sCb[src];
  1580. src++;
  1581. for (x = 0; x < 2; x++) {
  1582. cr2 = sCr[src];
  1583. cb2 = sCb[src++];
  1584. cr = cr1 + cr2 + 1 >> 1 & 255;
  1585. cb = cb1 + cb2 + 1 >> 1 & 255;
  1586. cr1 = sCr[src];
  1587. cb1 = sCb[src++];
  1588. cr |= cr1 + cr2 + 1 << 7 & 65280;
  1589. cb |= cb1 + cb2 + 1 << 7 & 65280;
  1590. cr2 = sCr[src];
  1591. cb2 = sCb[src++];
  1592. cr |= cr1 + cr2 + 1 << 15 & 16711680;
  1593. cb |= cb1 + cb2 + 1 << 15 & 16711680;
  1594. cr1 = sCr[src];
  1595. cb1 = sCb[src++];
  1596. cr |= cr1 + cr2 + 1 << 23 & 4278190080;
  1597. cb |= cb1 + cb2 + 1 << 23 & 4278190080;
  1598. dCr[dest] = cr;
  1599. dCb[dest] = cb;
  1600. dest++
  1601. }
  1602. dest += scan >> 2;
  1603. src += scan - 1
  1604. }
  1605. }
  1606. } else {
  1607. if (oddV) {
  1608. while (dest < last) {
  1609. for (x = 0; x < 2; x++) {
  1610. cr = sCr[src] + sCr[src + width] + 1 >> 1 & 255;
  1611. cb = sCb[src] + sCb[src + width] + 1 >> 1 & 255;
  1612. src++;
  1613. cr |= sCr[src] + sCr[src + width] + 1 << 7 & 65280;
  1614. cb |= sCb[src] + sCb[src + width] + 1 << 7 & 65280;
  1615. src++;
  1616. cr |= sCr[src] + sCr[src + width] + 1 << 15 & 16711680;
  1617. cb |= sCb[src] + sCb[src + width] + 1 << 15 & 16711680;
  1618. src++;
  1619. cr |= sCr[src] + sCr[src + width] + 1 << 23 & 4278190080;
  1620. cb |= sCb[src] + sCb[src + width] + 1 << 23 & 4278190080;
  1621. src++;
  1622. dCr[dest] = cr;
  1623. dCb[dest] = cb;
  1624. dest++
  1625. }
  1626. dest += scan >> 2;
  1627. src += scan
  1628. }
  1629. } else {
  1630. while (dest < last) {
  1631. for (x = 0; x < 2; x++) {
  1632. cr = sCr[src];
  1633. cb = sCb[src];
  1634. src++;
  1635. cr |= sCr[src] << 8;
  1636. cb |= sCb[src] << 8;
  1637. src++;
  1638. cr |= sCr[src] << 16;
  1639. cb |= sCb[src] << 16;
  1640. src++;
  1641. cr |= sCr[src] << 24;
  1642. cb |= sCb[src] << 24;
  1643. src++;
  1644. dCr[dest] = cr;
  1645. dCb[dest] = cb;
  1646. dest++
  1647. }
  1648. dest += scan >> 2;
  1649. src += scan
  1650. }
  1651. }
  1652. }
  1653. }
  1654. ;
  1655. MPEG1.prototype.dcPredictorY = 0;
  1656. MPEG1.prototype.dcPredictorCr = 0;
  1657. MPEG1.prototype.dcPredictorCb = 0;
  1658. MPEG1.prototype.blockData = null;
  1659. MPEG1.prototype.decodeBlock = function(block) {
  1660. var n = 0, quantMatrix;
  1661. if (this.macroblockIntra) {
  1662. var predictor, dctSize;
  1663. if (block < 4) {
  1664. predictor = this.dcPredictorY;
  1665. dctSize = this.readHuffman(MPEG1.DCT_DC_SIZE_LUMINANCE)
  1666. } else {
  1667. predictor = block === 4 ? this.dcPredictorCr : this.dcPredictorCb;
  1668. dctSize = this.readHuffman(MPEG1.DCT_DC_SIZE_CHROMINANCE)
  1669. }
  1670. if (dctSize > 0) {
  1671. var differential = this.bits.read(dctSize);
  1672. if ((differential & 1 << dctSize - 1) !== 0) {
  1673. this.blockData[0] = predictor + differential
  1674. } else {
  1675. this.blockData[0] = predictor + (-1 << dctSize | differential + 1)
  1676. }
  1677. } else {
  1678. this.blockData[0] = predictor
  1679. }
  1680. if (block < 4) {
  1681. this.dcPredictorY = this.blockData[0]
  1682. } else if (block === 4) {
  1683. this.dcPredictorCr = this.blockData[0]
  1684. } else {
  1685. this.dcPredictorCb = this.blockData[0]
  1686. }
  1687. this.blockData[0] <<= 3 + 5;
  1688. quantMatrix = this.intraQuantMatrix;
  1689. n = 1
  1690. } else {
  1691. quantMatrix = this.nonIntraQuantMatrix
  1692. }
  1693. var level = 0;
  1694. while (true) {
  1695. var run = 0
  1696. , coeff = this.readHuffman(MPEG1.DCT_COEFF);
  1697. if (coeff === 1 && n > 0 && this.bits.read(1) === 0) {
  1698. break
  1699. }
  1700. if (coeff === 65535) {
  1701. run = this.bits.read(6);
  1702. level = this.bits.read(8);
  1703. if (level === 0) {
  1704. level = this.bits.read(8)
  1705. } else if (level === 128) {
  1706. level = this.bits.read(8) - 256
  1707. } else if (level > 128) {
  1708. level = level - 256
  1709. }
  1710. } else {
  1711. run = coeff >> 8;
  1712. level = coeff & 255;
  1713. if (this.bits.read(1)) {
  1714. level = -level
  1715. }
  1716. }
  1717. n += run;
  1718. var dezigZagged = MPEG1.ZIG_ZAG[n];
  1719. n++;
  1720. level <<= 1;
  1721. if (!this.macroblockIntra) {
  1722. level += level < 0 ? -1 : 1
  1723. }
  1724. level = level * this.quantizerScale * quantMatrix[dezigZagged] >> 4;
  1725. if ((level & 1) === 0) {
  1726. level -= level > 0 ? 1 : -1
  1727. }
  1728. if (level > 2047) {
  1729. level = 2047
  1730. } else if (level < -2048) {
  1731. level = -2048
  1732. }
  1733. this.blockData[dezigZagged] = level * MPEG1.PREMULTIPLIER_MATRIX[dezigZagged]
  1734. }
  1735. var destArray, destIndex, scan;
  1736. if (block < 4) {
  1737. destArray = this.currentY;
  1738. scan = this.codedWidth - 8;
  1739. destIndex = this.mbRow * this.codedWidth + this.mbCol << 4;
  1740. if ((block & 1) !== 0) {
  1741. destIndex += 8
  1742. }
  1743. if ((block & 2) !== 0) {
  1744. destIndex += this.codedWidth << 3
  1745. }
  1746. } else {
  1747. destArray = block === 4 ? this.currentCb : this.currentCr;
  1748. scan = (this.codedWidth >> 1) - 8;
  1749. destIndex = (this.mbRow * this.codedWidth << 2) + (this.mbCol << 3)
  1750. }
  1751. if (this.macroblockIntra) {
  1752. if (n === 1) {
  1753. MPEG1.CopyValueToDestination(this.blockData[0] + 128 >> 8, destArray, destIndex, scan);
  1754. this.blockData[0] = 0
  1755. } else {
  1756. MPEG1.IDCT(this.blockData);
  1757. MPEG1.CopyBlockToDestination(this.blockData, destArray, destIndex, scan);
  1758. JSMpeg.Fill(this.blockData, 0)
  1759. }
  1760. } else {
  1761. if (n === 1) {
  1762. MPEG1.AddValueToDestination(this.blockData[0] + 128 >> 8, destArray, destIndex, scan);
  1763. this.blockData[0] = 0
  1764. } else {
  1765. MPEG1.IDCT(this.blockData);
  1766. MPEG1.AddBlockToDestination(this.blockData, destArray, destIndex, scan);
  1767. JSMpeg.Fill(this.blockData, 0)
  1768. }
  1769. }
  1770. n = 0
  1771. }
  1772. ;
  1773. MPEG1.CopyBlockToDestination = function(block, dest, index, scan) {
  1774. for (var n = 0; n < 64; n += 8,
  1775. index += scan + 8) {
  1776. dest[index + 0] = block[n + 0];
  1777. dest[index + 1] = block[n + 1];
  1778. dest[index + 2] = block[n + 2];
  1779. dest[index + 3] = block[n + 3];
  1780. dest[index + 4] = block[n + 4];
  1781. dest[index + 5] = block[n + 5];
  1782. dest[index + 6] = block[n + 6];
  1783. dest[index + 7] = block[n + 7]
  1784. }
  1785. }
  1786. ;
  1787. MPEG1.AddBlockToDestination = function(block, dest, index, scan) {
  1788. for (var n = 0; n < 64; n += 8,
  1789. index += scan + 8) {
  1790. dest[index + 0] += block[n + 0];
  1791. dest[index + 1] += block[n + 1];
  1792. dest[index + 2] += block[n + 2];
  1793. dest[index + 3] += block[n + 3];
  1794. dest[index + 4] += block[n + 4];
  1795. dest[index + 5] += block[n + 5];
  1796. dest[index + 6] += block[n + 6];
  1797. dest[index + 7] += block[n + 7]
  1798. }
  1799. }
  1800. ;
  1801. MPEG1.CopyValueToDestination = function(value, dest, index, scan) {
  1802. for (var n = 0; n < 64; n += 8,
  1803. index += scan + 8) {
  1804. dest[index + 0] = value;
  1805. dest[index + 1] = value;
  1806. dest[index + 2] = value;
  1807. dest[index + 3] = value;
  1808. dest[index + 4] = value;
  1809. dest[index + 5] = value;
  1810. dest[index + 6] = value;
  1811. dest[index + 7] = value
  1812. }
  1813. }
  1814. ;
  1815. MPEG1.AddValueToDestination = function(value, dest, index, scan) {
  1816. for (var n = 0; n < 64; n += 8,
  1817. index += scan + 8) {
  1818. dest[index + 0] += value;
  1819. dest[index + 1] += value;
  1820. dest[index + 2] += value;
  1821. dest[index + 3] += value;
  1822. dest[index + 4] += value;
  1823. dest[index + 5] += value;
  1824. dest[index + 6] += value;
  1825. dest[index + 7] += value
  1826. }
  1827. }
  1828. ;
  1829. MPEG1.IDCT = function(block) {
  1830. var b1, b3, b4, b6, b7, tmp1, tmp2, m0, x0, x1, x2, x3, x4, y3, y4, y5, y6, y7;
  1831. for (var i = 0; i < 8; ++i) {
  1832. b1 = block[4 * 8 + i];
  1833. b3 = block[2 * 8 + i] + block[6 * 8 + i];
  1834. b4 = block[5 * 8 + i] - block[3 * 8 + i];
  1835. tmp1 = block[1 * 8 + i] + block[7 * 8 + i];
  1836. tmp2 = block[3 * 8 + i] + block[5 * 8 + i];
  1837. b6 = block[1 * 8 + i] - block[7 * 8 + i];
  1838. b7 = tmp1 + tmp2;
  1839. m0 = block[0 * 8 + i];
  1840. x4 = (b6 * 473 - b4 * 196 + 128 >> 8) - b7;
  1841. x0 = x4 - ((tmp1 - tmp2) * 362 + 128 >> 8);
  1842. x1 = m0 - b1;
  1843. x2 = ((block[2 * 8 + i] - block[6 * 8 + i]) * 362 + 128 >> 8) - b3;
  1844. x3 = m0 + b1;
  1845. y3 = x1 + x2;
  1846. y4 = x3 + b3;
  1847. y5 = x1 - x2;
  1848. y6 = x3 - b3;
  1849. y7 = -x0 - (b4 * 473 + b6 * 196 + 128 >> 8);
  1850. block[0 * 8 + i] = b7 + y4;
  1851. block[1 * 8 + i] = x4 + y3;
  1852. block[2 * 8 + i] = y5 - x0;
  1853. block[3 * 8 + i] = y6 - y7;
  1854. block[4 * 8 + i] = y6 + y7;
  1855. block[5 * 8 + i] = x0 + y5;
  1856. block[6 * 8 + i] = y3 - x4;
  1857. block[7 * 8 + i] = y4 - b7
  1858. }
  1859. for (var i = 0; i < 64; i += 8) {
  1860. b1 = block[4 + i];
  1861. b3 = block[2 + i] + block[6 + i];
  1862. b4 = block[5 + i] - block[3 + i];
  1863. tmp1 = block[1 + i] + block[7 + i];
  1864. tmp2 = block[3 + i] + block[5 + i];
  1865. b6 = block[1 + i] - block[7 + i];
  1866. b7 = tmp1 + tmp2;
  1867. m0 = block[0 + i];
  1868. x4 = (b6 * 473 - b4 * 196 + 128 >> 8) - b7;
  1869. x0 = x4 - ((tmp1 - tmp2) * 362 + 128 >> 8);
  1870. x1 = m0 - b1;
  1871. x2 = ((block[2 + i] - block[6 + i]) * 362 + 128 >> 8) - b3;
  1872. x3 = m0 + b1;
  1873. y3 = x1 + x2;
  1874. y4 = x3 + b3;
  1875. y5 = x1 - x2;
  1876. y6 = x3 - b3;
  1877. y7 = -x0 - (b4 * 473 + b6 * 196 + 128 >> 8);
  1878. block[0 + i] = b7 + y4 + 128 >> 8;
  1879. block[1 + i] = x4 + y3 + 128 >> 8;
  1880. block[2 + i] = y5 - x0 + 128 >> 8;
  1881. block[3 + i] = y6 - y7 + 128 >> 8;
  1882. block[4 + i] = y6 + y7 + 128 >> 8;
  1883. block[5 + i] = x0 + y5 + 128 >> 8;
  1884. block[6 + i] = y3 - x4 + 128 >> 8;
  1885. block[7 + i] = y4 - b7 + 128 >> 8
  1886. }
  1887. }
  1888. ;
  1889. MPEG1.PICTURE_RATE = [0, 23.976, 24, 25, 29.97, 30, 50, 59.94, 60, 0, 0, 0, 0, 0, 0, 0];
  1890. MPEG1.ZIG_ZAG = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
  1891. MPEG1.DEFAULT_INTRA_QUANT_MATRIX = new Uint8Array([8, 16, 19, 22, 26, 27, 29, 34, 16, 16, 22, 24, 27, 29, 34, 37, 19, 22, 26, 27, 29, 34, 34, 38, 22, 22, 26, 27, 29, 34, 37, 40, 22, 26, 27, 29, 32, 35, 40, 48, 26, 27, 29, 32, 35, 40, 48, 58, 26, 27, 29, 34, 38, 46, 56, 69, 27, 29, 35, 38, 46, 56, 69, 83]);
  1892. MPEG1.DEFAULT_NON_INTRA_QUANT_MATRIX = new Uint8Array([16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]);
  1893. MPEG1.PREMULTIPLIER_MATRIX = new Uint8Array([32, 44, 42, 38, 32, 25, 17, 9, 44, 62, 58, 52, 44, 35, 24, 12, 42, 58, 55, 49, 42, 33, 23, 12, 38, 52, 49, 44, 38, 30, 20, 10, 32, 44, 42, 38, 32, 25, 17, 9, 25, 35, 33, 30, 25, 20, 14, 7, 17, 24, 23, 20, 17, 14, 9, 5, 9, 12, 12, 10, 9, 7, 5, 2]);
  1894. MPEG1.MACROBLOCK_ADDRESS_INCREMENT = new Int16Array([1 * 3, 2 * 3, 0, 3 * 3, 4 * 3, 0, 0, 0, 1, 5 * 3, 6 * 3, 0, 7 * 3, 8 * 3, 0, 9 * 3, 10 * 3, 0, 11 * 3, 12 * 3, 0, 0, 0, 3, 0, 0, 2, 13 * 3, 14 * 3, 0, 15 * 3, 16 * 3, 0, 0, 0, 5, 0, 0, 4, 17 * 3, 18 * 3, 0, 19 * 3, 20 * 3, 0, 0, 0, 7, 0, 0, 6, 21 * 3, 22 * 3, 0, 23 * 3, 24 * 3, 0, 25 * 3, 26 * 3, 0, 27 * 3, 28 * 3, 0, -1, 29 * 3, 0, -1, 30 * 3, 0, 31 * 3, 32 * 3, 0, 33 * 3, 34 * 3, 0, 35 * 3, 36 * 3, 0, 37 * 3, 38 * 3, 0, 0, 0, 9, 0, 0, 8, 39 * 3, 40 * 3, 0, 41 * 3, 42 * 3, 0, 43 * 3, 44 * 3, 0, 45 * 3, 46 * 3, 0, 0, 0, 15, 0, 0, 14, 0, 0, 13, 0, 0, 12, 0, 0, 11, 0, 0, 10, 47 * 3, -1, 0, -1, 48 * 3, 0, 49 * 3, 50 * 3, 0, 51 * 3, 52 * 3, 0, 53 * 3, 54 * 3, 0, 55 * 3, 56 * 3, 0, 57 * 3, 58 * 3, 0, 59 * 3, 60 * 3, 0, 61 * 3, -1, 0, -1, 62 * 3, 0, 63 * 3, 64 * 3, 0, 65 * 3, 66 * 3, 0, 67 * 3, 68 * 3, 0, 69 * 3, 70 * 3, 0, 71 * 3, 72 * 3, 0, 73 * 3, 74 * 3, 0, 0, 0, 21, 0, 0, 20, 0, 0, 19, 0, 0, 18, 0, 0, 17, 0, 0, 16, 0, 0, 35, 0, 0, 34, 0, 0, 33, 0, 0, 32, 0, 0, 31, 0, 0, 30, 0, 0, 29, 0, 0, 28, 0, 0, 27, 0, 0, 26, 0, 0, 25, 0, 0, 24, 0, 0, 23, 0, 0, 22]);
  1895. MPEG1.MACROBLOCK_TYPE_INTRA = new Int8Array([1 * 3, 2 * 3, 0, -1, 3 * 3, 0, 0, 0, 1, 0, 0, 17]);
  1896. MPEG1.MACROBLOCK_TYPE_PREDICTIVE = new Int8Array([1 * 3, 2 * 3, 0, 3 * 3, 4 * 3, 0, 0, 0, 10, 5 * 3, 6 * 3, 0, 0, 0, 2, 7 * 3, 8 * 3, 0, 0, 0, 8, 9 * 3, 10 * 3, 0, 11 * 3, 12 * 3, 0, -1, 13 * 3, 0, 0, 0, 18, 0, 0, 26, 0, 0, 1, 0, 0, 17]);
  1897. MPEG1.MACROBLOCK_TYPE_B = new Int8Array([1 * 3, 2 * 3, 0, 3 * 3, 5 * 3, 0, 4 * 3, 6 * 3, 0, 8 * 3, 7 * 3, 0, 0, 0, 12, 9 * 3, 10 * 3, 0, 0, 0, 14, 13 * 3, 14 * 3, 0, 12 * 3, 11 * 3, 0, 0, 0, 4, 0, 0, 6, 18 * 3, 16 * 3, 0, 15 * 3, 17 * 3, 0, 0, 0, 8, 0, 0, 10, -1, 19 * 3, 0, 0, 0, 1, 20 * 3, 21 * 3, 0, 0, 0, 30, 0, 0, 17, 0, 0, 22, 0, 0, 26]);
  1898. MPEG1.MACROBLOCK_TYPE = [null, MPEG1.MACROBLOCK_TYPE_INTRA, MPEG1.MACROBLOCK_TYPE_PREDICTIVE, MPEG1.MACROBLOCK_TYPE_B];
  1899. MPEG1.CODE_BLOCK_PATTERN = new Int16Array([2 * 3, 1 * 3, 0, 3 * 3, 6 * 3, 0, 4 * 3, 5 * 3, 0, 8 * 3, 11 * 3, 0, 12 * 3, 13 * 3, 0, 9 * 3, 7 * 3, 0, 10 * 3, 14 * 3, 0, 20 * 3, 19 * 3, 0, 18 * 3, 16 * 3, 0, 23 * 3, 17 * 3, 0, 27 * 3, 25 * 3, 0, 21 * 3, 28 * 3, 0, 15 * 3, 22 * 3, 0, 24 * 3, 26 * 3, 0, 0, 0, 60, 35 * 3, 40 * 3, 0, 44 * 3, 48 * 3, 0, 38 * 3, 36 * 3, 0, 42 * 3, 47 * 3, 0, 29 * 3, 31 * 3, 0, 39 * 3, 32 * 3, 0, 0, 0, 32, 45 * 3, 46 * 3, 0, 33 * 3, 41 * 3, 0, 43 * 3, 34 * 3, 0, 0, 0, 4, 30 * 3, 37 * 3, 0, 0, 0, 8, 0, 0, 16, 0, 0, 44, 50 * 3, 56 * 3, 0, 0, 0, 28, 0, 0, 52, 0, 0, 62, 61 * 3, 59 * 3, 0, 52 * 3, 60 * 3, 0, 0, 0, 1, 55 * 3, 54 * 3, 0, 0, 0, 61, 0, 0, 56, 57 * 3, 58 * 3, 0, 0, 0, 2, 0, 0, 40, 51 * 3, 62 * 3, 0, 0, 0, 48, 64 * 3, 63 * 3, 0, 49 * 3, 53 * 3, 0, 0, 0, 20, 0, 0, 12, 80 * 3, 83 * 3, 0, 0, 0, 63, 77 * 3, 75 * 3, 0, 65 * 3, 73 * 3, 0, 84 * 3, 66 * 3, 0, 0, 0, 24, 0, 0, 36, 0, 0, 3, 69 * 3, 87 * 3, 0, 81 * 3, 79 * 3, 0, 68 * 3, 71 * 3, 0, 70 * 3, 78 * 3, 0, 67 * 3, 76 * 3, 0, 72 * 3, 74 * 3, 0, 86 * 3, 85 * 3, 0, 88 * 3, 82 * 3, 0, -1, 94 * 3, 0, 95 * 3, 97 * 3, 0, 0, 0, 33, 0, 0, 9, 106 * 3, 110 * 3, 0, 102 * 3, 116 * 3, 0, 0, 0, 5, 0, 0, 10, 93 * 3, 89 * 3, 0, 0, 0, 6, 0, 0, 18, 0, 0, 17, 0, 0, 34, 113 * 3, 119 * 3, 0, 103 * 3, 104 * 3, 0, 90 * 3, 92 * 3, 0, 109 * 3, 107 * 3, 0, 117 * 3, 118 * 3, 0, 101 * 3, 99 * 3, 0, 98 * 3, 96 * 3, 0, 100 * 3, 91 * 3, 0, 114 * 3, 115 * 3, 0, 105 * 3, 108 * 3, 0, 112 * 3, 111 * 3, 0, 121 * 3, 125 * 3, 0, 0, 0, 41, 0, 0, 14, 0, 0, 21, 124 * 3, 122 * 3, 0, 120 * 3, 123 * 3, 0, 0, 0, 11, 0, 0, 19, 0, 0, 7, 0, 0, 35, 0, 0, 13, 0, 0, 50, 0, 0, 49, 0, 0, 58, 0, 0, 37, 0, 0, 25, 0, 0, 45, 0, 0, 57, 0, 0, 26, 0, 0, 29, 0, 0, 38, 0, 0, 53, 0, 0, 23, 0, 0, 43, 0, 0, 46, 0, 0, 42, 0, 0, 22, 0, 0, 54, 0, 0, 51, 0, 0, 15, 0, 0, 30, 0, 0, 39, 0, 0, 47, 0, 0, 55, 0, 0, 27, 0, 0, 59, 0, 0, 31]);
  1900. MPEG1.MOTION = new Int16Array([1 * 3, 2 * 3, 0, 4 * 3, 3 * 3, 0, 0, 0, 0, 6 * 3, 5 * 3, 0, 8 * 3, 7 * 3, 0, 0, 0, -1, 0, 0, 1, 9 * 3, 10 * 3, 0, 12 * 3, 11 * 3, 0, 0, 0, 2, 0, 0, -2, 14 * 3, 15 * 3, 0, 16 * 3, 13 * 3, 0, 20 * 3, 18 * 3, 0, 0, 0, 3, 0, 0, -3, 17 * 3, 19 * 3, 0, -1, 23 * 3, 0, 27 * 3, 25 * 3, 0, 26 * 3, 21 * 3, 0, 24 * 3, 22 * 3, 0, 32 * 3, 28 * 3, 0, 29 * 3, 31 * 3, 0, -1, 33 * 3, 0, 36 * 3, 35 * 3, 0, 0, 0, -4, 30 * 3, 34 * 3, 0, 0, 0, 4, 0, 0, -7, 0, 0, 5, 37 * 3, 41 * 3, 0, 0, 0, -5, 0, 0, 7, 38 * 3, 40 * 3, 0, 42 * 3, 39 * 3, 0, 0, 0, -6, 0, 0, 6, 51 * 3, 54 * 3, 0, 50 * 3, 49 * 3, 0, 45 * 3, 46 * 3, 0, 52 * 3, 47 * 3, 0, 43 * 3, 53 * 3, 0, 44 * 3, 48 * 3, 0, 0, 0, 10, 0, 0, 9, 0, 0, 8, 0, 0, -8, 57 * 3, 66 * 3, 0, 0, 0, -9, 60 * 3, 64 * 3, 0, 56 * 3, 61 * 3, 0, 55 * 3, 62 * 3, 0, 58 * 3, 63 * 3, 0, 0, 0, -10, 59 * 3, 65 * 3, 0, 0, 0, 12, 0, 0, 16, 0, 0, 13, 0, 0, 14, 0, 0, 11, 0, 0, 15, 0, 0, -16, 0, 0, -12, 0, 0, -14, 0, 0, -15, 0, 0, -11, 0, 0, -13]);
  1901. MPEG1.DCT_DC_SIZE_LUMINANCE = new Int8Array([2 * 3, 1 * 3, 0, 6 * 3, 5 * 3, 0, 3 * 3, 4 * 3, 0, 0, 0, 1, 0, 0, 2, 9 * 3, 8 * 3, 0, 7 * 3, 10 * 3, 0, 0, 0, 0, 12 * 3, 11 * 3, 0, 0, 0, 4, 0, 0, 3, 13 * 3, 14 * 3, 0, 0, 0, 5, 0, 0, 6, 16 * 3, 15 * 3, 0, 17 * 3, -1, 0, 0, 0, 7, 0, 0, 8]);
  1902. MPEG1.DCT_DC_SIZE_CHROMINANCE = new Int8Array([2 * 3, 1 * 3, 0, 4 * 3, 3 * 3, 0, 6 * 3, 5 * 3, 0, 8 * 3, 7 * 3, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 10 * 3, 9 * 3, 0, 0, 0, 3, 12 * 3, 11 * 3, 0, 0, 0, 4, 14 * 3, 13 * 3, 0, 0, 0, 5, 16 * 3, 15 * 3, 0, 0, 0, 6, 17 * 3, -1, 0, 0, 0, 7, 0, 0, 8]);
  1903. MPEG1.DCT_COEFF = new Int32Array([1 * 3, 2 * 3, 0, 4 * 3, 3 * 3, 0, 0, 0, 1, 7 * 3, 8 * 3, 0, 6 * 3, 5 * 3, 0, 13 * 3, 9 * 3, 0, 11 * 3, 10 * 3, 0, 14 * 3, 12 * 3, 0, 0, 0, 257, 20 * 3, 22 * 3, 0, 18 * 3, 21 * 3, 0, 16 * 3, 19 * 3, 0, 0, 0, 513, 17 * 3, 15 * 3, 0, 0, 0, 2, 0, 0, 3, 27 * 3, 25 * 3, 0, 29 * 3, 31 * 3, 0, 24 * 3, 26 * 3, 0, 32 * 3, 30 * 3, 0, 0, 0, 1025, 23 * 3, 28 * 3, 0, 0, 0, 769, 0, 0, 258, 0, 0, 1793, 0, 0, 65535, 0, 0, 1537, 37 * 3, 36 * 3, 0, 0, 0, 1281, 35 * 3, 34 * 3, 0, 39 * 3, 38 * 3, 0, 33 * 3, 42 * 3, 0, 40 * 3, 41 * 3, 0, 52 * 3, 50 * 3, 0, 54 * 3, 53 * 3, 0, 48 * 3, 49 * 3, 0, 43 * 3, 45 * 3, 0, 46 * 3, 44 * 3, 0, 0, 0, 2049, 0, 0, 4, 0, 0, 514, 0, 0, 2305, 51 * 3, 47 * 3, 0, 55 * 3, 57 * 3, 0, 60 * 3, 56 * 3, 0, 59 * 3, 58 * 3, 0, 61 * 3, 62 * 3, 0, 0, 0, 2561, 0, 0, 3329, 0, 0, 6, 0, 0, 259, 0, 0, 5, 0, 0, 770, 0, 0, 2817, 0, 0, 3073, 76 * 3, 75 * 3, 0, 67 * 3, 70 * 3, 0, 73 * 3, 71 * 3, 0, 78 * 3, 74 * 3, 0, 72 * 3, 77 * 3, 0, 69 * 3, 64 * 3, 0, 68 * 3, 63 * 3, 0, 66 * 3, 65 * 3, 0, 81 * 3, 87 * 3, 0, 91 * 3, 80 * 3, 0, 82 * 3, 79 * 3, 0, 83 * 3, 86 * 3, 0, 93 * 3, 92 * 3, 0, 84 * 3, 85 * 3, 0, 90 * 3, 94 * 3, 0, 88 * 3, 89 * 3, 0, 0, 0, 515, 0, 0, 260, 0, 0, 7, 0, 0, 1026, 0, 0, 1282, 0, 0, 4097, 0, 0, 3841, 0, 0, 3585, 105 * 3, 107 * 3, 0, 111 * 3, 114 * 3, 0, 104 * 3, 97 * 3, 0, 125 * 3, 119 * 3, 0, 96 * 3, 98 * 3, 0, -1, 123 * 3, 0, 95 * 3, 101 * 3, 0, 106 * 3, 121 * 3, 0, 99 * 3, 102 * 3, 0, 113 * 3, 103 * 3, 0, 112 * 3, 116 * 3, 0, 110 * 3, 100 * 3, 0, 124 * 3, 115 * 3, 0, 117 * 3, 122 * 3, 0, 109 * 3, 118 * 3, 0, 120 * 3, 108 * 3, 0, 127 * 3, 136 * 3, 0, 139 * 3, 140 * 3, 0, 130 * 3, 126 * 3, 0, 145 * 3, 146 * 3, 0, 128 * 3, 129 * 3, 0, 0, 0, 2050, 132 * 3, 134 * 3, 0, 155 * 3, 154 * 3, 0, 0, 0, 8, 137 * 3, 133 * 3, 0, 143 * 3, 144 * 3, 0, 151 * 3, 138 * 3, 0, 142 * 3, 141 * 3, 0, 0, 0, 10, 0, 0, 9, 0, 0, 11, 0, 0, 5377, 0, 0, 1538, 0, 0, 771, 0, 0, 5121, 0, 0, 1794, 0, 0, 4353, 0, 0, 4609, 0, 0, 4865, 148 * 3, 152 * 3, 0, 0, 0, 1027, 153 * 3, 150 * 3, 0, 0, 0, 261, 131 * 3, 135 * 3, 0, 0, 0, 516, 149 * 3, 147 * 3, 0, 172 * 3, 173 * 3, 0, 162 * 3, 158 * 3, 0, 170 * 3, 161 * 3, 0, 168 * 3, 166 * 3, 0, 157 * 3, 179 * 3, 0, 169 * 3, 167 * 3, 0, 174 * 3, 171 * 3, 0, 178 * 3, 177 * 3, 0, 156 * 3, 159 * 3, 0, 164 * 3, 165 * 3, 0, 183 * 3, 182 * 3, 0, 175 * 3, 176 * 3, 0, 0, 0, 263, 0, 0, 2562, 0, 0, 2306, 0, 0, 5633, 0, 0, 5889, 0, 0, 6401, 0, 0, 6145, 0, 0, 1283, 0, 0, 772, 0, 0, 13, 0, 0, 12, 0, 0, 14, 0, 0, 15, 0, 0, 517, 0, 0, 6657, 0, 0, 262, 180 * 3, 181 * 3, 0, 160 * 3, 163 * 3, 0, 196 * 3, 199 * 3, 0, 0, 0, 27, 203 * 3, 185 * 3, 0, 202 * 3, 201 * 3, 0, 0, 0, 19, 0, 0, 22, 197 * 3, 207 * 3, 0, 0, 0, 18, 191 * 3, 192 * 3, 0, 188 * 3, 190 * 3, 0, 0, 0, 20, 184 * 3, 194 * 3, 0, 0, 0, 21, 186 * 3, 193 * 3, 0, 0, 0, 23, 204 * 3, 198 * 3, 0, 0, 0, 25, 0, 0, 24, 200 * 3, 205 * 3, 0, 0, 0, 31, 0, 0, 30, 0, 0, 28, 0, 0, 29, 0, 0, 26, 0, 0, 17, 0, 0, 16, 189 * 3, 206 * 3, 0, 187 * 3, 195 * 3, 0, 218 * 3, 211 * 3, 0, 0, 0, 37, 215 * 3, 216 * 3, 0, 0, 0, 36, 210 * 3, 212 * 3, 0, 0, 0, 34, 213 * 3, 209 * 3, 0, 221 * 3, 222 * 3, 0, 219 * 3, 208 * 3, 0, 217 * 3, 214 * 3, 0, 223 * 3, 220 * 3, 0, 0, 0, 35, 0, 0, 267, 0, 0, 40, 0, 0, 268, 0, 0, 266, 0, 0, 32, 0, 0, 264, 0, 0, 265, 0, 0, 38, 0, 0, 269, 0, 0, 270, 0, 0, 33, 0, 0, 39, 0, 0, 7937, 0, 0, 6913, 0, 0, 7681, 0, 0, 4098, 0, 0, 7425, 0, 0, 7169, 0, 0, 271, 0, 0, 274, 0, 0, 273, 0, 0, 272, 0, 0, 1539, 0, 0, 2818, 0, 0, 3586, 0, 0, 3330, 0, 0, 3074, 0, 0, 3842]);
  1904. MPEG1.PICTURE_TYPE = {
  1905. INTRA: 1,
  1906. PREDICTIVE: 2,
  1907. B: 3
  1908. };
  1909. MPEG1.START = {
  1910. SEQUENCE: 179,
  1911. SLICE_FIRST: 1,
  1912. SLICE_LAST: 175,
  1913. PICTURE: 0,
  1914. EXTENSION: 181,
  1915. USER_DATA: 178
  1916. };
  1917. return MPEG1
  1918. }();
  1919. JSMpeg.Decoder.MPEG1VideoWASM = function() {
  1920. "use strict";
  1921. var MPEG1WASM = function(options) {
  1922. JSMpeg.Decoder.Base.call(this, options);
  1923. this.onDecodeCallback = options.onVideoDecode;
  1924. this.module = options.wasmModule;
  1925. this.bufferSize = options.videoBufferSize || 512 * 1024;
  1926. this.bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
  1927. this.decodeFirstFrame = options.decodeFirstFrame !== false;
  1928. this.hasSequenceHeader = false
  1929. };
  1930. MPEG1WASM.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
  1931. MPEG1WASM.prototype.constructor = MPEG1WASM;
  1932. MPEG1WASM.prototype.initializeWasmDecoder = function() {
  1933. if (!this.module.instance) {
  1934. console.warn("JSMpeg: WASM module not compiled yet");
  1935. return
  1936. }
  1937. this.instance = this.module.instance;
  1938. this.functions = this.module.instance.exports;
  1939. this.decoder = this.functions._mpeg1_decoder_create(this.bufferSize, this.bufferMode)
  1940. }
  1941. ;
  1942. MPEG1WASM.prototype.destroy = function() {
  1943. if (!this.decoder) {
  1944. return
  1945. }
  1946. this.functions._mpeg1_decoder_destroy(this.decoder)
  1947. }
  1948. ;
  1949. MPEG1WASM.prototype.bufferGetIndex = function() {
  1950. if (!this.decoder) {
  1951. return
  1952. }
  1953. return this.functions._mpeg1_decoder_get_index(this.decoder)
  1954. }
  1955. ;
  1956. MPEG1WASM.prototype.bufferSetIndex = function(index) {
  1957. if (!this.decoder) {
  1958. return
  1959. }
  1960. this.functions._mpeg1_decoder_set_index(this.decoder, index)
  1961. }
  1962. ;
  1963. MPEG1WASM.prototype.bufferWrite = function(buffers) {
  1964. if (!this.decoder) {
  1965. this.initializeWasmDecoder()
  1966. }
  1967. var totalLength = 0;
  1968. for (var i = 0; i < buffers.length; i++) {
  1969. totalLength += buffers[i].length
  1970. }
  1971. var ptr = this.functions._mpeg1_decoder_get_write_ptr(this.decoder, totalLength);
  1972. for (var i = 0; i < buffers.length; i++) {
  1973. this.instance.heapU8.set(buffers[i], ptr);
  1974. ptr += buffers[i].length
  1975. }
  1976. this.functions._mpeg1_decoder_did_write(this.decoder, totalLength);
  1977. return totalLength
  1978. }
  1979. ;
  1980. MPEG1WASM.prototype.write = function(pts, buffers) {
  1981. JSMpeg.Decoder.Base.prototype.write.call(this, pts, buffers);
  1982. if (!this.hasSequenceHeader && this.functions._mpeg1_decoder_has_sequence_header(this.decoder)) {
  1983. this.loadSequnceHeader()
  1984. }
  1985. }
  1986. ;
  1987. MPEG1WASM.prototype.loadSequnceHeader = function() {
  1988. this.hasSequenceHeader = true;
  1989. this.frameRate = this.functions._mpeg1_decoder_get_frame_rate(this.decoder);
  1990. this.codedSize = this.functions._mpeg1_decoder_get_coded_size(this.decoder);
  1991. if (this.destination) {
  1992. var w = this.functions._mpeg1_decoder_get_width(this.decoder);
  1993. var h = this.functions._mpeg1_decoder_get_height(this.decoder);
  1994. this.destination.resize(w, h)
  1995. }
  1996. if (this.decodeFirstFrame) {
  1997. this.decode()
  1998. }
  1999. }
  2000. ;
  2001. MPEG1WASM.prototype.decode = function() {
  2002. var startTime = JSMpeg.Now();
  2003. if (!this.decoder) {
  2004. return false
  2005. }
  2006. var didDecode = this.functions._mpeg1_decoder_decode(this.decoder);
  2007. if (!didDecode) {
  2008. return false
  2009. }
  2010. if (this.destination) {
  2011. var ptrY = this.functions._mpeg1_decoder_get_y_ptr(this.decoder)
  2012. , ptrCr = this.functions._mpeg1_decoder_get_cr_ptr(this.decoder)
  2013. , ptrCb = this.functions._mpeg1_decoder_get_cb_ptr(this.decoder);
  2014. var dy = this.instance.heapU8.subarray(ptrY, ptrY + this.codedSize);
  2015. var dcr = this.instance.heapU8.subarray(ptrCr, ptrCr + (this.codedSize >> 2));
  2016. var dcb = this.instance.heapU8.subarray(ptrCb, ptrCb + (this.codedSize >> 2));
  2017. this.destination.render(dy, dcr, dcb, false)
  2018. }
  2019. this.advanceDecodedTime(1 / this.frameRate);
  2020. var elapsedTime = JSMpeg.Now() - startTime;
  2021. if (this.onDecodeCallback) {
  2022. this.onDecodeCallback(this, elapsedTime)
  2023. }
  2024. return true
  2025. }
  2026. ;
  2027. return MPEG1WASM
  2028. }();
  2029. JSMpeg.Decoder.MP2Audio = function() {
  2030. "use strict";
  2031. var MP2 = function(options) {
  2032. JSMpeg.Decoder.Base.call(this, options);
  2033. this.onDecodeCallback = options.onAudioDecode;
  2034. var bufferSize = options.audioBufferSize || 128 * 1024;
  2035. var bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
  2036. this.bits = new JSMpeg.BitBuffer(bufferSize,bufferMode);
  2037. this.left = new Float32Array(1152);
  2038. this.right = new Float32Array(1152);
  2039. this.sampleRate = 44100;
  2040. this.D = new Float32Array(1024);
  2041. this.D.set(MP2.SYNTHESIS_WINDOW, 0);
  2042. this.D.set(MP2.SYNTHESIS_WINDOW, 512);
  2043. this.V = new Float32Array(1024);
  2044. this.U = new Int32Array(32);
  2045. this.VPos = 0;
  2046. this.allocation = [new Array(32), new Array(32)];
  2047. this.scaleFactorInfo = [new Uint8Array(32), new Uint8Array(32)];
  2048. this.scaleFactor = [new Array(32), new Array(32)];
  2049. this.sample = [new Array(32), new Array(32)];
  2050. for (var j = 0; j < 2; j++) {
  2051. for (var i = 0; i < 32; i++) {
  2052. this.scaleFactor[j][i] = [0, 0, 0];
  2053. this.sample[j][i] = [0, 0, 0]
  2054. }
  2055. }
  2056. };
  2057. MP2.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
  2058. MP2.prototype.constructor = MP2;
  2059. MP2.prototype.decode = function() {
  2060. var startTime = JSMpeg.Now();
  2061. var pos = this.bits.index >> 3;
  2062. if (pos >= this.bits.byteLength) {
  2063. return false
  2064. }
  2065. var decoded = this.decodeFrame(this.left, this.right);
  2066. this.bits.index = pos + decoded << 3;
  2067. if (!decoded) {
  2068. return false
  2069. }
  2070. if (this.destination) {
  2071. this.destination.play(this.sampleRate, this.left, this.right)
  2072. }
  2073. this.advanceDecodedTime(this.left.length / this.sampleRate);
  2074. var elapsedTime = JSMpeg.Now() - startTime;
  2075. if (this.onDecodeCallback) {
  2076. this.onDecodeCallback(this, elapsedTime)
  2077. }
  2078. return true
  2079. }
  2080. ;
  2081. MP2.prototype.getCurrentTime = function() {
  2082. var enqueuedTime = this.destination ? this.destination.enqueuedTime : 0;
  2083. return this.decodedTime - enqueuedTime
  2084. }
  2085. ;
  2086. MP2.prototype.decodeFrame = function(left, right) {
  2087. var sync = this.bits.read(11)
  2088. , version = this.bits.read(2)
  2089. , layer = this.bits.read(2)
  2090. , hasCRC = !this.bits.read(1);
  2091. if (sync !== MP2.FRAME_SYNC || version !== MP2.VERSION.MPEG_1 || layer !== MP2.LAYER.II) {
  2092. return 0
  2093. }
  2094. var bitrateIndex = this.bits.read(4) - 1;
  2095. if (bitrateIndex > 13) {
  2096. return 0
  2097. }
  2098. var sampleRateIndex = this.bits.read(2);
  2099. var sampleRate = MP2.SAMPLE_RATE[sampleRateIndex];
  2100. if (sampleRateIndex === 3) {
  2101. return 0
  2102. }
  2103. if (version === MP2.VERSION.MPEG_2) {
  2104. sampleRateIndex += 4;
  2105. bitrateIndex += 14
  2106. }
  2107. var padding = this.bits.read(1)
  2108. , privat = this.bits.read(1)
  2109. , mode = this.bits.read(2);
  2110. var bound = 0;
  2111. if (mode === MP2.MODE.JOINT_STEREO) {
  2112. bound = this.bits.read(2) + 1 << 2
  2113. } else {
  2114. this.bits.skip(2);
  2115. bound = mode === MP2.MODE.MONO ? 0 : 32
  2116. }
  2117. this.bits.skip(4);
  2118. if (hasCRC) {
  2119. this.bits.skip(16)
  2120. }
  2121. var bitrate = MP2.BIT_RATE[bitrateIndex]
  2122. , sampleRate = MP2.SAMPLE_RATE[sampleRateIndex]
  2123. , frameSize = 144e3 * bitrate / sampleRate + padding | 0;
  2124. var tab3 = 0;
  2125. var sblimit = 0;
  2126. if (version === MP2.VERSION.MPEG_2) {
  2127. tab3 = 2;
  2128. sblimit = 30
  2129. } else {
  2130. var tab1 = mode === MP2.MODE.MONO ? 0 : 1;
  2131. var tab2 = MP2.QUANT_LUT_STEP_1[tab1][bitrateIndex];
  2132. tab3 = MP2.QUANT_LUT_STEP_2[tab2][sampleRateIndex];
  2133. sblimit = tab3 & 63;
  2134. tab3 >>= 6
  2135. }
  2136. if (bound > sblimit) {
  2137. bound = sblimit
  2138. }
  2139. for (var sb = 0; sb < bound; sb++) {
  2140. this.allocation[0][sb] = this.readAllocation(sb, tab3);
  2141. this.allocation[1][sb] = this.readAllocation(sb, tab3)
  2142. }
  2143. for (var sb = bound; sb < sblimit; sb++) {
  2144. this.allocation[0][sb] = this.allocation[1][sb] = this.readAllocation(sb, tab3)
  2145. }
  2146. var channels = mode === MP2.MODE.MONO ? 1 : 2;
  2147. for (var sb = 0; sb < sblimit; sb++) {
  2148. for (ch = 0; ch < channels; ch++) {
  2149. if (this.allocation[ch][sb]) {
  2150. this.scaleFactorInfo[ch][sb] = this.bits.read(2)
  2151. }
  2152. }
  2153. if (mode === MP2.MODE.MONO) {
  2154. this.scaleFactorInfo[1][sb] = this.scaleFactorInfo[0][sb]
  2155. }
  2156. }
  2157. for (var sb = 0; sb < sblimit; sb++) {
  2158. for (var ch = 0; ch < channels; ch++) {
  2159. if (this.allocation[ch][sb]) {
  2160. var sf = this.scaleFactor[ch][sb];
  2161. switch (this.scaleFactorInfo[ch][sb]) {
  2162. case 0:
  2163. sf[0] = this.bits.read(6);
  2164. sf[1] = this.bits.read(6);
  2165. sf[2] = this.bits.read(6);
  2166. break;
  2167. case 1:
  2168. sf[0] = sf[1] = this.bits.read(6);
  2169. sf[2] = this.bits.read(6);
  2170. break;
  2171. case 2:
  2172. sf[0] = sf[1] = sf[2] = this.bits.read(6);
  2173. break;
  2174. case 3:
  2175. sf[0] = this.bits.read(6);
  2176. sf[1] = sf[2] = this.bits.read(6);
  2177. break
  2178. }
  2179. }
  2180. }
  2181. if (mode === MP2.MODE.MONO) {
  2182. this.scaleFactor[1][sb][0] = this.scaleFactor[0][sb][0];
  2183. this.scaleFactor[1][sb][1] = this.scaleFactor[0][sb][1];
  2184. this.scaleFactor[1][sb][2] = this.scaleFactor[0][sb][2]
  2185. }
  2186. }
  2187. var outPos = 0;
  2188. for (var part = 0; part < 3; part++) {
  2189. for (var granule = 0; granule < 4; granule++) {
  2190. for (var sb = 0; sb < bound; sb++) {
  2191. this.readSamples(0, sb, part);
  2192. this.readSamples(1, sb, part)
  2193. }
  2194. for (var sb = bound; sb < sblimit; sb++) {
  2195. this.readSamples(0, sb, part);
  2196. this.sample[1][sb][0] = this.sample[0][sb][0];
  2197. this.sample[1][sb][1] = this.sample[0][sb][1];
  2198. this.sample[1][sb][2] = this.sample[0][sb][2]
  2199. }
  2200. for (var sb = sblimit; sb < 32; sb++) {
  2201. this.sample[0][sb][0] = 0;
  2202. this.sample[0][sb][1] = 0;
  2203. this.sample[0][sb][2] = 0;
  2204. this.sample[1][sb][0] = 0;
  2205. this.sample[1][sb][1] = 0;
  2206. this.sample[1][sb][2] = 0
  2207. }
  2208. for (var p = 0; p < 3; p++) {
  2209. this.VPos = this.VPos - 64 & 1023;
  2210. for (var ch = 0; ch < 2; ch++) {
  2211. MP2.MatrixTransform(this.sample[ch], p, this.V, this.VPos);
  2212. JSMpeg.Fill(this.U, 0);
  2213. var dIndex = 512 - (this.VPos >> 1);
  2214. var vIndex = this.VPos % 128 >> 1;
  2215. while (vIndex < 1024) {
  2216. for (var i = 0; i < 32; ++i) {
  2217. this.U[i] += this.D[dIndex++] * this.V[vIndex++]
  2218. }
  2219. vIndex += 128 - 32;
  2220. dIndex += 64 - 32
  2221. }
  2222. vIndex = 128 - 32 + 1024 - vIndex;
  2223. dIndex -= 512 - 32;
  2224. while (vIndex < 1024) {
  2225. for (var i = 0; i < 32; ++i) {
  2226. this.U[i] += this.D[dIndex++] * this.V[vIndex++]
  2227. }
  2228. vIndex += 128 - 32;
  2229. dIndex += 64 - 32
  2230. }
  2231. var outChannel = ch === 0 ? left : right;
  2232. for (var j = 0; j < 32; j++) {
  2233. outChannel[outPos + j] = this.U[j] / 2147418112
  2234. }
  2235. }
  2236. outPos += 32
  2237. }
  2238. }
  2239. }
  2240. this.sampleRate = sampleRate;
  2241. return frameSize
  2242. }
  2243. ;
  2244. MP2.prototype.readAllocation = function(sb, tab3) {
  2245. var tab4 = MP2.QUANT_LUT_STEP_3[tab3][sb];
  2246. var qtab = MP2.QUANT_LUT_STEP4[tab4 & 15][this.bits.read(tab4 >> 4)];
  2247. return qtab ? MP2.QUANT_TAB[qtab - 1] : 0
  2248. }
  2249. ;
  2250. MP2.prototype.readSamples = function(ch, sb, part) {
  2251. var q = this.allocation[ch][sb]
  2252. , sf = this.scaleFactor[ch][sb][part]
  2253. , sample = this.sample[ch][sb]
  2254. , val = 0;
  2255. if (!q) {
  2256. sample[0] = sample[1] = sample[2] = 0;
  2257. return
  2258. }
  2259. if (sf === 63) {
  2260. sf = 0
  2261. } else {
  2262. var shift = sf / 3 | 0;
  2263. sf = MP2.SCALEFACTOR_BASE[sf % 3] + (1 << shift >> 1) >> shift
  2264. }
  2265. var adj = q.levels;
  2266. if (q.group) {
  2267. val = this.bits.read(q.bits);
  2268. sample[0] = val % adj;
  2269. val = val / adj | 0;
  2270. sample[1] = val % adj;
  2271. sample[2] = val / adj | 0
  2272. } else {
  2273. sample[0] = this.bits.read(q.bits);
  2274. sample[1] = this.bits.read(q.bits);
  2275. sample[2] = this.bits.read(q.bits)
  2276. }
  2277. var scale = 65536 / (adj + 1) | 0;
  2278. adj = (adj + 1 >> 1) - 1;
  2279. val = (adj - sample[0]) * scale;
  2280. sample[0] = val * (sf >> 12) + (val * (sf & 4095) + 2048 >> 12) >> 12;
  2281. val = (adj - sample[1]) * scale;
  2282. sample[1] = val * (sf >> 12) + (val * (sf & 4095) + 2048 >> 12) >> 12;
  2283. val = (adj - sample[2]) * scale;
  2284. sample[2] = val * (sf >> 12) + (val * (sf & 4095) + 2048 >> 12) >> 12
  2285. }
  2286. ;
  2287. MP2.MatrixTransform = function(s, ss, d, dp) {
  2288. var t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29, t30, t31, t32, t33;
  2289. t01 = s[0][ss] + s[31][ss];
  2290. t02 = (s[0][ss] - s[31][ss]) * .500602998235;
  2291. t03 = s[1][ss] + s[30][ss];
  2292. t04 = (s[1][ss] - s[30][ss]) * .505470959898;
  2293. t05 = s[2][ss] + s[29][ss];
  2294. t06 = (s[2][ss] - s[29][ss]) * .515447309923;
  2295. t07 = s[3][ss] + s[28][ss];
  2296. t08 = (s[3][ss] - s[28][ss]) * .53104259109;
  2297. t09 = s[4][ss] + s[27][ss];
  2298. t10 = (s[4][ss] - s[27][ss]) * .553103896034;
  2299. t11 = s[5][ss] + s[26][ss];
  2300. t12 = (s[5][ss] - s[26][ss]) * .582934968206;
  2301. t13 = s[6][ss] + s[25][ss];
  2302. t14 = (s[6][ss] - s[25][ss]) * .622504123036;
  2303. t15 = s[7][ss] + s[24][ss];
  2304. t16 = (s[7][ss] - s[24][ss]) * .674808341455;
  2305. t17 = s[8][ss] + s[23][ss];
  2306. t18 = (s[8][ss] - s[23][ss]) * .744536271002;
  2307. t19 = s[9][ss] + s[22][ss];
  2308. t20 = (s[9][ss] - s[22][ss]) * .839349645416;
  2309. t21 = s[10][ss] + s[21][ss];
  2310. t22 = (s[10][ss] - s[21][ss]) * .972568237862;
  2311. t23 = s[11][ss] + s[20][ss];
  2312. t24 = (s[11][ss] - s[20][ss]) * 1.16943993343;
  2313. t25 = s[12][ss] + s[19][ss];
  2314. t26 = (s[12][ss] - s[19][ss]) * 1.48416461631;
  2315. t27 = s[13][ss] + s[18][ss];
  2316. t28 = (s[13][ss] - s[18][ss]) * 2.05778100995;
  2317. t29 = s[14][ss] + s[17][ss];
  2318. t30 = (s[14][ss] - s[17][ss]) * 3.40760841847;
  2319. t31 = s[15][ss] + s[16][ss];
  2320. t32 = (s[15][ss] - s[16][ss]) * 10.1900081235;
  2321. t33 = t01 + t31;
  2322. t31 = (t01 - t31) * .502419286188;
  2323. t01 = t03 + t29;
  2324. t29 = (t03 - t29) * .52249861494;
  2325. t03 = t05 + t27;
  2326. t27 = (t05 - t27) * .566944034816;
  2327. t05 = t07 + t25;
  2328. t25 = (t07 - t25) * .64682178336;
  2329. t07 = t09 + t23;
  2330. t23 = (t09 - t23) * .788154623451;
  2331. t09 = t11 + t21;
  2332. t21 = (t11 - t21) * 1.06067768599;
  2333. t11 = t13 + t19;
  2334. t19 = (t13 - t19) * 1.72244709824;
  2335. t13 = t15 + t17;
  2336. t17 = (t15 - t17) * 5.10114861869;
  2337. t15 = t33 + t13;
  2338. t13 = (t33 - t13) * .509795579104;
  2339. t33 = t01 + t11;
  2340. t01 = (t01 - t11) * .601344886935;
  2341. t11 = t03 + t09;
  2342. t09 = (t03 - t09) * .899976223136;
  2343. t03 = t05 + t07;
  2344. t07 = (t05 - t07) * 2.56291544774;
  2345. t05 = t15 + t03;
  2346. t15 = (t15 - t03) * .541196100146;
  2347. t03 = t33 + t11;
  2348. t11 = (t33 - t11) * 1.30656296488;
  2349. t33 = t05 + t03;
  2350. t05 = (t05 - t03) * .707106781187;
  2351. t03 = t15 + t11;
  2352. t15 = (t15 - t11) * .707106781187;
  2353. t03 += t15;
  2354. t11 = t13 + t07;
  2355. t13 = (t13 - t07) * .541196100146;
  2356. t07 = t01 + t09;
  2357. t09 = (t01 - t09) * 1.30656296488;
  2358. t01 = t11 + t07;
  2359. t07 = (t11 - t07) * .707106781187;
  2360. t11 = t13 + t09;
  2361. t13 = (t13 - t09) * .707106781187;
  2362. t11 += t13;
  2363. t01 += t11;
  2364. t11 += t07;
  2365. t07 += t13;
  2366. t09 = t31 + t17;
  2367. t31 = (t31 - t17) * .509795579104;
  2368. t17 = t29 + t19;
  2369. t29 = (t29 - t19) * .601344886935;
  2370. t19 = t27 + t21;
  2371. t21 = (t27 - t21) * .899976223136;
  2372. t27 = t25 + t23;
  2373. t23 = (t25 - t23) * 2.56291544774;
  2374. t25 = t09 + t27;
  2375. t09 = (t09 - t27) * .541196100146;
  2376. t27 = t17 + t19;
  2377. t19 = (t17 - t19) * 1.30656296488;
  2378. t17 = t25 + t27;
  2379. t27 = (t25 - t27) * .707106781187;
  2380. t25 = t09 + t19;
  2381. t19 = (t09 - t19) * .707106781187;
  2382. t25 += t19;
  2383. t09 = t31 + t23;
  2384. t31 = (t31 - t23) * .541196100146;
  2385. t23 = t29 + t21;
  2386. t21 = (t29 - t21) * 1.30656296488;
  2387. t29 = t09 + t23;
  2388. t23 = (t09 - t23) * .707106781187;
  2389. t09 = t31 + t21;
  2390. t31 = (t31 - t21) * .707106781187;
  2391. t09 += t31;
  2392. t29 += t09;
  2393. t09 += t23;
  2394. t23 += t31;
  2395. t17 += t29;
  2396. t29 += t25;
  2397. t25 += t09;
  2398. t09 += t27;
  2399. t27 += t23;
  2400. t23 += t19;
  2401. t19 += t31;
  2402. t21 = t02 + t32;
  2403. t02 = (t02 - t32) * .502419286188;
  2404. t32 = t04 + t30;
  2405. t04 = (t04 - t30) * .52249861494;
  2406. t30 = t06 + t28;
  2407. t28 = (t06 - t28) * .566944034816;
  2408. t06 = t08 + t26;
  2409. t08 = (t08 - t26) * .64682178336;
  2410. t26 = t10 + t24;
  2411. t10 = (t10 - t24) * .788154623451;
  2412. t24 = t12 + t22;
  2413. t22 = (t12 - t22) * 1.06067768599;
  2414. t12 = t14 + t20;
  2415. t20 = (t14 - t20) * 1.72244709824;
  2416. t14 = t16 + t18;
  2417. t16 = (t16 - t18) * 5.10114861869;
  2418. t18 = t21 + t14;
  2419. t14 = (t21 - t14) * .509795579104;
  2420. t21 = t32 + t12;
  2421. t32 = (t32 - t12) * .601344886935;
  2422. t12 = t30 + t24;
  2423. t24 = (t30 - t24) * .899976223136;
  2424. t30 = t06 + t26;
  2425. t26 = (t06 - t26) * 2.56291544774;
  2426. t06 = t18 + t30;
  2427. t18 = (t18 - t30) * .541196100146;
  2428. t30 = t21 + t12;
  2429. t12 = (t21 - t12) * 1.30656296488;
  2430. t21 = t06 + t30;
  2431. t30 = (t06 - t30) * .707106781187;
  2432. t06 = t18 + t12;
  2433. t12 = (t18 - t12) * .707106781187;
  2434. t06 += t12;
  2435. t18 = t14 + t26;
  2436. t26 = (t14 - t26) * .541196100146;
  2437. t14 = t32 + t24;
  2438. t24 = (t32 - t24) * 1.30656296488;
  2439. t32 = t18 + t14;
  2440. t14 = (t18 - t14) * .707106781187;
  2441. t18 = t26 + t24;
  2442. t24 = (t26 - t24) * .707106781187;
  2443. t18 += t24;
  2444. t32 += t18;
  2445. t18 += t14;
  2446. t26 = t14 + t24;
  2447. t14 = t02 + t16;
  2448. t02 = (t02 - t16) * .509795579104;
  2449. t16 = t04 + t20;
  2450. t04 = (t04 - t20) * .601344886935;
  2451. t20 = t28 + t22;
  2452. t22 = (t28 - t22) * .899976223136;
  2453. t28 = t08 + t10;
  2454. t10 = (t08 - t10) * 2.56291544774;
  2455. t08 = t14 + t28;
  2456. t14 = (t14 - t28) * .541196100146;
  2457. t28 = t16 + t20;
  2458. t20 = (t16 - t20) * 1.30656296488;
  2459. t16 = t08 + t28;
  2460. t28 = (t08 - t28) * .707106781187;
  2461. t08 = t14 + t20;
  2462. t20 = (t14 - t20) * .707106781187;
  2463. t08 += t20;
  2464. t14 = t02 + t10;
  2465. t02 = (t02 - t10) * .541196100146;
  2466. t10 = t04 + t22;
  2467. t22 = (t04 - t22) * 1.30656296488;
  2468. t04 = t14 + t10;
  2469. t10 = (t14 - t10) * .707106781187;
  2470. t14 = t02 + t22;
  2471. t02 = (t02 - t22) * .707106781187;
  2472. t14 += t02;
  2473. t04 += t14;
  2474. t14 += t10;
  2475. t10 += t02;
  2476. t16 += t04;
  2477. t04 += t08;
  2478. t08 += t14;
  2479. t14 += t28;
  2480. t28 += t10;
  2481. t10 += t20;
  2482. t20 += t02;
  2483. t21 += t16;
  2484. t16 += t32;
  2485. t32 += t04;
  2486. t04 += t06;
  2487. t06 += t08;
  2488. t08 += t18;
  2489. t18 += t14;
  2490. t14 += t30;
  2491. t30 += t28;
  2492. t28 += t26;
  2493. t26 += t10;
  2494. t10 += t12;
  2495. t12 += t20;
  2496. t20 += t24;
  2497. t24 += t02;
  2498. d[dp + 48] = -t33;
  2499. d[dp + 49] = d[dp + 47] = -t21;
  2500. d[dp + 50] = d[dp + 46] = -t17;
  2501. d[dp + 51] = d[dp + 45] = -t16;
  2502. d[dp + 52] = d[dp + 44] = -t01;
  2503. d[dp + 53] = d[dp + 43] = -t32;
  2504. d[dp + 54] = d[dp + 42] = -t29;
  2505. d[dp + 55] = d[dp + 41] = -t04;
  2506. d[dp + 56] = d[dp + 40] = -t03;
  2507. d[dp + 57] = d[dp + 39] = -t06;
  2508. d[dp + 58] = d[dp + 38] = -t25;
  2509. d[dp + 59] = d[dp + 37] = -t08;
  2510. d[dp + 60] = d[dp + 36] = -t11;
  2511. d[dp + 61] = d[dp + 35] = -t18;
  2512. d[dp + 62] = d[dp + 34] = -t09;
  2513. d[dp + 63] = d[dp + 33] = -t14;
  2514. d[dp + 32] = -t05;
  2515. d[dp + 0] = t05;
  2516. d[dp + 31] = -t30;
  2517. d[dp + 1] = t30;
  2518. d[dp + 30] = -t27;
  2519. d[dp + 2] = t27;
  2520. d[dp + 29] = -t28;
  2521. d[dp + 3] = t28;
  2522. d[dp + 28] = -t07;
  2523. d[dp + 4] = t07;
  2524. d[dp + 27] = -t26;
  2525. d[dp + 5] = t26;
  2526. d[dp + 26] = -t23;
  2527. d[dp + 6] = t23;
  2528. d[dp + 25] = -t10;
  2529. d[dp + 7] = t10;
  2530. d[dp + 24] = -t15;
  2531. d[dp + 8] = t15;
  2532. d[dp + 23] = -t12;
  2533. d[dp + 9] = t12;
  2534. d[dp + 22] = -t19;
  2535. d[dp + 10] = t19;
  2536. d[dp + 21] = -t20;
  2537. d[dp + 11] = t20;
  2538. d[dp + 20] = -t13;
  2539. d[dp + 12] = t13;
  2540. d[dp + 19] = -t24;
  2541. d[dp + 13] = t24;
  2542. d[dp + 18] = -t31;
  2543. d[dp + 14] = t31;
  2544. d[dp + 17] = -t02;
  2545. d[dp + 15] = t02;
  2546. d[dp + 16] = 0
  2547. }
  2548. ;
  2549. MP2.FRAME_SYNC = 2047;
  2550. MP2.VERSION = {
  2551. MPEG_2_5: 0,
  2552. MPEG_2: 2,
  2553. MPEG_1: 3
  2554. };
  2555. MP2.LAYER = {
  2556. III: 1,
  2557. II: 2,
  2558. I: 3
  2559. };
  2560. MP2.MODE = {
  2561. STEREO: 0,
  2562. JOINT_STEREO: 1,
  2563. DUAL_CHANNEL: 2,
  2564. MONO: 3
  2565. };
  2566. MP2.SAMPLE_RATE = new Uint16Array([44100, 48e3, 32e3, 0, 22050, 24e3, 16e3, 0]);
  2567. MP2.BIT_RATE = new Uint16Array([32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]);
  2568. MP2.SCALEFACTOR_BASE = new Uint32Array([33554432, 26632170, 21137968]);
  2569. MP2.SYNTHESIS_WINDOW = new Float32Array([0, -.5, -.5, -.5, -.5, -.5, -.5, -1, -1, -1, -1, -1.5, -1.5, -2, -2, -2.5, -2.5, -3, -3.5, -3.5, -4, -4.5, -5, -5.5, -6.5, -7, -8, -8.5, -9.5, -10.5, -12, -13, -14.5, -15.5, -17.5, -19, -20.5, -22.5, -24.5, -26.5, -29, -31.5, -34, -36.5, -39.5, -42.5, -45.5, -48.5, -52, -55.5, -58.5, -62.5, -66, -69.5, -73.5, -77, -80.5, -84.5, -88, -91.5, -95, -98, -101, -104, 106.5, 109, 111, 112.5, 113.5, 114, 114, 113.5, 112, 110.5, 107.5, 104, 100, 94.5, 88.5, 81.5, 73, 63.5, 53, 41.5, 28.5, 14.5, -1, -18, -36, -55.5, -76.5, -98.5, -122, -147, -173.5, -200.5, -229.5, -259.5, -290.5, -322.5, -355.5, -389.5, -424, -459.5, -495.5, -532, -568.5, -605, -641.5, -678, -714, -749, -783.5, -817, -849, -879.5, -908.5, -935, -959.5, -981, -1000.5, -1016, -1028.5, -1037.5, -1042.5, -1043.5, -1040, -1031.5, 1018.5, 1e3, 976, 946.5, 911, 869.5, 822, 767.5, 707, 640, 565.5, 485, 397, 302.5, 201, 92.5, -22.5, -144, -272.5, -407, -547.5, -694, -846, -1003, -1165, -1331.5, -1502, -1675.5, -1852.5, -2031.5, -2212.5, -2394, -2576.5, -2758.5, -2939.5, -3118.5, -3294.5, -3467.5, -3635.5, -3798.5, -3955, -4104.5, -4245.5, -4377.5, -4499, -4609.5, -4708, -4792.5, -4863.5, -4919, -4958, -4979.5, -4983, -4967.5, -4931.5, -4875, -4796, -4694.5, -4569.5, -4420, -4246, -4046, -3820, -3567, 3287, 2979.5, 2644, 2280.5, 1888, 1467.5, 1018.5, 541, 35, -499, -1061, -1650, -2266.5, -2909, -3577, -4270, -4987.5, -5727.5, -6490, -7274, -8077.5, -8899.5, -9739, -10594.5, -11464.5, -12347, -13241, -14144.5, -15056, -15973.5, -16895.5, -17820, -18744.5, -19668, -20588, -21503, -22410.5, -23308.5, -24195, -25068.5, -25926.5, -26767, -27589, -28389, -29166.5, -29919, -30644.5, -31342, -32009.5, -32645, -33247, -33814.5, -34346, -34839.5, -35295, -35710, -36084.5, -36417.5, -36707.5, -36954, -37156.5, -37315, -37428, -37496, 37519, 37496, 37428, 37315, 37156.5, 36954, 36707.5, 36417.5, 36084.5, 35710, 35295, 34839.5, 34346, 33814.5, 33247, 32645, 32009.5, 31342, 30644.5, 29919, 29166.5, 28389, 27589, 26767, 25926.5, 25068.5, 24195, 23308.5, 22410.5, 21503, 20588, 19668, 18744.5, 17820, 16895.5, 15973.5, 15056, 14144.5, 13241, 12347, 11464.5, 10594.5, 9739, 8899.5, 8077.5, 7274, 6490, 5727.5, 4987.5, 4270, 3577, 2909, 2266.5, 1650, 1061, 499, -35, -541, -1018.5, -1467.5, -1888, -2280.5, -2644, -2979.5, 3287, 3567, 3820, 4046, 4246, 4420, 4569.5, 4694.5, 4796, 4875, 4931.5, 4967.5, 4983, 4979.5, 4958, 4919, 4863.5, 4792.5, 4708, 4609.5, 4499, 4377.5, 4245.5, 4104.5, 3955, 3798.5, 3635.5, 3467.5, 3294.5, 3118.5, 2939.5, 2758.5, 2576.5, 2394, 2212.5, 2031.5, 1852.5, 1675.5, 1502, 1331.5, 1165, 1003, 846, 694, 547.5, 407, 272.5, 144, 22.5, -92.5, -201, -302.5, -397, -485, -565.5, -640, -707, -767.5, -822, -869.5, -911, -946.5, -976, -1e3, 1018.5, 1031.5, 1040, 1043.5, 1042.5, 1037.5, 1028.5, 1016, 1000.5, 981, 959.5, 935, 908.5, 879.5, 849, 817, 783.5, 749, 714, 678, 641.5, 605, 568.5, 532, 495.5, 459.5, 424, 389.5, 355.5, 322.5, 290.5, 259.5, 229.5, 200.5, 173.5, 147, 122, 98.5, 76.5, 55.5, 36, 18, 1, -14.5, -28.5, -41.5, -53, -63.5, -73, -81.5, -88.5, -94.5, -100, -104, -107.5, -110.5, -112, -113.5, -114, -114, -113.5, -112.5, -111, -109, 106.5, 104, 101, 98, 95, 91.5, 88, 84.5, 80.5, 77, 73.5, 69.5, 66, 62.5, 58.5, 55.5, 52, 48.5, 45.5, 42.5, 39.5, 36.5, 34, 31.5, 29, 26.5, 24.5, 22.5, 20.5, 19, 17.5, 15.5, 14.5, 13, 12, 10.5, 9.5, 8.5, 8, 7, 6.5, 5.5, 5, 4.5, 4, 3.5, 3.5, 3, 2.5, 2.5, 2, 2, 1.5, 1.5, 1, 1, 1, 1, .5, .5, .5, .5, .5, .5]);
  2570. MP2.QUANT_LUT_STEP_1 = [[0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2]];
  2571. MP2.QUANT_TAB = {
  2572. A: 27 | 64,
  2573. B: 30 | 64,
  2574. C: 8,
  2575. D: 12
  2576. };
  2577. MP2.QUANT_LUT_STEP_2 = [[MP2.QUANT_TAB.C, MP2.QUANT_TAB.C, MP2.QUANT_TAB.D], [MP2.QUANT_TAB.A, MP2.QUANT_TAB.A, MP2.QUANT_TAB.A], [MP2.QUANT_TAB.B, MP2.QUANT_TAB.A, MP2.QUANT_TAB.B]];
  2578. MP2.QUANT_LUT_STEP_3 = [[68, 68, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52], [67, 67, 67, 66, 66, 66, 66, 66, 66, 66, 66, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 32, 32, 32, 32, 32, 32, 32], [69, 69, 69, 69, 52, 52, 52, 52, 52, 52, 52, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36]];
  2579. MP2.QUANT_LUT_STEP4 = [[0, 1, 2, 17], [0, 1, 2, 3, 4, 5, 6, 17], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17], [0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]];
  2580. MP2.QUANT_TAB = [{
  2581. levels: 3,
  2582. group: 1,
  2583. bits: 5
  2584. }, {
  2585. levels: 5,
  2586. group: 1,
  2587. bits: 7
  2588. }, {
  2589. levels: 7,
  2590. group: 0,
  2591. bits: 3
  2592. }, {
  2593. levels: 9,
  2594. group: 1,
  2595. bits: 10
  2596. }, {
  2597. levels: 15,
  2598. group: 0,
  2599. bits: 4
  2600. }, {
  2601. levels: 31,
  2602. group: 0,
  2603. bits: 5
  2604. }, {
  2605. levels: 63,
  2606. group: 0,
  2607. bits: 6
  2608. }, {
  2609. levels: 127,
  2610. group: 0,
  2611. bits: 7
  2612. }, {
  2613. levels: 255,
  2614. group: 0,
  2615. bits: 8
  2616. }, {
  2617. levels: 511,
  2618. group: 0,
  2619. bits: 9
  2620. }, {
  2621. levels: 1023,
  2622. group: 0,
  2623. bits: 10
  2624. }, {
  2625. levels: 2047,
  2626. group: 0,
  2627. bits: 11
  2628. }, {
  2629. levels: 4095,
  2630. group: 0,
  2631. bits: 12
  2632. }, {
  2633. levels: 8191,
  2634. group: 0,
  2635. bits: 13
  2636. }, {
  2637. levels: 16383,
  2638. group: 0,
  2639. bits: 14
  2640. }, {
  2641. levels: 32767,
  2642. group: 0,
  2643. bits: 15
  2644. }, {
  2645. levels: 65535,
  2646. group: 0,
  2647. bits: 16
  2648. }];
  2649. return MP2
  2650. }();
  2651. JSMpeg.Decoder.MP2AudioWASM = function() {
  2652. "use strict";
  2653. var MP2WASM = function(options) {
  2654. JSMpeg.Decoder.Base.call(this, options);
  2655. this.onDecodeCallback = options.onAudioDecode;
  2656. this.module = options.wasmModule;
  2657. this.bufferSize = options.audioBufferSize || 128 * 1024;
  2658. this.bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
  2659. this.sampleRate = 0
  2660. };
  2661. MP2WASM.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
  2662. MP2WASM.prototype.constructor = MP2WASM;
  2663. MP2WASM.prototype.initializeWasmDecoder = function() {
  2664. if (!this.module.instance) {
  2665. console.warn("JSMpeg: WASM module not compiled yet");
  2666. return
  2667. }
  2668. this.instance = this.module.instance;
  2669. this.functions = this.module.instance.exports;
  2670. this.decoder = this.functions._mp2_decoder_create(this.bufferSize, this.bufferMode)
  2671. }
  2672. ;
  2673. MP2WASM.prototype.destroy = function() {
  2674. if (!this.decoder) {
  2675. return
  2676. }
  2677. this.functions._mp2_decoder_destroy(this.decoder)
  2678. }
  2679. ;
  2680. MP2WASM.prototype.bufferGetIndex = function() {
  2681. if (!this.decoder) {
  2682. return
  2683. }
  2684. return this.functions._mp2_decoder_get_index(this.decoder)
  2685. }
  2686. ;
  2687. MP2WASM.prototype.bufferSetIndex = function(index) {
  2688. if (!this.decoder) {
  2689. return
  2690. }
  2691. this.functions._mp2_decoder_set_index(this.decoder, index)
  2692. }
  2693. ;
  2694. MP2WASM.prototype.bufferWrite = function(buffers) {
  2695. if (!this.decoder) {
  2696. this.initializeWasmDecoder()
  2697. }
  2698. var totalLength = 0;
  2699. for (var i = 0; i < buffers.length; i++) {
  2700. totalLength += buffers[i].length
  2701. }
  2702. var ptr = this.functions._mp2_decoder_get_write_ptr(this.decoder, totalLength);
  2703. for (var i = 0; i < buffers.length; i++) {
  2704. this.instance.heapU8.set(buffers[i], ptr);
  2705. ptr += buffers[i].length
  2706. }
  2707. this.functions._mp2_decoder_did_write(this.decoder, totalLength);
  2708. return totalLength
  2709. }
  2710. ;
  2711. MP2WASM.prototype.decode = function() {
  2712. var startTime = JSMpeg.Now();
  2713. if (!this.decoder) {
  2714. return false
  2715. }
  2716. var decodedBytes = this.functions._mp2_decoder_decode(this.decoder);
  2717. if (decodedBytes === 0) {
  2718. return false
  2719. }
  2720. if (!this.sampleRate) {
  2721. this.sampleRate = this.functions._mp2_decoder_get_sample_rate(this.decoder)
  2722. }
  2723. if (this.destination) {
  2724. var leftPtr = this.functions._mp2_decoder_get_left_channel_ptr(this.decoder)
  2725. , rightPtr = this.functions._mp2_decoder_get_right_channel_ptr(this.decoder);
  2726. var leftOffset = leftPtr / Float32Array.BYTES_PER_ELEMENT
  2727. , rightOffset = rightPtr / Float32Array.BYTES_PER_ELEMENT;
  2728. var left = this.instance.heapF32.subarray(leftOffset, leftOffset + MP2WASM.SAMPLES_PER_FRAME)
  2729. , right = this.instance.heapF32.subarray(rightOffset, rightOffset + MP2WASM.SAMPLES_PER_FRAME);
  2730. this.destination.play(this.sampleRate, left, right)
  2731. }
  2732. this.advanceDecodedTime(MP2WASM.SAMPLES_PER_FRAME / this.sampleRate);
  2733. var elapsedTime = JSMpeg.Now() - startTime;
  2734. if (this.onDecodeCallback) {
  2735. this.onDecodeCallback(this, elapsedTime)
  2736. }
  2737. return true
  2738. }
  2739. ;
  2740. MP2WASM.prototype.getCurrentTime = function() {
  2741. var enqueuedTime = this.destination ? this.destination.enqueuedTime : 0;
  2742. return this.decodedTime - enqueuedTime
  2743. }
  2744. ;
  2745. MP2WASM.SAMPLES_PER_FRAME = 1152;
  2746. return MP2WASM
  2747. }();
  2748. JSMpeg.Renderer.WebGL = function() {
  2749. "use strict";
  2750. var WebGLRenderer = function(options) {
  2751. this.canvas = options.canvas || document.createElement("canvas");
  2752. this.width = this.canvas.width;
  2753. this.height = this.canvas.height;
  2754. this.enabled = true;
  2755. this.hasTextureData = {};
  2756. var contextCreateOptions = {
  2757. preserveDrawingBuffer: !!options.preserveDrawingBuffer,
  2758. alpha: false,
  2759. depth: false,
  2760. stencil: false,
  2761. antialias: false,
  2762. premultipliedAlpha: false
  2763. };
  2764. this.gl = this.canvas.getContext("webgl", contextCreateOptions) || this.canvas.getContext("experimental-webgl", contextCreateOptions);
  2765. if (!this.gl) {
  2766. throw new Error("Failed to get WebGL Context")
  2767. }
  2768. var gl = this.gl;
  2769. var vertexAttr = null;
  2770. gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
  2771. this.vertexBuffer = gl.createBuffer();
  2772. var vertexCoords = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);
  2773. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
  2774. gl.bufferData(gl.ARRAY_BUFFER, vertexCoords, gl.STATIC_DRAW);
  2775. this.program = this.createProgram(WebGLRenderer.SHADER.VERTEX_IDENTITY, WebGLRenderer.SHADER.FRAGMENT_YCRCB_TO_RGBA);
  2776. vertexAttr = gl.getAttribLocation(this.program, "vertex");
  2777. gl.enableVertexAttribArray(vertexAttr);
  2778. gl.vertexAttribPointer(vertexAttr, 2, gl.FLOAT, false, 0, 0);
  2779. this.textureY = this.createTexture(0, "textureY");
  2780. this.textureCb = this.createTexture(1, "textureCb");
  2781. this.textureCr = this.createTexture(2, "textureCr");
  2782. this.loadingProgram = this.createProgram(WebGLRenderer.SHADER.VERTEX_IDENTITY, WebGLRenderer.SHADER.FRAGMENT_LOADING);
  2783. vertexAttr = gl.getAttribLocation(this.loadingProgram, "vertex");
  2784. gl.enableVertexAttribArray(vertexAttr);
  2785. gl.vertexAttribPointer(vertexAttr, 2, gl.FLOAT, false, 0, 0);
  2786. this.shouldCreateUnclampedViews = !this.allowsClampedTextureData()
  2787. };
  2788. WebGLRenderer.prototype.destroy = function() {
  2789. var gl = this.gl;
  2790. gl.deleteTexture(this.textureY);
  2791. gl.deleteTexture(this.textureCb);
  2792. gl.deleteTexture(this.textureCr);
  2793. gl.deleteProgram(this.program);
  2794. gl.deleteProgram(this.loadingProgram);
  2795. gl.deleteBuffer(this.vertexBuffer);
  2796. gl.getExtension("WEBGL_lose_context").loseContext();
  2797. this.canvas.remove()
  2798. }
  2799. ;
  2800. WebGLRenderer.prototype.resize = function(width, height) {
  2801. this.width = width | 0;
  2802. this.height = height | 0;
  2803. this.canvas.width = this.width;
  2804. this.canvas.height = this.height;
  2805. this.gl.useProgram(this.program);
  2806. var codedWidth = this.width + 15 >> 4 << 4;
  2807. this.gl.viewport(0, 0, codedWidth, this.height)
  2808. }
  2809. ;
  2810. WebGLRenderer.prototype.createTexture = function(index, name) {
  2811. var gl = this.gl;
  2812. var texture = gl.createTexture();
  2813. gl.bindTexture(gl.TEXTURE_2D, texture);
  2814. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
  2815. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
  2816. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
  2817. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
  2818. gl.uniform1i(gl.getUniformLocation(this.program, name), index);
  2819. return texture
  2820. }
  2821. ;
  2822. WebGLRenderer.prototype.createProgram = function(vsh, fsh) {
  2823. var gl = this.gl;
  2824. var program = gl.createProgram();
  2825. gl.attachShader(program, this.compileShader(gl.VERTEX_SHADER, vsh));
  2826. gl.attachShader(program, this.compileShader(gl.FRAGMENT_SHADER, fsh));
  2827. gl.linkProgram(program);
  2828. gl.useProgram(program);
  2829. return program
  2830. }
  2831. ;
  2832. WebGLRenderer.prototype.compileShader = function(type, source) {
  2833. var gl = this.gl;
  2834. var shader = gl.createShader(type);
  2835. gl.shaderSource(shader, source);
  2836. gl.compileShader(shader);
  2837. if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
  2838. throw new Error(gl.getShaderInfoLog(shader))
  2839. }
  2840. return shader
  2841. }
  2842. ;
  2843. WebGLRenderer.prototype.allowsClampedTextureData = function() {
  2844. var gl = this.gl;
  2845. var texture = gl.createTexture();
  2846. gl.bindTexture(gl.TEXTURE_2D, texture);
  2847. gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, 1, 1, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, new Uint8ClampedArray([0]));
  2848. return gl.getError() === 0
  2849. }
  2850. ;
  2851. WebGLRenderer.prototype.renderProgress = function(progress) {
  2852. var gl = this.gl;
  2853. gl.useProgram(this.loadingProgram);
  2854. var loc = gl.getUniformLocation(this.loadingProgram, "progress");
  2855. gl.uniform1f(loc, progress);
  2856. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
  2857. }
  2858. ;
  2859. WebGLRenderer.prototype.render = function(y, cb, cr, isClampedArray) {
  2860. if (!this.enabled) {
  2861. return
  2862. }
  2863. var gl = this.gl;
  2864. var w = this.width + 15 >> 4 << 4
  2865. , h = this.height
  2866. , w2 = w >> 1
  2867. , h2 = h >> 1;
  2868. if (isClampedArray && this.shouldCreateUnclampedViews) {
  2869. y = new Uint8Array(y.buffer),
  2870. cb = new Uint8Array(cb.buffer),
  2871. cr = new Uint8Array(cr.buffer)
  2872. }
  2873. gl.useProgram(this.program);
  2874. this.updateTexture(gl.TEXTURE0, this.textureY, w, h, y);
  2875. this.updateTexture(gl.TEXTURE1, this.textureCb, w2, h2, cb);
  2876. this.updateTexture(gl.TEXTURE2, this.textureCr, w2, h2, cr);
  2877. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
  2878. }
  2879. ;
  2880. WebGLRenderer.prototype.updateTexture = function(unit, texture, w, h, data) {
  2881. var gl = this.gl;
  2882. gl.activeTexture(unit);
  2883. gl.bindTexture(gl.TEXTURE_2D, texture);
  2884. if (this.hasTextureData[unit]) {
  2885. gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, w, h, gl.LUMINANCE, gl.UNSIGNED_BYTE, data)
  2886. } else {
  2887. this.hasTextureData[unit] = true;
  2888. gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, w, h, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data)
  2889. }
  2890. }
  2891. ;
  2892. WebGLRenderer.IsSupported = function() {
  2893. try {
  2894. if (!window.WebGLRenderingContext) {
  2895. return false
  2896. }
  2897. var canvas = document.createElement("canvas");
  2898. return !!(canvas.getContext("webgl") || canvas.getContext("experimental-webgl"))
  2899. } catch (err) {
  2900. return false
  2901. }
  2902. }
  2903. ;
  2904. WebGLRenderer.SHADER = {
  2905. FRAGMENT_YCRCB_TO_RGBA: ["precision mediump float;", "uniform sampler2D textureY;", "uniform sampler2D textureCb;", "uniform sampler2D textureCr;", "varying vec2 texCoord;", "mat4 rec601 = mat4(", "1.16438, 0.00000, 1.59603, -0.87079,", "1.16438, -0.39176, -0.81297, 0.52959,", "1.16438, 2.01723, 0.00000, -1.08139,", "0, 0, 0, 1", ");", "void main() {", "float y = texture2D(textureY, texCoord).r;", "float cb = texture2D(textureCb, texCoord).r;", "float cr = texture2D(textureCr, texCoord).r;", "gl_FragColor = vec4(y, cr, cb, 1.0) * rec601;", "}"].join("\n"),
  2906. FRAGMENT_LOADING: ["precision mediump float;", "uniform float progress;", "varying vec2 texCoord;", "void main() {", "float c = ceil(progress-(1.0-texCoord.y));", "gl_FragColor = vec4(c,c,c,1);", "}"].join("\n"),
  2907. VERTEX_IDENTITY: ["attribute vec2 vertex;", "varying vec2 texCoord;", "void main() {", "texCoord = vertex;", "gl_Position = vec4((vertex * 2.0 - 1.0) * vec2(1, -1), 0.0, 1.0);", "}"].join("\n")
  2908. };
  2909. return WebGLRenderer
  2910. }();
  2911. JSMpeg.Renderer.Canvas2D = function() {
  2912. "use strict";
  2913. var CanvasRenderer = function(options) {
  2914. this.canvas = options.canvas || document.createElement("canvas");
  2915. this.width = this.canvas.width;
  2916. this.height = this.canvas.height;
  2917. this.enabled = true;
  2918. this.context = this.canvas.getContext("2d")
  2919. };
  2920. CanvasRenderer.prototype.destroy = function() {}
  2921. ;
  2922. CanvasRenderer.prototype.resize = function(width, height) {
  2923. this.width = width | 0;
  2924. this.height = height | 0;
  2925. this.canvas.width = this.width;
  2926. this.canvas.height = this.height;
  2927. this.imageData = this.context.getImageData(0, 0, this.width, this.height);
  2928. JSMpeg.Fill(this.imageData.data, 255)
  2929. }
  2930. ;
  2931. CanvasRenderer.prototype.renderProgress = function(progress) {
  2932. var w = this.canvas.width
  2933. , h = this.canvas.height
  2934. , ctx = this.context;
  2935. ctx.fillStyle = "#222";
  2936. ctx.fillRect(0, 0, w, h);
  2937. ctx.fillStyle = "#fff";
  2938. ctx.fillRect(0, h - h * progress, w, h * progress)
  2939. }
  2940. ;
  2941. CanvasRenderer.prototype.render = function(y, cb, cr) {
  2942. this.YCbCrToRGBA(y, cb, cr, this.imageData.data);
  2943. this.context.putImageData(this.imageData, 0, 0)
  2944. }
  2945. ;
  2946. CanvasRenderer.prototype.YCbCrToRGBA = function(y, cb, cr, rgba) {
  2947. if (!this.enabled) {
  2948. return
  2949. }
  2950. var w = this.width + 15 >> 4 << 4
  2951. , w2 = w >> 1;
  2952. var yIndex1 = 0
  2953. , yIndex2 = w
  2954. , yNext2Lines = w + (w - this.width);
  2955. var cIndex = 0
  2956. , cNextLine = w2 - (this.width >> 1);
  2957. var rgbaIndex1 = 0
  2958. , rgbaIndex2 = this.width * 4
  2959. , rgbaNext2Lines = this.width * 4;
  2960. var cols = this.width >> 1
  2961. , rows = this.height >> 1;
  2962. var ccb, ccr, r, g, b;
  2963. for (var row = 0; row < rows; row++) {
  2964. for (var col = 0; col < cols; col++) {
  2965. ccb = cb[cIndex];
  2966. ccr = cr[cIndex];
  2967. cIndex++;
  2968. r = ccb + (ccb * 103 >> 8) - 179;
  2969. g = (ccr * 88 >> 8) - 44 + (ccb * 183 >> 8) - 91;
  2970. b = ccr + (ccr * 198 >> 8) - 227;
  2971. var y1 = y[yIndex1++];
  2972. var y2 = y[yIndex1++];
  2973. rgba[rgbaIndex1] = y1 + r;
  2974. rgba[rgbaIndex1 + 1] = y1 - g;
  2975. rgba[rgbaIndex1 + 2] = y1 + b;
  2976. rgba[rgbaIndex1 + 4] = y2 + r;
  2977. rgba[rgbaIndex1 + 5] = y2 - g;
  2978. rgba[rgbaIndex1 + 6] = y2 + b;
  2979. rgbaIndex1 += 8;
  2980. var y3 = y[yIndex2++];
  2981. var y4 = y[yIndex2++];
  2982. rgba[rgbaIndex2] = y3 + r;
  2983. rgba[rgbaIndex2 + 1] = y3 - g;
  2984. rgba[rgbaIndex2 + 2] = y3 + b;
  2985. rgba[rgbaIndex2 + 4] = y4 + r;
  2986. rgba[rgbaIndex2 + 5] = y4 - g;
  2987. rgba[rgbaIndex2 + 6] = y4 + b;
  2988. rgbaIndex2 += 8
  2989. }
  2990. yIndex1 += yNext2Lines;
  2991. yIndex2 += yNext2Lines;
  2992. rgbaIndex1 += rgbaNext2Lines;
  2993. rgbaIndex2 += rgbaNext2Lines;
  2994. cIndex += cNextLine
  2995. }
  2996. }
  2997. ;
  2998. return CanvasRenderer
  2999. }();
  3000. JSMpeg.AudioOutput.WebAudio = function() {
  3001. "use strict";
  3002. var WebAudioOut = function(options) {
  3003. this.context = WebAudioOut.CachedContext = WebAudioOut.CachedContext || new (window.AudioContext || window.webkitAudioContext);
  3004. this.gain = this.context.createGain();
  3005. this.destination = this.gain;
  3006. this.gain.connect(this.context.destination);
  3007. this.context._connections = (this.context._connections || 0) + 1;
  3008. this.startTime = 0;
  3009. this.buffer = null;
  3010. this.wallclockStartTime = 0;
  3011. this.volume = 1;
  3012. this.enabled = true;
  3013. this.unlocked = !WebAudioOut.NeedsUnlocking();
  3014. Object.defineProperty(this, "enqueuedTime", {
  3015. get: this.getEnqueuedTime
  3016. })
  3017. };
  3018. WebAudioOut.prototype.destroy = function() {
  3019. this.gain.disconnect();
  3020. this.context._connections--;
  3021. if (this.context._connections === 0) {
  3022. this.context.close();
  3023. WebAudioOut.CachedContext = null
  3024. }
  3025. }
  3026. ;
  3027. WebAudioOut.prototype.play = function(sampleRate, left, right) {
  3028. if (!this.enabled) {
  3029. return
  3030. }
  3031. if (!this.unlocked) {
  3032. var ts = JSMpeg.Now();
  3033. if (this.wallclockStartTime < ts) {
  3034. this.wallclockStartTime = ts
  3035. }
  3036. this.wallclockStartTime += left.length / sampleRate;
  3037. return
  3038. }
  3039. this.gain.gain.value = this.volume;
  3040. var buffer = this.context.createBuffer(2, left.length, sampleRate);
  3041. buffer.getChannelData(0).set(left);
  3042. buffer.getChannelData(1).set(right);
  3043. var source = this.context.createBufferSource();
  3044. source.buffer = buffer;
  3045. source.connect(this.destination);
  3046. var now = this.context.currentTime;
  3047. var duration = buffer.duration;
  3048. if (this.startTime < now) {
  3049. this.startTime = now;
  3050. this.wallclockStartTime = JSMpeg.Now()
  3051. }
  3052. source.start(this.startTime);
  3053. this.startTime += duration;
  3054. this.wallclockStartTime += duration
  3055. }
  3056. ;
  3057. WebAudioOut.prototype.stop = function() {
  3058. this.gain.gain.value = 0
  3059. }
  3060. ;
  3061. WebAudioOut.prototype.getEnqueuedTime = function() {
  3062. return Math.max(this.wallclockStartTime - JSMpeg.Now(), 0)
  3063. }
  3064. ;
  3065. WebAudioOut.prototype.resetEnqueuedTime = function() {
  3066. this.startTime = this.context.currentTime;
  3067. this.wallclockStartTime = JSMpeg.Now()
  3068. }
  3069. ;
  3070. WebAudioOut.prototype.unlock = function(callback) {
  3071. if (this.unlocked) {
  3072. if (callback) {
  3073. callback()
  3074. }
  3075. return
  3076. }
  3077. this.unlockCallback = callback;
  3078. var buffer = this.context.createBuffer(1, 1, 22050);
  3079. var source = this.context.createBufferSource();
  3080. source.buffer = buffer;
  3081. source.connect(this.destination);
  3082. source.start(0);
  3083. setTimeout(this.checkIfUnlocked.bind(this, source, 0), 0)
  3084. }
  3085. ;
  3086. WebAudioOut.prototype.checkIfUnlocked = function(source, attempt) {
  3087. if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {
  3088. this.unlocked = true;
  3089. if (this.unlockCallback) {
  3090. this.unlockCallback();
  3091. this.unlockCallback = null
  3092. }
  3093. } else if (attempt < 10) {
  3094. setTimeout(this.checkIfUnlocked.bind(this, source, attempt + 1), 100)
  3095. }
  3096. }
  3097. ;
  3098. WebAudioOut.NeedsUnlocking = function() {
  3099. return /iPhone|iPad|iPod/i.test(navigator.userAgent)
  3100. }
  3101. ;
  3102. WebAudioOut.IsSupported = function() {
  3103. return window.AudioContext || window.webkitAudioContext
  3104. }
  3105. ;
  3106. WebAudioOut.CachedContext = null;
  3107. return WebAudioOut
  3108. }();
  3109. JSMpeg.WASMModule = function() {
  3110. "use strict";
  3111. var WASM = function() {
  3112. this.stackSize = 5 * 1024 * 1024;
  3113. this.pageSize = 64 * 1024;
  3114. this.onInitCallback = null
  3115. };
  3116. WASM.prototype.write = function(buffer) {
  3117. this.loadFromBuffer(buffer, this.onInitCallback)
  3118. }
  3119. ;
  3120. WASM.prototype.loadFromFile = function(url, callback) {
  3121. this.onInitCallback = callback;
  3122. var ajax = new JSMpeg.Source.Ajax(url);
  3123. ajax.connect(this);
  3124. ajax.start()
  3125. }
  3126. ;
  3127. WASM.prototype.loadFromBuffer = function(buffer, callback) {
  3128. this.moduleInfo = this.readDylinkSection(buffer);
  3129. if (!this.moduleInfo) {
  3130. this.callback && this.callback(null);
  3131. return
  3132. }
  3133. this.memory = new WebAssembly.Memory({
  3134. initial: 256
  3135. });
  3136. var env = {
  3137. memory: this.memory,
  3138. memoryBase: 0,
  3139. __memory_base: 0,
  3140. table: new WebAssembly.Table({
  3141. initial: this.moduleInfo.tableSize,
  3142. element: "anyfunc"
  3143. }),
  3144. tableBase: 0,
  3145. __table_base: 0,
  3146. abort: this.c_abort.bind(this),
  3147. ___assert_fail: this.c_assertFail.bind(this),
  3148. _sbrk: this.c_sbrk.bind(this)
  3149. };
  3150. this.brk = this.align(this.moduleInfo.memorySize + this.stackSize);
  3151. WebAssembly.instantiate(buffer, {
  3152. env: env
  3153. }).then(function(results) {
  3154. this.instance = results.instance;
  3155. if (this.instance.exports.__post_instantiate) {
  3156. this.instance.exports.__post_instantiate()
  3157. }
  3158. this.createHeapViews();
  3159. callback && callback(this)
  3160. }
  3161. .bind(this))
  3162. }
  3163. ;
  3164. WASM.prototype.createHeapViews = function() {
  3165. this.instance.heapU8 = new Uint8Array(this.memory.buffer);
  3166. this.instance.heapU32 = new Uint32Array(this.memory.buffer);
  3167. this.instance.heapF32 = new Float32Array(this.memory.buffer)
  3168. }
  3169. ;
  3170. WASM.prototype.align = function(addr) {
  3171. var a = Math.pow(2, this.moduleInfo.memoryAlignment);
  3172. return Math.ceil(addr / a) * a
  3173. }
  3174. ;
  3175. WASM.prototype.c_sbrk = function(size) {
  3176. var previousBrk = this.brk;
  3177. this.brk += size;
  3178. if (this.brk > this.memory.buffer.byteLength) {
  3179. var bytesNeeded = this.brk - this.memory.buffer.byteLength;
  3180. var pagesNeeded = Math.ceil(bytesNeeded / this.pageSize);
  3181. this.memory.grow(pagesNeeded);
  3182. this.createHeapViews()
  3183. }
  3184. return previousBrk
  3185. }
  3186. ;
  3187. WASM.prototype.c_abort = function(size) {
  3188. console.warn("JSMPeg: WASM abort", arguments)
  3189. }
  3190. ;
  3191. WASM.prototype.c_assertFail = function(size) {
  3192. console.warn("JSMPeg: WASM ___assert_fail", arguments)
  3193. }
  3194. ;
  3195. WASM.prototype.readDylinkSection = function(buffer) {
  3196. var bytes = new Uint8Array(buffer);
  3197. var next = 0;
  3198. var readVarUint = function() {
  3199. var ret = 0;
  3200. var mul = 1;
  3201. while (1) {
  3202. var byte = bytes[next++];
  3203. ret += (byte & 127) * mul;
  3204. mul *= 128;
  3205. if (!(byte & 128)) {
  3206. return ret
  3207. }
  3208. }
  3209. };
  3210. var matchNextBytes = function(expected) {
  3211. for (var i = 0; i < expected.length; i++) {
  3212. var b = typeof expected[i] === "string" ? expected[i].charCodeAt(0) : expected[i];
  3213. if (bytes[next++] !== b) {
  3214. return false
  3215. }
  3216. }
  3217. return true
  3218. };
  3219. if (!matchNextBytes([0, "a", "s", "m"])) {
  3220. console.warn("JSMpeg: WASM header not found");
  3221. return null
  3222. }
  3223. var next = 9;
  3224. var sectionSize = readVarUint();
  3225. if (!matchNextBytes([6, "d", "y", "l", "i", "n", "k"])) {
  3226. console.warn("JSMpeg: No dylink section found in WASM");
  3227. return null
  3228. }
  3229. return {
  3230. memorySize: readVarUint(),
  3231. memoryAlignment: readVarUint(),
  3232. tableSize: readVarUint(),
  3233. tableAlignment: readVarUint()
  3234. }
  3235. }
  3236. ;
  3237. WASM.IsSupported = function() {
  3238. return !!window.WebAssembly
  3239. }
  3240. ;
  3241. return WASM
  3242. }();
  3243. JSMpeg.WASM_BINARY_INLINED = "AGFzbQEAAAAADgZkeWxpbmvgzcACBCAAATgKYAF/AGAEf39/fwBgAX8Bf2ACf38Bf2ACf38AYAF/AX1gBn9/f39/fwBgA39/fwF/YAAAYAABfAJuBwNlbnYGbWVtb3J5AgCAAgNlbnYFdGFibGUBcAAgA2VudgptZW1vcnlCYXNlA38AA2Vudgl0YWJsZUJhc2UDfwADZW52BWFib3J0AAADZW52Dl9fX2Fzc2VydF9mYWlsAAEDZW52BV9zYnJrAAIDPz4DAAMCBAQAAgUCAgICAgICAAQABgAEAQABAQEDAAMCBAQCAgICAgEBAwADAgMCAwICAgIABAAAAwcHBwgICQahASB/AUEAC38BQQALfwBBGwt/AEEaC38AQRwLfwBBHQt/AEEeC38AQRALfwBBGQt/AEERC38AQRULfwBBEwt/AEEXC38AQRgLfwBBFgt/AEESC38AQRQLfwBBAQt/AEEPC38AQQILfwBBBgt/AEEOC38AQQkLfwBBDQt/AEEIC38AQQsLfwBBBAt/AEEKC38AQQMLfwBBDAt/AEEHC38AQQULB9YMPhJfX3Bvc3RfaW5zdGFudGlhdGUAPwVfZnJlZQA5B19tYWxsb2MAMgdfbWVtY3B5ADsIX21lbW1vdmUAPAdfbWVtc2V0AD0TX21wMl9kZWNvZGVyX2NyZWF0ZQAeE19tcDJfZGVjb2Rlcl9kZWNvZGUAJxRfbXAyX2RlY29kZXJfZGVzdHJveQAfFl9tcDJfZGVjb2Rlcl9kaWRfd3JpdGUAIxZfbXAyX2RlY29kZXJfZ2V0X2luZGV4ACEhX21wMl9kZWNvZGVyX2dldF9sZWZ0X2NoYW5uZWxfcHRyACUiX21wMl9kZWNvZGVyX2dldF9yaWdodF9jaGFubmVsX3B0cgAmHF9tcDJfZGVjb2Rlcl9nZXRfc2FtcGxlX3JhdGUAJBpfbXAyX2RlY29kZXJfZ2V0X3dyaXRlX3B0cgAgFl9tcDJfZGVjb2Rlcl9zZXRfaW5kZXgAIhVfbXBlZzFfZGVjb2Rlcl9jcmVhdGUAAxVfbXBlZzFfZGVjb2Rlcl9kZWNvZGUAEhZfbXBlZzFfZGVjb2Rlcl9kZXN0cm95AAQYX21wZWcxX2RlY29kZXJfZGlkX3dyaXRlAAgZX21wZWcxX2RlY29kZXJfZ2V0X2NiX3B0cgARHV9tcGVnMV9kZWNvZGVyX2dldF9jb2RlZF9zaXplAAwZX21wZWcxX2RlY29kZXJfZ2V0X2NyX3B0cgAQHV9tcGVnMV9kZWNvZGVyX2dldF9mcmFtZV9yYXRlAAsZX21wZWcxX2RlY29kZXJfZ2V0X2hlaWdodAAOGF9tcGVnMV9kZWNvZGVyX2dldF9pbmRleAAGGF9tcGVnMV9kZWNvZGVyX2dldF93aWR0aAANHF9tcGVnMV9kZWNvZGVyX2dldF93cml0ZV9wdHIABRhfbXBlZzFfZGVjb2Rlcl9nZXRfeV9wdHIADyJfbXBlZzFfZGVjb2Rlcl9oYXNfc2VxdWVuY2VfaGVhZGVyAAoYX21wZWcxX2RlY29kZXJfc2V0X2luZGV4AAcLcnVuUG9zdFNldHMAPghmcCRfZnJlZQMECmZwJF9tYWxsb2MDBQpmcCRfbWVtY3B5AwYLZnAkX21lbW1vdmUDBwpmcCRfbWVtc2V0AwgWZnAkX21wMl9kZWNvZGVyX2NyZWF0ZQMJFmZwJF9tcDJfZGVjb2Rlcl9kZWNvZGUDChdmcCRfbXAyX2RlY29kZXJfZGVzdHJveQMLGWZwJF9tcDJfZGVjb2Rlcl9kaWRfd3JpdGUDDBlmcCRfbXAyX2RlY29kZXJfZ2V0X2luZGV4Aw0kZnAkX21wMl9kZWNvZGVyX2dldF9sZWZ0X2NoYW5uZWxfcHRyAw4lZnAkX21wMl9kZWNvZGVyX2dldF9yaWdodF9jaGFubmVsX3B0cgMPH2ZwJF9tcDJfZGVjb2Rlcl9nZXRfc2FtcGxlX3JhdGUDEB1mcCRfbXAyX2RlY29kZXJfZ2V0X3dyaXRlX3B0cgMRGWZwJF9tcDJfZGVjb2Rlcl9zZXRfaW5kZXgDEhhmcCRfbXBlZzFfZGVjb2Rlcl9jcmVhdGUDExhmcCRfbXBlZzFfZGVjb2Rlcl9kZWNvZGUDFBlmcCRfbXBlZzFfZGVjb2Rlcl9kZXN0cm95AxUbZnAkX21wZWcxX2RlY29kZXJfZGlkX3dyaXRlAxYcZnAkX21wZWcxX2RlY29kZXJfZ2V0X2NiX3B0cgMXIGZwJF9tcGVnMV9kZWNvZGVyX2dldF9jb2RlZF9zaXplAxgcZnAkX21wZWcxX2RlY29kZXJfZ2V0X2NyX3B0cgMZIGZwJF9tcGVnMV9k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QQN0IQUgAEGEAWohAyAGIAFBAnEEfyAFBUEAC2oFIABBjAFqIQMgAEGIAWohBiAAKAIYIgVBAXUhAiABQQRHBEAgBiEDCyAAKAJUQQN0IAVBAnQgACgCUGxqCyEBIAJBeGohAiADKAIAIQMgBEEBRiEEIABBnAFqIQAgCCgCAARAIAQEQCAAKAIAQYABakEIdSADIAEgAhAZIABBADYCAAUgABAaIAAgAyABIAIQGyAAQQBBgAIQPRoLBSAEBEAgACgCAEGAAWpBCHUgAyABIAIQHCAAQQA2AgAFIAAQGiAAIAMgASACEB0gAEEAQYACED0aCwsL8gYAIAEgAmogAEEASgR/IAAFQQAiAAtB/wFIBH8gAAVB/wELQf8BcSIAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIANBCGoiAyACaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAMgAmoiAmogADoAACABIAJBAWpqIAA6AAAgASACQQJqaiAAOgAAIAEgAkEDamogADoAACABIAJBBGpqIAA6AAAgASACQQVqaiAAOgAAIAEgAkEGamogADoAACABIAJBB2pqIAA6AAAgASADIAJqIgJqIAA6AAAgASACQQFqaiAAOgAAIAEgAkECamogADoAACABIAJBA2pqIAA6AAAgASACQQRqaiAAOgAAIAEgAkEFamogADoAACABIAJBBmpqIAA6AAAgASACQQdqaiAAOgAAIAEgAyACaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAMgAmoiAmogADoAACABIAJBAWpqIAA6AAAgASACQQJqaiAAOgAAIAEgAkEDamogADoAACABIAJBBGpqIAA6AAAgASACQQVqaiAAOgAAIAEgAkEGamogADoAACABIAJBB2pqIAA6AAAgASADIAJqIgJqIAA6AAAgASACQQFqaiAAOgAAIAEgAkECamogADoAACABIAJBA2pqIAA6AAAgASACQQRqaiAAOgAAIAEgAkEFamogADoAACABIAJBBmpqIAA6AAAgASACQQdqaiAAOgAAIAEgAyACaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAAAubBgEVfwNAIAAgAUEwakECdGoiDygCACIHIAAgAUEQakECdGoiCCgCACIDaiEEIAAgAUE4akECdGoiCygCACIFIAAgAUEIakECdGoiECgCACICaiEGIAAgAUECdGoiCSgCACIMIAAgAUEgakECdGoiESgCACIKayINIAMgB2tB6gJsQYABakEIdSAEayIOaiEHIAAgAUEoakECdGoiEigCACIDIAAgAUEYakECdGoiFCgCACITayIVQbx+bEGAAWogAiAFayICQdkDbGpBCHUgBiATIANqIhNqIgNrIgUgBiATa0HqAmxBgAFqQQh1ayIGIBVB2QNsQYABaiACQcQBbGpBCHVqIQIgCSAMIApqIgkgBGoiDCADajYCACAQIAUgB2o2AgAgCCANIA5rIgggBms2AgAgFCAJIARrIgQgAmo2AgAgESAEIAJrNgIAIBIgBiAIajYCACAPIAcgBWs2AgAgCyAMIANrNgIAIAFBAWoiAUEIRw0AC0EAIQEDQCAAIAFBB3JBAnRqIg8oAgAiByAAIAFBAXJBAnRqIggoAgAiA2ohBCAAIAFBAnRqIgIoAgAiCyAAIAFBBHJBAnRqIhAoAgAiCWshBiAAIAFBBXJBAnRqIgwoAgAiBSAAIAFBA3JBAnRqIhEoAgAiCmsiDUG8fmxBgAFqIAMgB2siDkHZA2xqQQh1IAQgCiAFaiIFaiIHayIDIAQgBWtB6gJsQYABakEIdWsiBCANQdkDbEGAAWogDkHEAWxqQQh1aiEFIAIgB0GAAWogCyAJaiILIAAgAUEGckECdGoiCSgCACIKIAAgAUECckECdGoiDSgCACIOaiICaiISakEIdTYCACAIIAYgDiAKa0HqAmxBgAFqQQh1IAJrIghqQYAB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AWsOAwABAgMLIAMgASgCACIEOgAAIAMgASwAAToAASADIAEsAAI6AAIgASACQWxqQXBxIghBE2oiCWohByACQW1qIQogAkF9aiEGIANBA2ohAiABQQNqIQEDQCACIAEoAgEiBUEIdCAEQRh2cjYCACACIAEoAgUiBEEIdCAFQRh2cjYCBCACIAEoAgkiBUEIdCAEQRh2cjYCCCACIAEoAg0iBEEIdCAFQRh2cjYCDCABQRBqIQEgAkEQaiECIAZBcGoiBkEQSw0ACyAKIAhrIQIgByEBIAMgCWohAwwECyADIAEoAgAiBDoAACADIAEsAAE6AAEgASACQWxqQXBxIghBEmoiCWohByACQW5qIQogAkF+aiEGIANBAmohAiABQQJqIQEDQCACIAEoAgIiBUEQdCAEQRB2cjYCACACIAEoAgYiBEEQdCAFQRB2cjYCBCACIAEoAgoiBUEQdCAEQRB2cjYCCCACIAEoAg4iBEEQdCAFQRB2cjYCDCABQRBqIQEgAkEQaiECIAZBcGoiBkERSw0ACyAKIAhrIQIgByEBIAMgCWohAwwDCyADIAEoAgAiBDoAACABIAJBbGpBcHEiCEERaiIJaiEHIAJBb2ohCiACQX9qIQYgA0EBaiECIAFBAWohAQNAIAIgASgCAyIFQRh0IARBCHZyNgIAIAIgASgCByIEQRh0IAVBCHZyNgIEIAIgASgCCyIFQRh0IARBCHZyNgIIIAIgASgCDyIEQRh0IAVBCHZyNgIMIAFBEGohASACQRBqIQIgBkFwaiIGQRJLDQALIAogCGshAiAHIQEgAyAJaiEDCwsLIAJBEHEEQCADIAEsAAA6AAAgAyABLAABOgABIAMgASwAAjoAAiADIAEsAAM6AAMgAyABLAAEOgAEIAMgASwABToABSADIAEsAAY6AAYgAyABLAAHOgAHIAMgASwACDoACCADIAEsAAk6AAkgAyABLAAKOgAKIAMgASwACzoACyADIAEsAAw6AAwgAyABLAANOgANIAMgASwADjoADiADIAEsAA86AA8gAUEQaiEBIANBEGohAwsgAkEIcQRAIAMgASwAADoAACADIAEsAAE6AAEgAyABLAACOgACIAMgASwAAzoAAyADIAEsAAQ6AAQgAyABLAAFOgAFIAMgASwABjoABiADIAEsAAc6AAcgAUEIaiEBIANB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LjU8PTYvNz4/CBATFhobHSIQEBYYGx0iJRMWGhsdIiImFhYaGx0iJSgWGhsdICMoMBobHSAjKDA6GhsdIiYuOEUbHSMmLjhFUyAsKiYgGREJLD46NCwjGAwqOjcxKiEXDCY0MSwmHhQKICwqJiAZEQkZIyEeGRQOBxEYFxQRDgkFCQwMCgkHBQIAAAEBAQICAgICAgICAgAAAAAAAAAAAQEBAgICAgIAAAgIDFtbW15bXkRENDQ0NDQ0NDQ0NAAAAAAAAAAAAAAAAAAAAAAAAAAAQ0NDQkJCQkJCQkIxMTExMTExMTExMTEgICAgICAgAABFRUVFNDQ0NDQ0NCQkJCQkJCQkJCQkJCQkJCQkJCQAAAABAhEAAAAAAAAAAAAAAAAAAQIDBAUGEQAAAAAAAAAAAAECAwQFBgcICQoLDA0OEQABAwUGBwgJCgsMDQ4PEBEAAQIEBQYHCAkKCwwNDg8RAAECAwQFBgcICQoLDA0OD3NpemUgPiAwAEQ6L3Nydi9lbXNkay9lbXNjcmlwdGVuLzEuMzguNS9zeXN0ZW0vbGliL2VtbWFsbG9jLmNwcABnZXRGcmVlTGlzdEluZGV4AE1JTl9GUkVFTElTVF9JTkRFWCA8PSBpbmRleCAmJiBpbmRleCA8IE1BWF9GUkVFTElTVF9JTkRFWABnZXRBZnRlcihyZWdpb24pIDw9IHNicmsoMCkAZW1tYWxsb2NfbWFsbG9jAHJlZ2lvbi0+Z2V0VXNlZCgpAGdldFBheWxvYWQAKGNoYXIqKWV4dHJhUHRyID09IChjaGFyKilwdHIgKyBzYnJrU2l6ZQBhbGxvY2F0ZVJlZ2lvbgAhbGFzdFJlZ2lvbgAhZmlyc3RSZWdpb24AZmlyc3RSZWdpb24AcHRyID09IGdldEFmdGVyKGxhc3RSZWdpb24pAGV4dGVuZExhc3RSZWdpb24AYWRkVG9GcmVlTGlzdABnZXRCaWdFbm91Z2hGcmVlTGlzdEluZGV4AHBheWxvYWRTaXplID49IHNpemUAcG9zc2libHlTcGxpdFJlbWFpbmRlcgBleHRyYSA+PSBNSU5fUkVHSU9OX1NJWkUAdG90YWxTcGxpdFNpemUgPj0gTUlOX1JFR0lPTl9TSVpFAG1lcmdlSW50b0V4aXN0aW5nRnJlZVJlZ2lvbgByZWdpb24gPT0gbGFzdFJlZ2lvbgBlbW1hbGxvY19yZWFsbG9j";