jsmpeg.min.js 176 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209
  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
  12. ? window.performance.now() / 1e3
  13. : Date.now() / 1e3;
  14. },
  15. CreateVideoElements: function () {
  16. var elements = document.querySelectorAll('.jsmpeg');
  17. for (var i = 0; i < elements.length; i++) {
  18. new JSMpeg.VideoElement(elements[i]);
  19. }
  20. },
  21. Fill: function (array, value) {
  22. if (array.fill) {
  23. array.fill(value);
  24. } else {
  25. for (var i = 0; i < array.length; i++) {
  26. array[i] = value;
  27. }
  28. }
  29. },
  30. Base64ToArrayBuffer: function (base64) {
  31. var binary = window.atob(base64);
  32. var length = binary.length;
  33. var bytes = new Uint8Array(length);
  34. for (var i = 0; i < length; i++) {
  35. bytes[i] = binary.charCodeAt(i);
  36. }
  37. return bytes.buffer;
  38. },
  39. WASM_BINARY_INLINED: null,
  40. };
  41. if (document.readyState === 'complete') {
  42. JSMpeg.CreateVideoElements();
  43. } else {
  44. document.addEventListener('DOMContentLoaded', JSMpeg.CreateVideoElements);
  45. }
  46. JSMpeg.VideoElement = (function () {
  47. 'use strict';
  48. var VideoElement = function (element) {
  49. var url = element.dataset.url;
  50. if (!url) {
  51. throw 'VideoElement has no `data-url` attribute';
  52. }
  53. var addStyles = function (element, styles) {
  54. for (var name in styles) {
  55. element.style[name] = styles[name];
  56. }
  57. };
  58. this.container = element;
  59. addStyles(this.container, {
  60. display: 'inline-block',
  61. position: 'relative',
  62. minWidth: '80px',
  63. minHeight: '80px',
  64. });
  65. this.canvas = document.createElement('canvas');
  66. this.canvas.width = 960;
  67. this.canvas.height = 540;
  68. addStyles(this.canvas, { display: 'block', width: '100%' });
  69. this.container.appendChild(this.canvas);
  70. this.playButton = document.createElement('div');
  71. this.playButton.innerHTML = VideoElement.PLAY_BUTTON;
  72. addStyles(this.playButton, {
  73. zIndex: 2,
  74. position: 'absolute',
  75. top: '0',
  76. bottom: '0',
  77. left: '0',
  78. right: '0',
  79. maxWidth: '75px',
  80. maxHeight: '75px',
  81. margin: 'auto',
  82. opacity: '0.7',
  83. cursor: 'pointer',
  84. });
  85. this.container.appendChild(this.playButton);
  86. var options = { canvas: this.canvas };
  87. for (var option in element.dataset) {
  88. try {
  89. options[option] = JSON.parse(element.dataset[option]);
  90. } catch (err) {
  91. options[option] = element.dataset[option];
  92. }
  93. }
  94. this.player = new JSMpeg.Player(url, options);
  95. element.playerInstance = this.player;
  96. if (options.poster && !options.autoplay && !this.player.options.streaming) {
  97. options.decodeFirstFrame = false;
  98. this.poster = new Image();
  99. this.poster.src = options.poster;
  100. this.poster.addEventListener('load', this.posterLoaded);
  101. addStyles(this.poster, {
  102. display: 'block',
  103. zIndex: 1,
  104. position: 'absolute',
  105. top: 0,
  106. left: 0,
  107. bottom: 0,
  108. right: 0,
  109. });
  110. this.container.appendChild(this.poster);
  111. }
  112. if (!this.player.options.streaming) {
  113. this.container.addEventListener('click', this.onClick.bind(this));
  114. }
  115. if (options.autoplay || this.player.options.streaming) {
  116. this.playButton.style.display = 'none';
  117. }
  118. if (this.player.audioOut && !this.player.audioOut.unlocked) {
  119. var unlockAudioElement = this.container;
  120. if (options.autoplay || this.player.options.streaming) {
  121. this.unmuteButton = document.createElement('div');
  122. this.unmuteButton.innerHTML = VideoElement.UNMUTE_BUTTON;
  123. addStyles(this.unmuteButton, {
  124. zIndex: 2,
  125. position: 'absolute',
  126. bottom: '10px',
  127. right: '20px',
  128. width: '75px',
  129. height: '75px',
  130. margin: 'auto',
  131. opacity: '0.7',
  132. cursor: 'pointer',
  133. });
  134. this.container.appendChild(this.unmuteButton);
  135. unlockAudioElement = this.unmuteButton;
  136. }
  137. this.unlockAudioBound = this.onUnlockAudio.bind(this, unlockAudioElement);
  138. unlockAudioElement.addEventListener(
  139. 'touchstart',
  140. this.unlockAudioBound,
  141. false
  142. );
  143. unlockAudioElement.addEventListener('click', this.unlockAudioBound, true);
  144. }
  145. };
  146. VideoElement.prototype.onUnlockAudio = function (element, ev) {
  147. if (this.unmuteButton) {
  148. ev.preventDefault();
  149. ev.stopPropagation();
  150. }
  151. this.player.audioOut.unlock(
  152. function () {
  153. if (this.unmuteButton) {
  154. this.unmuteButton.style.display = 'none';
  155. }
  156. element.removeEventListener('touchstart', this.unlockAudioBound);
  157. element.removeEventListener('click', this.unlockAudioBound);
  158. }.bind(this)
  159. );
  160. };
  161. VideoElement.prototype.onClick = function (ev) {
  162. if (this.player.isPlaying) {
  163. this.player.pause();
  164. this.playButton.style.display = 'block';
  165. } else {
  166. this.player.play();
  167. this.playButton.style.display = 'none';
  168. if (this.poster) {
  169. this.poster.style.display = 'none';
  170. }
  171. }
  172. };
  173. VideoElement.PLAY_BUTTON =
  174. '<svg style="max-width: 75px; max-height: 75px;" ' +
  175. 'viewBox="0 0 200 200" alt="Play video">' +
  176. '<circle cx="100" cy="100" r="90" fill="none" ' +
  177. 'stroke-width="15" stroke="#fff"/>' +
  178. '<polygon points="70, 55 70, 145 145, 100" fill="#fff"/>' +
  179. '</svg>';
  180. VideoElement.UNMUTE_BUTTON =
  181. '<svg style="max-width: 75px; max-height: 75px;" viewBox="0 0 75 75">' +
  182. '<polygon class="audio-speaker" stroke="none" fill="#fff" ' +
  183. 'points="39,13 22,28 6,28 6,47 21,47 39,62 39,13"/>' +
  184. '<g stroke="#fff" stroke-width="5">' +
  185. '<path d="M 49,50 69,26"/>' +
  186. '<path d="M 69,50 49,26"/>' +
  187. '</g>' +
  188. '</svg>';
  189. return VideoElement;
  190. })();
  191. JSMpeg.Player = (function () {
  192. 'use strict';
  193. var Player = function (url, options) {
  194. this.options = options || {};
  195. if (options.source) {
  196. this.source = new options.source(url, options);
  197. options.streaming = !!this.source.streaming;
  198. } else if (url.match(/^wss?:\/\//)) {
  199. this.source = new JSMpeg.Source.WebSocket(url, options);
  200. options.streaming = true;
  201. } else if (options.progressive !== false) {
  202. this.source = new JSMpeg.Source.AjaxProgressive(url, options);
  203. options.streaming = false;
  204. } else {
  205. this.source = new JSMpeg.Source.Ajax(url, options);
  206. options.streaming = false;
  207. }
  208. this.maxAudioLag = options.maxAudioLag || 0.25;
  209. this.loop = options.loop !== false;
  210. this.autoplay = !!options.autoplay || options.streaming;
  211. this.demuxer = new JSMpeg.Demuxer.TS(options);
  212. this.source.connect(this.demuxer);
  213. if (!options.disableWebAssembly && JSMpeg.WASMModule.IsSupported()) {
  214. this.wasmModule = JSMpeg.WASMModule.GetModule();
  215. options.wasmModule = this.wasmModule;
  216. }
  217. if (options.video !== false) {
  218. this.video = options.wasmModule
  219. ? new JSMpeg.Decoder.MPEG1VideoWASM(options)
  220. : new JSMpeg.Decoder.MPEG1Video(options);
  221. this.renderer =
  222. !options.disableGl && JSMpeg.Renderer.WebGL.IsSupported()
  223. ? new JSMpeg.Renderer.WebGL(options)
  224. : new JSMpeg.Renderer.Canvas2D(options);
  225. this.demuxer.connect(JSMpeg.Demuxer.TS.STREAM.VIDEO_1, this.video);
  226. this.video.connect(this.renderer);
  227. }
  228. if (options.audio !== false && JSMpeg.AudioOutput.WebAudio.IsSupported()) {
  229. this.audio = options.wasmModule
  230. ? new JSMpeg.Decoder.MP2AudioWASM(options)
  231. : new JSMpeg.Decoder.MP2Audio(options);
  232. this.audioOut = new JSMpeg.AudioOutput.WebAudio(options);
  233. this.demuxer.connect(JSMpeg.Demuxer.TS.STREAM.AUDIO_1, this.audio);
  234. this.audio.connect(this.audioOut);
  235. }
  236. Object.defineProperty(this, 'currentTime', {
  237. get: this.getCurrentTime,
  238. set: this.setCurrentTime,
  239. });
  240. Object.defineProperty(this, 'volume', {
  241. get: this.getVolume,
  242. set: this.setVolume,
  243. });
  244. this.paused = true;
  245. this.unpauseOnShow = false;
  246. if (options.pauseWhenHidden !== false) {
  247. document.addEventListener('visibilitychange', this.showHide.bind(this));
  248. }
  249. if (this.wasmModule) {
  250. if (this.wasmModule.ready) {
  251. this.startLoading();
  252. } else if (JSMpeg.WASM_BINARY_INLINED) {
  253. var wasm = JSMpeg.Base64ToArrayBuffer(JSMpeg.WASM_BINARY_INLINED);
  254. this.wasmModule.loadFromBuffer(wasm, this.startLoading.bind(this));
  255. } else {
  256. this.wasmModule.loadFromFile(
  257. 'jsmpeg.wasm',
  258. this.startLoading.bind(this)
  259. );
  260. }
  261. } else {
  262. this.startLoading();
  263. }
  264. };
  265. Player.prototype.startLoading = function () {
  266. this.source.start();
  267. if (this.autoplay) {
  268. this.play();
  269. }
  270. };
  271. Player.prototype.showHide = function (ev) {
  272. if (document.visibilityState === 'hidden') {
  273. this.unpauseOnShow = this.wantsToPlay;
  274. this.pause();
  275. } else if (this.unpauseOnShow) {
  276. this.play();
  277. }
  278. };
  279. Player.prototype.play = function (ev) {
  280. if (this.animationId) {
  281. return;
  282. }
  283. this.animationId = requestAnimationFrame(this.update.bind(this));
  284. this.wantsToPlay = true;
  285. this.paused = false;
  286. };
  287. Player.prototype.pause = function (ev) {
  288. if (this.paused) {
  289. return;
  290. }
  291. cancelAnimationFrame(this.animationId);
  292. this.animationId = null;
  293. this.wantsToPlay = false;
  294. this.isPlaying = false;
  295. this.paused = true;
  296. if (this.audio && this.audio.canPlay) {
  297. this.audioOut.stop();
  298. this.seek(this.currentTime);
  299. }
  300. if (this.options.onPause) {
  301. this.options.onPause(this);
  302. }
  303. };
  304. Player.prototype.getVolume = function () {
  305. return this.audioOut ? this.audioOut.volume : 0;
  306. };
  307. Player.prototype.setVolume = function (volume) {
  308. if (this.audioOut) {
  309. this.audioOut.volume = volume;
  310. }
  311. };
  312. Player.prototype.stop = function (ev) {
  313. this.pause();
  314. this.seek(0);
  315. if (this.video && this.options.decodeFirstFrame !== false) {
  316. this.video.decode();
  317. }
  318. };
  319. Player.prototype.destroy = function () {
  320. this.pause();
  321. this.source.destroy();
  322. this.video && this.video.destroy();
  323. this.renderer && this.renderer.destroy();
  324. this.audio && this.audio.destroy();
  325. this.audioOut && this.audioOut.destroy();
  326. };
  327. Player.prototype.seek = function (time) {
  328. var startOffset =
  329. this.audio && this.audio.canPlay
  330. ? this.audio.startTime
  331. : this.video.startTime;
  332. if (this.video) {
  333. this.video.seek(time + startOffset);
  334. }
  335. if (this.audio) {
  336. this.audio.seek(time + startOffset);
  337. }
  338. this.startTime = JSMpeg.Now() - time;
  339. };
  340. Player.prototype.getCurrentTime = function () {
  341. return this.audio && this.audio.canPlay
  342. ? this.audio.currentTime - this.audio.startTime
  343. : this.video.currentTime - this.video.startTime;
  344. };
  345. Player.prototype.setCurrentTime = function (time) {
  346. this.seek(time);
  347. };
  348. Player.prototype.update = function () {
  349. this.animationId = requestAnimationFrame(this.update.bind(this));
  350. if (!this.source.established) {
  351. if (this.renderer) {
  352. this.renderer.renderProgress(this.source.progress);
  353. }
  354. return;
  355. }
  356. if (!this.isPlaying) {
  357. this.isPlaying = true;
  358. this.startTime = JSMpeg.Now() - this.currentTime;
  359. if (this.options.onPlay) {
  360. this.options.onPlay(this);
  361. }
  362. }
  363. if (this.options.streaming) {
  364. this.updateForStreaming();
  365. } else {
  366. this.updateForStaticFile();
  367. }
  368. };
  369. Player.prototype.updateForStreaming = function () {
  370. if (this.video) {
  371. this.video.decode();
  372. }
  373. if (this.audio) {
  374. var decoded = false;
  375. do {
  376. if (this.audioOut.enqueuedTime > this.maxAudioLag) {
  377. this.audioOut.resetEnqueuedTime();
  378. this.audioOut.enabled = false;
  379. }
  380. decoded = this.audio.decode();
  381. } while (decoded);
  382. this.audioOut.enabled = true;
  383. }
  384. };
  385. Player.prototype.nextFrame = function () {
  386. if (this.source.established && this.video) {
  387. return this.video.decode();
  388. }
  389. return false;
  390. };
  391. Player.prototype.updateForStaticFile = function () {
  392. var notEnoughData = false,
  393. headroom = 0;
  394. if (this.audio && this.audio.canPlay) {
  395. while (
  396. !notEnoughData &&
  397. this.audio.decodedTime - this.audio.currentTime < 0.25
  398. ) {
  399. notEnoughData = !this.audio.decode();
  400. }
  401. if (this.video && this.video.currentTime < this.audio.currentTime) {
  402. notEnoughData = !this.video.decode();
  403. }
  404. headroom = this.demuxer.currentTime - this.audio.currentTime;
  405. } else if (this.video) {
  406. var targetTime = JSMpeg.Now() - this.startTime + this.video.startTime,
  407. lateTime = targetTime - this.video.currentTime,
  408. frameTime = 1 / this.video.frameRate;
  409. if (this.video && lateTime > 0) {
  410. if (lateTime > frameTime * 2) {
  411. this.startTime += lateTime;
  412. }
  413. notEnoughData = !this.video.decode();
  414. }
  415. headroom = this.demuxer.currentTime - targetTime;
  416. }
  417. this.source.resume(headroom);
  418. if (notEnoughData && this.source.completed) {
  419. if (this.loop) {
  420. this.seek(0);
  421. } else {
  422. this.pause();
  423. if (this.options.onEnded) {
  424. this.options.onEnded(this);
  425. }
  426. }
  427. } else if (notEnoughData && this.options.onStalled) {
  428. this.options.onStalled(this);
  429. }
  430. };
  431. return Player;
  432. })();
  433. JSMpeg.BitBuffer = (function () {
  434. 'use strict';
  435. var BitBuffer = function (bufferOrLength, mode) {
  436. if (typeof bufferOrLength === 'object') {
  437. this.bytes =
  438. bufferOrLength instanceof Uint8Array
  439. ? bufferOrLength
  440. : new Uint8Array(bufferOrLength);
  441. this.byteLength = this.bytes.length;
  442. } else {
  443. this.bytes = new Uint8Array(bufferOrLength || 1024 * 1024);
  444. this.byteLength = 0;
  445. }
  446. this.mode = mode || BitBuffer.MODE.EXPAND;
  447. this.index = 0;
  448. };
  449. BitBuffer.prototype.resize = function (size) {
  450. var newBytes = new Uint8Array(size);
  451. if (this.byteLength !== 0) {
  452. this.byteLength = Math.min(this.byteLength, size);
  453. newBytes.set(this.bytes, 0, this.byteLength);
  454. }
  455. this.bytes = newBytes;
  456. this.index = Math.min(this.index, this.byteLength << 3);
  457. };
  458. BitBuffer.prototype.evict = function (sizeNeeded) {
  459. var bytePos = this.index >> 3,
  460. available = this.bytes.length - this.byteLength;
  461. if (
  462. this.index === this.byteLength << 3 ||
  463. sizeNeeded > available + bytePos
  464. ) {
  465. this.byteLength = 0;
  466. this.index = 0;
  467. return;
  468. } else if (bytePos === 0) {
  469. return;
  470. }
  471. if (this.bytes.copyWithin) {
  472. this.bytes.copyWithin(0, bytePos, this.byteLength);
  473. } else {
  474. this.bytes.set(this.bytes.subarray(bytePos, this.byteLength));
  475. }
  476. this.byteLength = this.byteLength - bytePos;
  477. this.index -= bytePos << 3;
  478. return;
  479. };
  480. BitBuffer.prototype.write = function (buffers) {
  481. var isArrayOfBuffers = typeof buffers[0] === 'object',
  482. totalLength = 0,
  483. available = this.bytes.length - this.byteLength;
  484. if (isArrayOfBuffers) {
  485. var totalLength = 0;
  486. for (var i = 0; i < buffers.length; i++) {
  487. totalLength += buffers[i].byteLength;
  488. }
  489. } else {
  490. totalLength = buffers.byteLength;
  491. }
  492. if (totalLength > available) {
  493. if (this.mode === BitBuffer.MODE.EXPAND) {
  494. var newSize = Math.max(this.bytes.length * 2, totalLength - available);
  495. this.resize(newSize);
  496. } else {
  497. this.evict(totalLength);
  498. }
  499. }
  500. if (isArrayOfBuffers) {
  501. for (var i = 0; i < buffers.length; i++) {
  502. this.appendSingleBuffer(buffers[i]);
  503. }
  504. } else {
  505. this.appendSingleBuffer(buffers);
  506. }
  507. return totalLength;
  508. };
  509. BitBuffer.prototype.appendSingleBuffer = function (buffer) {
  510. buffer = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
  511. this.bytes.set(buffer, this.byteLength);
  512. this.byteLength += buffer.length;
  513. };
  514. BitBuffer.prototype.findNextStartCode = function () {
  515. for (var i = (this.index + 7) >> 3; i < this.byteLength; i++) {
  516. if (
  517. this.bytes[i] == 0 &&
  518. this.bytes[i + 1] == 0 &&
  519. this.bytes[i + 2] == 1
  520. ) {
  521. this.index = (i + 4) << 3;
  522. return this.bytes[i + 3];
  523. }
  524. }
  525. this.index = this.byteLength << 3;
  526. return -1;
  527. };
  528. BitBuffer.prototype.findStartCode = function (code) {
  529. var current = 0;
  530. while (true) {
  531. current = this.findNextStartCode();
  532. if (current === code || current === -1) {
  533. return current;
  534. }
  535. }
  536. return -1;
  537. };
  538. BitBuffer.prototype.nextBytesAreStartCode = function () {
  539. var i = (this.index + 7) >> 3;
  540. return (
  541. i >= this.byteLength ||
  542. (this.bytes[i] == 0 && this.bytes[i + 1] == 0 && this.bytes[i + 2] == 1)
  543. );
  544. };
  545. BitBuffer.prototype.peek = function (count) {
  546. var offset = this.index;
  547. var value = 0;
  548. while (count) {
  549. var currentByte = this.bytes[offset >> 3],
  550. remaining = 8 - (offset & 7),
  551. read = remaining < count ? remaining : count,
  552. shift = remaining - read,
  553. mask = 255 >> (8 - read);
  554. value = (value << read) | ((currentByte & (mask << shift)) >> shift);
  555. offset += read;
  556. count -= read;
  557. }
  558. return value;
  559. };
  560. BitBuffer.prototype.read = function (count) {
  561. var value = this.peek(count);
  562. this.index += count;
  563. return value;
  564. };
  565. BitBuffer.prototype.skip = function (count) {
  566. return (this.index += count);
  567. };
  568. BitBuffer.prototype.rewind = function (count) {
  569. this.index = Math.max(this.index - count, 0);
  570. };
  571. BitBuffer.prototype.has = function (count) {
  572. return (this.byteLength << 3) - this.index >= count;
  573. };
  574. BitBuffer.MODE = { EVICT: 1, EXPAND: 2 };
  575. return BitBuffer;
  576. })();
  577. JSMpeg.Source.Ajax = (function () {
  578. 'use strict';
  579. var AjaxSource = function (url, options) {
  580. this.url = url;
  581. this.destination = null;
  582. this.request = null;
  583. this.streaming = false;
  584. this.completed = false;
  585. this.established = false;
  586. this.progress = 0;
  587. this.onEstablishedCallback = options.onSourceEstablished;
  588. this.onCompletedCallback = options.onSourceCompleted;
  589. };
  590. AjaxSource.prototype.connect = function (destination) {
  591. this.destination = destination;
  592. };
  593. AjaxSource.prototype.start = function () {
  594. this.request = new XMLHttpRequest();
  595. this.request.onreadystatechange = function () {
  596. if (
  597. this.request.readyState === this.request.DONE &&
  598. this.request.status === 200
  599. ) {
  600. this.onLoad(this.request.response);
  601. }
  602. }.bind(this);
  603. this.request.onprogress = this.onProgress.bind(this);
  604. this.request.open('GET', this.url);
  605. this.request.responseType = 'arraybuffer';
  606. this.request.send();
  607. };
  608. AjaxSource.prototype.resume = function (secondsHeadroom) {};
  609. AjaxSource.prototype.destroy = function () {
  610. this.request.abort();
  611. };
  612. AjaxSource.prototype.onProgress = function (ev) {
  613. this.progress = ev.loaded / ev.total;
  614. };
  615. AjaxSource.prototype.onLoad = function (data) {
  616. this.established = true;
  617. this.completed = true;
  618. this.progress = 1;
  619. if (this.onEstablishedCallback) {
  620. this.onEstablishedCallback(this);
  621. }
  622. if (this.onCompletedCallback) {
  623. this.onCompletedCallback(this);
  624. }
  625. if (this.destination) {
  626. this.destination.write(data);
  627. }
  628. };
  629. return AjaxSource;
  630. })();
  631. JSMpeg.Source.Fetch = (function () {
  632. 'use strict';
  633. var FetchSource = function (url, options) {
  634. this.url = url;
  635. this.destination = null;
  636. this.request = null;
  637. this.streaming = true;
  638. this.completed = false;
  639. this.established = false;
  640. this.progress = 0;
  641. this.aborted = false;
  642. this.onEstablishedCallback = options.onSourceEstablished;
  643. this.onCompletedCallback = options.onSourceCompleted;
  644. };
  645. FetchSource.prototype.connect = function (destination) {
  646. this.destination = destination;
  647. };
  648. FetchSource.prototype.start = function () {
  649. var params = { method: 'GET', headers: new Headers(), cache: 'default' };
  650. self
  651. .fetch(this.url, params)
  652. .then(
  653. function (res) {
  654. if (res.ok && res.status >= 200 && res.status <= 299) {
  655. this.progress = 1;
  656. this.established = true;
  657. return this.pump(res.body.getReader());
  658. } else {
  659. }
  660. }.bind(this)
  661. )
  662. .catch(function (err) {
  663. throw err;
  664. });
  665. };
  666. FetchSource.prototype.pump = function (reader) {
  667. return reader
  668. .read()
  669. .then(
  670. function (result) {
  671. if (result.done) {
  672. this.completed = true;
  673. } else {
  674. if (this.aborted) {
  675. return reader.cancel();
  676. }
  677. if (this.destination) {
  678. this.destination.write(result.value.buffer);
  679. }
  680. return this.pump(reader);
  681. }
  682. }.bind(this)
  683. )
  684. .catch(function (err) {
  685. throw err;
  686. });
  687. };
  688. FetchSource.prototype.resume = function (secondsHeadroom) {};
  689. FetchSource.prototype.abort = function () {
  690. this.aborted = true;
  691. };
  692. return FetchSource;
  693. })();
  694. JSMpeg.Source.AjaxProgressive = (function () {
  695. 'use strict';
  696. var AjaxProgressiveSource = function (url, options) {
  697. this.url = url;
  698. this.destination = null;
  699. this.request = null;
  700. this.streaming = false;
  701. this.completed = false;
  702. this.established = false;
  703. this.progress = 0;
  704. this.fileSize = 0;
  705. this.loadedSize = 0;
  706. this.chunkSize = options.chunkSize || 1024 * 1024;
  707. this.isLoading = false;
  708. this.loadStartTime = 0;
  709. this.throttled = options.throttled !== false;
  710. this.aborted = false;
  711. this.onEstablishedCallback = options.onSourceEstablished;
  712. this.onCompletedCallback = options.onSourceCompleted;
  713. };
  714. AjaxProgressiveSource.prototype.connect = function (destination) {
  715. this.destination = destination;
  716. };
  717. AjaxProgressiveSource.prototype.start = function () {
  718. this.request = new XMLHttpRequest();
  719. this.request.onreadystatechange = function () {
  720. if (this.request.readyState === this.request.DONE) {
  721. this.fileSize = parseInt(
  722. this.request.getResponseHeader('Content-Length')
  723. );
  724. this.loadNextChunk();
  725. }
  726. }.bind(this);
  727. this.request.onprogress = this.onProgress.bind(this);
  728. this.request.open('HEAD', this.url);
  729. this.request.send();
  730. };
  731. AjaxProgressiveSource.prototype.resume = function (secondsHeadroom) {
  732. if (this.isLoading || !this.throttled) {
  733. return;
  734. }
  735. var worstCaseLoadingTime = this.loadTime * 8 + 2;
  736. if (worstCaseLoadingTime > secondsHeadroom) {
  737. this.loadNextChunk();
  738. }
  739. };
  740. AjaxProgressiveSource.prototype.destroy = function () {
  741. this.request.abort();
  742. this.aborted = true;
  743. };
  744. AjaxProgressiveSource.prototype.loadNextChunk = function () {
  745. var start = this.loadedSize,
  746. end = Math.min(this.loadedSize + this.chunkSize - 1, this.fileSize - 1);
  747. if (start >= this.fileSize || this.aborted) {
  748. this.completed = true;
  749. if (this.onCompletedCallback) {
  750. this.onCompletedCallback(this);
  751. }
  752. return;
  753. }
  754. this.isLoading = true;
  755. this.loadStartTime = JSMpeg.Now();
  756. this.request = new XMLHttpRequest();
  757. this.request.onreadystatechange = function () {
  758. if (
  759. this.request.readyState === this.request.DONE &&
  760. this.request.status >= 200 &&
  761. this.request.status < 300
  762. ) {
  763. this.onChunkLoad(this.request.response);
  764. } else if (this.request.readyState === this.request.DONE) {
  765. if (this.loadFails++ < 3) {
  766. this.loadNextChunk();
  767. }
  768. }
  769. }.bind(this);
  770. if (start === 0) {
  771. this.request.onprogress = this.onProgress.bind(this);
  772. }
  773. this.request.open('GET', this.url + '?' + start + '-' + end);
  774. this.request.setRequestHeader('Range', 'bytes=' + start + '-' + end);
  775. this.request.responseType = 'arraybuffer';
  776. this.request.send();
  777. };
  778. AjaxProgressiveSource.prototype.onProgress = function (ev) {
  779. this.progress = ev.loaded / ev.total;
  780. };
  781. AjaxProgressiveSource.prototype.onChunkLoad = function (data) {
  782. var isFirstChunk = !this.established;
  783. this.established = true;
  784. this.progress = 1;
  785. this.loadedSize += data.byteLength;
  786. this.loadFails = 0;
  787. this.isLoading = false;
  788. if (isFirstChunk && this.onEstablishedCallback) {
  789. this.onEstablishedCallback(this);
  790. }
  791. if (this.destination) {
  792. this.destination.write(data);
  793. }
  794. this.loadTime = JSMpeg.Now() - this.loadStartTime;
  795. if (!this.throttled) {
  796. this.loadNextChunk();
  797. }
  798. };
  799. return AjaxProgressiveSource;
  800. })();
  801. JSMpeg.Source.WebSocket = (function () {
  802. 'use strict';
  803. var WSSource = function (url, options) {
  804. this.url = url;
  805. this.options = options;
  806. this.socket = null;
  807. this.streaming = true;
  808. this.callbacks = { connect: [], data: [] };
  809. this.destination = null;
  810. this.reconnectInterval =
  811. options.reconnectInterval !== undefined ? options.reconnectInterval : 5;
  812. this.shouldAttemptReconnect = !!this.reconnectInterval;
  813. this.completed = false;
  814. this.established = false;
  815. this.progress = 0;
  816. this.reconnectTimeoutId = 0;
  817. this.onEstablishedCallback = options.onSourceEstablished;
  818. this.onCompletedCallback = options.onSourceCompleted;
  819. };
  820. WSSource.prototype.connect = function (destination) {
  821. this.destination = destination;
  822. };
  823. WSSource.prototype.destroy = function () {
  824. clearTimeout(this.reconnectTimeoutId);
  825. this.shouldAttemptReconnect = false;
  826. this.socket.close();
  827. };
  828. WSSource.prototype.start = function () {
  829. this.shouldAttemptReconnect = !!this.reconnectInterval;
  830. this.progress = 0;
  831. this.established = false;
  832. if (this.options.protocols) {
  833. this.socket = new WebSocket(this.url, this.options.protocols);
  834. } else {
  835. this.socket = new WebSocket(this.url);
  836. }
  837. this.socket.binaryType = 'arraybuffer';
  838. this.socket.onmessage = this.onMessage.bind(this);
  839. this.socket.onopen = this.onOpen.bind(this);
  840. this.socket.onerror = this.onClose.bind(this);
  841. this.socket.onclose = this.onClose.bind(this);
  842. };
  843. WSSource.prototype.resume = function (secondsHeadroom) {};
  844. WSSource.prototype.onOpen = function () {
  845. this.progress = 1;
  846. };
  847. WSSource.prototype.onClose = function () {
  848. if (this.shouldAttemptReconnect) {
  849. clearTimeout(this.reconnectTimeoutId);
  850. this.reconnectTimeoutId = setTimeout(
  851. function () {
  852. this.start();
  853. }.bind(this),
  854. this.reconnectInterval * 1e3
  855. );
  856. }
  857. };
  858. WSSource.prototype.onMessage = function (ev) {
  859. var isFirstChunk = !this.established;
  860. this.established = true;
  861. if (isFirstChunk && this.onEstablishedCallback) {
  862. this.onEstablishedCallback(this);
  863. }
  864. if (this.destination) {
  865. this.destination.write(ev.data);
  866. }
  867. };
  868. return WSSource;
  869. })();
  870. JSMpeg.Demuxer.TS = (function () {
  871. 'use strict';
  872. var TS = function (options) {
  873. this.bits = null;
  874. this.leftoverBytes = null;
  875. this.guessVideoFrameEnd = true;
  876. this.pidsToStreamIds = {};
  877. this.pesPacketInfo = {};
  878. this.startTime = 0;
  879. this.currentTime = 0;
  880. };
  881. TS.prototype.connect = function (streamId, destination) {
  882. this.pesPacketInfo[streamId] = {
  883. destination: destination,
  884. currentLength: 0,
  885. totalLength: 0,
  886. pts: 0,
  887. buffers: [],
  888. };
  889. };
  890. TS.prototype.write = function (buffer) {
  891. if (this.leftoverBytes) {
  892. var totalLength = buffer.byteLength + this.leftoverBytes.byteLength;
  893. this.bits = new JSMpeg.BitBuffer(totalLength);
  894. this.bits.write([this.leftoverBytes, buffer]);
  895. } else {
  896. this.bits = new JSMpeg.BitBuffer(buffer);
  897. }
  898. while (this.bits.has(188 << 3) && this.parsePacket()) {}
  899. var leftoverCount = this.bits.byteLength - (this.bits.index >> 3);
  900. this.leftoverBytes =
  901. leftoverCount > 0 ? this.bits.bytes.subarray(this.bits.index >> 3) : null;
  902. };
  903. TS.prototype.parsePacket = function () {
  904. if (this.bits.read(8) !== 71) {
  905. if (!this.resync()) {
  906. return false;
  907. }
  908. }
  909. var end = (this.bits.index >> 3) + 187;
  910. var transportError = this.bits.read(1),
  911. payloadStart = this.bits.read(1),
  912. transportPriority = this.bits.read(1),
  913. pid = this.bits.read(13),
  914. transportScrambling = this.bits.read(2),
  915. adaptationField = this.bits.read(2),
  916. continuityCounter = this.bits.read(4);
  917. var streamId = this.pidsToStreamIds[pid];
  918. if (payloadStart && streamId) {
  919. var pi = this.pesPacketInfo[streamId];
  920. if (pi && pi.currentLength) {
  921. this.packetComplete(pi);
  922. }
  923. }
  924. if (adaptationField & 1) {
  925. if (adaptationField & 2) {
  926. var adaptationFieldLength = this.bits.read(8);
  927. this.bits.skip(adaptationFieldLength << 3);
  928. }
  929. if (payloadStart && this.bits.nextBytesAreStartCode()) {
  930. this.bits.skip(24);
  931. streamId = this.bits.read(8);
  932. this.pidsToStreamIds[pid] = streamId;
  933. var packetLength = this.bits.read(16);
  934. this.bits.skip(8);
  935. var ptsDtsFlag = this.bits.read(2);
  936. this.bits.skip(6);
  937. var headerLength = this.bits.read(8);
  938. var payloadBeginIndex = this.bits.index + (headerLength << 3);
  939. var pi = this.pesPacketInfo[streamId];
  940. if (pi) {
  941. var pts = 0;
  942. if (ptsDtsFlag & 2) {
  943. this.bits.skip(4);
  944. var p32_30 = this.bits.read(3);
  945. this.bits.skip(1);
  946. var p29_15 = this.bits.read(15);
  947. this.bits.skip(1);
  948. var p14_0 = this.bits.read(15);
  949. this.bits.skip(1);
  950. pts = (p32_30 * 1073741824 + p29_15 * 32768 + p14_0) / 9e4;
  951. this.currentTime = pts;
  952. if (this.startTime === -1) {
  953. this.startTime = pts;
  954. }
  955. }
  956. var payloadLength = packetLength
  957. ? packetLength - headerLength - 3
  958. : 0;
  959. this.packetStart(pi, pts, payloadLength);
  960. }
  961. this.bits.index = payloadBeginIndex;
  962. }
  963. if (streamId) {
  964. var pi = this.pesPacketInfo[streamId];
  965. if (pi) {
  966. var start = this.bits.index >> 3;
  967. var complete = this.packetAddData(pi, start, end);
  968. var hasPadding = !payloadStart && adaptationField & 2;
  969. if (complete || (this.guessVideoFrameEnd && hasPadding)) {
  970. this.packetComplete(pi);
  971. }
  972. }
  973. }
  974. }
  975. this.bits.index = end << 3;
  976. return true;
  977. };
  978. TS.prototype.resync = function () {
  979. if (!this.bits.has((188 * 6) << 3)) {
  980. return false;
  981. }
  982. var byteIndex = this.bits.index >> 3;
  983. for (var i = 0; i < 187; i++) {
  984. if (this.bits.bytes[byteIndex + i] === 71) {
  985. var foundSync = true;
  986. for (var j = 1; j < 5; j++) {
  987. if (this.bits.bytes[byteIndex + i + 188 * j] !== 71) {
  988. foundSync = false;
  989. break;
  990. }
  991. }
  992. if (foundSync) {
  993. this.bits.index = (byteIndex + i + 1) << 3;
  994. return true;
  995. }
  996. }
  997. }
  998. console.warn('JSMpeg: Possible garbage data. Skipping.');
  999. this.bits.skip(187 << 3);
  1000. return false;
  1001. };
  1002. TS.prototype.packetStart = function (pi, pts, payloadLength) {
  1003. pi.totalLength = payloadLength;
  1004. pi.currentLength = 0;
  1005. pi.pts = pts;
  1006. };
  1007. TS.prototype.packetAddData = function (pi, start, end) {
  1008. pi.buffers.push(this.bits.bytes.subarray(start, end));
  1009. pi.currentLength += end - start;
  1010. var complete = pi.totalLength !== 0 && pi.currentLength >= pi.totalLength;
  1011. return complete;
  1012. };
  1013. TS.prototype.packetComplete = function (pi) {
  1014. pi.destination.write(pi.pts, pi.buffers);
  1015. pi.totalLength = 0;
  1016. pi.currentLength = 0;
  1017. pi.buffers = [];
  1018. };
  1019. TS.STREAM = {
  1020. PACK_HEADER: 186,
  1021. SYSTEM_HEADER: 187,
  1022. PROGRAM_MAP: 188,
  1023. PRIVATE_1: 189,
  1024. PADDING: 190,
  1025. PRIVATE_2: 191,
  1026. AUDIO_1: 192,
  1027. VIDEO_1: 224,
  1028. DIRECTORY: 255,
  1029. };
  1030. return TS;
  1031. })();
  1032. JSMpeg.Decoder.Base = (function () {
  1033. 'use strict';
  1034. var BaseDecoder = function (options) {
  1035. this.destination = null;
  1036. this.canPlay = false;
  1037. this.collectTimestamps = !options.streaming;
  1038. this.bytesWritten = 0;
  1039. this.timestamps = [];
  1040. this.timestampIndex = 0;
  1041. this.startTime = 0;
  1042. this.decodedTime = 0;
  1043. Object.defineProperty(this, 'currentTime', { get: this.getCurrentTime });
  1044. };
  1045. BaseDecoder.prototype.destroy = function () {};
  1046. BaseDecoder.prototype.connect = function (destination) {
  1047. this.destination = destination;
  1048. };
  1049. BaseDecoder.prototype.bufferGetIndex = function () {
  1050. return this.bits.index;
  1051. };
  1052. BaseDecoder.prototype.bufferSetIndex = function (index) {
  1053. this.bits.index = index;
  1054. };
  1055. BaseDecoder.prototype.bufferWrite = function (buffers) {
  1056. return this.bits.write(buffers);
  1057. };
  1058. BaseDecoder.prototype.write = function (pts, buffers) {
  1059. if (this.collectTimestamps) {
  1060. if (this.timestamps.length === 0) {
  1061. this.startTime = pts;
  1062. this.decodedTime = pts;
  1063. }
  1064. this.timestamps.push({ index: this.bytesWritten << 3, time: pts });
  1065. }
  1066. this.bytesWritten += this.bufferWrite(buffers);
  1067. this.canPlay = true;
  1068. };
  1069. BaseDecoder.prototype.seek = function (time) {
  1070. if (!this.collectTimestamps) {
  1071. return;
  1072. }
  1073. this.timestampIndex = 0;
  1074. for (var i = 0; i < this.timestamps.length; i++) {
  1075. if (this.timestamps[i].time > time) {
  1076. break;
  1077. }
  1078. this.timestampIndex = i;
  1079. }
  1080. var ts = this.timestamps[this.timestampIndex];
  1081. if (ts) {
  1082. this.bufferSetIndex(ts.index);
  1083. this.decodedTime = ts.time;
  1084. } else {
  1085. this.bufferSetIndex(0);
  1086. this.decodedTime = this.startTime;
  1087. }
  1088. };
  1089. BaseDecoder.prototype.decode = function () {
  1090. this.advanceDecodedTime(0);
  1091. };
  1092. BaseDecoder.prototype.advanceDecodedTime = function (seconds) {
  1093. if (this.collectTimestamps) {
  1094. var newTimestampIndex = -1;
  1095. var currentIndex = this.bufferGetIndex();
  1096. for (var i = this.timestampIndex; i < this.timestamps.length; i++) {
  1097. if (this.timestamps[i].index > currentIndex) {
  1098. break;
  1099. }
  1100. newTimestampIndex = i;
  1101. }
  1102. if (
  1103. newTimestampIndex !== -1 &&
  1104. newTimestampIndex !== this.timestampIndex
  1105. ) {
  1106. this.timestampIndex = newTimestampIndex;
  1107. this.decodedTime = this.timestamps[this.timestampIndex].time;
  1108. return;
  1109. }
  1110. }
  1111. this.decodedTime += seconds;
  1112. };
  1113. BaseDecoder.prototype.getCurrentTime = function () {
  1114. return this.decodedTime;
  1115. };
  1116. return BaseDecoder;
  1117. })();
  1118. JSMpeg.Decoder.MPEG1Video = (function () {
  1119. 'use strict';
  1120. var MPEG1 = function (options) {
  1121. JSMpeg.Decoder.Base.call(this, options);
  1122. this.onDecodeCallback = options.onVideoDecode;
  1123. var bufferSize = options.videoBufferSize || 512 * 1024;
  1124. var bufferMode = options.streaming
  1125. ? JSMpeg.BitBuffer.MODE.EVICT
  1126. : JSMpeg.BitBuffer.MODE.EXPAND;
  1127. this.bits = new JSMpeg.BitBuffer(bufferSize, bufferMode);
  1128. this.customIntraQuantMatrix = new Uint8Array(64);
  1129. this.customNonIntraQuantMatrix = new Uint8Array(64);
  1130. this.blockData = new Int32Array(64);
  1131. this.currentFrame = 0;
  1132. this.decodeFirstFrame = options.decodeFirstFrame !== false;
  1133. };
  1134. MPEG1.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
  1135. MPEG1.prototype.constructor = MPEG1;
  1136. MPEG1.prototype.write = function (pts, buffers) {
  1137. JSMpeg.Decoder.Base.prototype.write.call(this, pts, buffers);
  1138. if (!this.hasSequenceHeader) {
  1139. if (this.bits.findStartCode(MPEG1.START.SEQUENCE) === -1) {
  1140. return false;
  1141. }
  1142. this.decodeSequenceHeader();
  1143. if (this.decodeFirstFrame) {
  1144. this.decode();
  1145. }
  1146. }
  1147. };
  1148. MPEG1.prototype.decode = function () {
  1149. var startTime = JSMpeg.Now();
  1150. if (!this.hasSequenceHeader) {
  1151. return false;
  1152. }
  1153. if (this.bits.findStartCode(MPEG1.START.PICTURE) === -1) {
  1154. var bufferedBytes = this.bits.byteLength - (this.bits.index >> 3);
  1155. return false;
  1156. }
  1157. this.decodePicture();
  1158. this.advanceDecodedTime(1 / this.frameRate);
  1159. var elapsedTime = JSMpeg.Now() - startTime;
  1160. if (this.onDecodeCallback) {
  1161. this.onDecodeCallback(this, elapsedTime);
  1162. }
  1163. return true;
  1164. };
  1165. MPEG1.prototype.readHuffman = function (codeTable) {
  1166. var state = 0;
  1167. do {
  1168. state = codeTable[state + this.bits.read(1)];
  1169. } while (state >= 0 && codeTable[state] !== 0);
  1170. return codeTable[state + 2];
  1171. };
  1172. MPEG1.prototype.frameRate = 30;
  1173. MPEG1.prototype.decodeSequenceHeader = function () {
  1174. var newWidth = this.bits.read(12),
  1175. newHeight = this.bits.read(12);
  1176. this.bits.skip(4);
  1177. this.frameRate = MPEG1.PICTURE_RATE[this.bits.read(4)];
  1178. this.bits.skip(18 + 1 + 10 + 1);
  1179. if (newWidth !== this.width || newHeight !== this.height) {
  1180. this.width = newWidth;
  1181. this.height = newHeight;
  1182. this.initBuffers();
  1183. if (this.destination) {
  1184. this.destination.resize(newWidth, newHeight);
  1185. }
  1186. }
  1187. if (this.bits.read(1)) {
  1188. for (var i = 0; i < 64; i++) {
  1189. this.customIntraQuantMatrix[MPEG1.ZIG_ZAG[i]] = this.bits.read(8);
  1190. }
  1191. this.intraQuantMatrix = this.customIntraQuantMatrix;
  1192. }
  1193. if (this.bits.read(1)) {
  1194. for (var i = 0; i < 64; i++) {
  1195. var idx = MPEG1.ZIG_ZAG[i];
  1196. this.customNonIntraQuantMatrix[idx] = this.bits.read(8);
  1197. }
  1198. this.nonIntraQuantMatrix = this.customNonIntraQuantMatrix;
  1199. }
  1200. this.hasSequenceHeader = true;
  1201. };
  1202. MPEG1.prototype.initBuffers = function () {
  1203. this.intraQuantMatrix = MPEG1.DEFAULT_INTRA_QUANT_MATRIX;
  1204. this.nonIntraQuantMatrix = MPEG1.DEFAULT_NON_INTRA_QUANT_MATRIX;
  1205. this.mbWidth = (this.width + 15) >> 4;
  1206. this.mbHeight = (this.height + 15) >> 4;
  1207. this.mbSize = this.mbWidth * this.mbHeight;
  1208. this.codedWidth = this.mbWidth << 4;
  1209. this.codedHeight = this.mbHeight << 4;
  1210. this.codedSize = this.codedWidth * this.codedHeight;
  1211. this.halfWidth = this.mbWidth << 3;
  1212. this.halfHeight = this.mbHeight << 3;
  1213. this.currentY = new Uint8ClampedArray(this.codedSize);
  1214. this.currentY32 = new Uint32Array(this.currentY.buffer);
  1215. this.currentCr = new Uint8ClampedArray(this.codedSize >> 2);
  1216. this.currentCr32 = new Uint32Array(this.currentCr.buffer);
  1217. this.currentCb = new Uint8ClampedArray(this.codedSize >> 2);
  1218. this.currentCb32 = new Uint32Array(this.currentCb.buffer);
  1219. this.forwardY = new Uint8ClampedArray(this.codedSize);
  1220. this.forwardY32 = new Uint32Array(this.forwardY.buffer);
  1221. this.forwardCr = new Uint8ClampedArray(this.codedSize >> 2);
  1222. this.forwardCr32 = new Uint32Array(this.forwardCr.buffer);
  1223. this.forwardCb = new Uint8ClampedArray(this.codedSize >> 2);
  1224. this.forwardCb32 = new Uint32Array(this.forwardCb.buffer);
  1225. };
  1226. MPEG1.prototype.currentY = null;
  1227. MPEG1.prototype.currentCr = null;
  1228. MPEG1.prototype.currentCb = null;
  1229. MPEG1.prototype.pictureType = 0;
  1230. MPEG1.prototype.forwardY = null;
  1231. MPEG1.prototype.forwardCr = null;
  1232. MPEG1.prototype.forwardCb = null;
  1233. MPEG1.prototype.fullPelForward = false;
  1234. MPEG1.prototype.forwardFCode = 0;
  1235. MPEG1.prototype.forwardRSize = 0;
  1236. MPEG1.prototype.forwardF = 0;
  1237. MPEG1.prototype.decodePicture = function (skipOutput) {
  1238. this.currentFrame++;
  1239. this.bits.skip(10);
  1240. this.pictureType = this.bits.read(3);
  1241. this.bits.skip(16);
  1242. if (this.pictureType <= 0 || this.pictureType >= MPEG1.PICTURE_TYPE.B) {
  1243. return;
  1244. }
  1245. if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
  1246. this.fullPelForward = this.bits.read(1);
  1247. this.forwardFCode = this.bits.read(3);
  1248. if (this.forwardFCode === 0) {
  1249. return;
  1250. }
  1251. this.forwardRSize = this.forwardFCode - 1;
  1252. this.forwardF = 1 << this.forwardRSize;
  1253. }
  1254. var code = 0;
  1255. do {
  1256. code = this.bits.findNextStartCode();
  1257. } while (code === MPEG1.START.EXTENSION || code === MPEG1.START.USER_DATA);
  1258. while (code >= MPEG1.START.SLICE_FIRST && code <= MPEG1.START.SLICE_LAST) {
  1259. this.decodeSlice(code & 255);
  1260. code = this.bits.findNextStartCode();
  1261. }
  1262. if (code !== -1) {
  1263. this.bits.rewind(32);
  1264. }
  1265. if (this.destination) {
  1266. this.destination.render(
  1267. this.currentY,
  1268. this.currentCr,
  1269. this.currentCb,
  1270. true
  1271. );
  1272. }
  1273. if (
  1274. this.pictureType === MPEG1.PICTURE_TYPE.INTRA ||
  1275. this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE
  1276. ) {
  1277. var tmpY = this.forwardY,
  1278. tmpY32 = this.forwardY32,
  1279. tmpCr = this.forwardCr,
  1280. tmpCr32 = this.forwardCr32,
  1281. tmpCb = this.forwardCb,
  1282. tmpCb32 = this.forwardCb32;
  1283. this.forwardY = this.currentY;
  1284. this.forwardY32 = this.currentY32;
  1285. this.forwardCr = this.currentCr;
  1286. this.forwardCr32 = this.currentCr32;
  1287. this.forwardCb = this.currentCb;
  1288. this.forwardCb32 = this.currentCb32;
  1289. this.currentY = tmpY;
  1290. this.currentY32 = tmpY32;
  1291. this.currentCr = tmpCr;
  1292. this.currentCr32 = tmpCr32;
  1293. this.currentCb = tmpCb;
  1294. this.currentCb32 = tmpCb32;
  1295. }
  1296. };
  1297. MPEG1.prototype.quantizerScale = 0;
  1298. MPEG1.prototype.sliceBegin = false;
  1299. MPEG1.prototype.decodeSlice = function (slice) {
  1300. this.sliceBegin = true;
  1301. this.macroblockAddress = (slice - 1) * this.mbWidth - 1;
  1302. this.motionFwH = this.motionFwHPrev = 0;
  1303. this.motionFwV = this.motionFwVPrev = 0;
  1304. this.dcPredictorY = 128;
  1305. this.dcPredictorCr = 128;
  1306. this.dcPredictorCb = 128;
  1307. this.quantizerScale = this.bits.read(5);
  1308. while (this.bits.read(1)) {
  1309. this.bits.skip(8);
  1310. }
  1311. do {
  1312. this.decodeMacroblock();
  1313. } while (!this.bits.nextBytesAreStartCode());
  1314. };
  1315. MPEG1.prototype.macroblockAddress = 0;
  1316. MPEG1.prototype.mbRow = 0;
  1317. MPEG1.prototype.mbCol = 0;
  1318. MPEG1.prototype.macroblockType = 0;
  1319. MPEG1.prototype.macroblockIntra = false;
  1320. MPEG1.prototype.macroblockMotFw = false;
  1321. MPEG1.prototype.motionFwH = 0;
  1322. MPEG1.prototype.motionFwV = 0;
  1323. MPEG1.prototype.motionFwHPrev = 0;
  1324. MPEG1.prototype.motionFwVPrev = 0;
  1325. MPEG1.prototype.decodeMacroblock = function () {
  1326. var increment = 0,
  1327. t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT);
  1328. while (t === 34) {
  1329. t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT);
  1330. }
  1331. while (t === 35) {
  1332. increment += 33;
  1333. t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT);
  1334. }
  1335. increment += t;
  1336. if (this.sliceBegin) {
  1337. this.sliceBegin = false;
  1338. this.macroblockAddress += increment;
  1339. } else {
  1340. if (this.macroblockAddress + increment >= this.mbSize) {
  1341. return;
  1342. }
  1343. if (increment > 1) {
  1344. this.dcPredictorY = 128;
  1345. this.dcPredictorCr = 128;
  1346. this.dcPredictorCb = 128;
  1347. if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
  1348. this.motionFwH = this.motionFwHPrev = 0;
  1349. this.motionFwV = this.motionFwVPrev = 0;
  1350. }
  1351. }
  1352. while (increment > 1) {
  1353. this.macroblockAddress++;
  1354. this.mbRow = (this.macroblockAddress / this.mbWidth) | 0;
  1355. this.mbCol = this.macroblockAddress % this.mbWidth;
  1356. this.copyMacroblock(
  1357. this.motionFwH,
  1358. this.motionFwV,
  1359. this.forwardY,
  1360. this.forwardCr,
  1361. this.forwardCb
  1362. );
  1363. increment--;
  1364. }
  1365. this.macroblockAddress++;
  1366. }
  1367. this.mbRow = (this.macroblockAddress / this.mbWidth) | 0;
  1368. this.mbCol = this.macroblockAddress % this.mbWidth;
  1369. var mbTable = MPEG1.MACROBLOCK_TYPE[this.pictureType];
  1370. this.macroblockType = this.readHuffman(mbTable);
  1371. this.macroblockIntra = this.macroblockType & 1;
  1372. this.macroblockMotFw = this.macroblockType & 8;
  1373. if ((this.macroblockType & 16) !== 0) {
  1374. this.quantizerScale = this.bits.read(5);
  1375. }
  1376. if (this.macroblockIntra) {
  1377. this.motionFwH = this.motionFwHPrev = 0;
  1378. this.motionFwV = this.motionFwVPrev = 0;
  1379. } else {
  1380. this.dcPredictorY = 128;
  1381. this.dcPredictorCr = 128;
  1382. this.dcPredictorCb = 128;
  1383. this.decodeMotionVectors();
  1384. this.copyMacroblock(
  1385. this.motionFwH,
  1386. this.motionFwV,
  1387. this.forwardY,
  1388. this.forwardCr,
  1389. this.forwardCb
  1390. );
  1391. }
  1392. var cbp =
  1393. (this.macroblockType & 2) !== 0
  1394. ? this.readHuffman(MPEG1.CODE_BLOCK_PATTERN)
  1395. : this.macroblockIntra
  1396. ? 63
  1397. : 0;
  1398. for (var block = 0, mask = 32; block < 6; block++) {
  1399. if ((cbp & mask) !== 0) {
  1400. this.decodeBlock(block);
  1401. }
  1402. mask >>= 1;
  1403. }
  1404. };
  1405. MPEG1.prototype.decodeMotionVectors = function () {
  1406. var code,
  1407. d,
  1408. r = 0;
  1409. if (this.macroblockMotFw) {
  1410. code = this.readHuffman(MPEG1.MOTION);
  1411. if (code !== 0 && this.forwardF !== 1) {
  1412. r = this.bits.read(this.forwardRSize);
  1413. d = ((Math.abs(code) - 1) << this.forwardRSize) + r + 1;
  1414. if (code < 0) {
  1415. d = -d;
  1416. }
  1417. } else {
  1418. d = code;
  1419. }
  1420. this.motionFwHPrev += d;
  1421. if (this.motionFwHPrev > (this.forwardF << 4) - 1) {
  1422. this.motionFwHPrev -= this.forwardF << 5;
  1423. } else if (this.motionFwHPrev < -this.forwardF << 4) {
  1424. this.motionFwHPrev += this.forwardF << 5;
  1425. }
  1426. this.motionFwH = this.motionFwHPrev;
  1427. if (this.fullPelForward) {
  1428. this.motionFwH <<= 1;
  1429. }
  1430. code = this.readHuffman(MPEG1.MOTION);
  1431. if (code !== 0 && this.forwardF !== 1) {
  1432. r = this.bits.read(this.forwardRSize);
  1433. d = ((Math.abs(code) - 1) << this.forwardRSize) + r + 1;
  1434. if (code < 0) {
  1435. d = -d;
  1436. }
  1437. } else {
  1438. d = code;
  1439. }
  1440. this.motionFwVPrev += d;
  1441. if (this.motionFwVPrev > (this.forwardF << 4) - 1) {
  1442. this.motionFwVPrev -= this.forwardF << 5;
  1443. } else if (this.motionFwVPrev < -this.forwardF << 4) {
  1444. this.motionFwVPrev += this.forwardF << 5;
  1445. }
  1446. this.motionFwV = this.motionFwVPrev;
  1447. if (this.fullPelForward) {
  1448. this.motionFwV <<= 1;
  1449. }
  1450. } else if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
  1451. this.motionFwH = this.motionFwHPrev = 0;
  1452. this.motionFwV = this.motionFwVPrev = 0;
  1453. }
  1454. };
  1455. MPEG1.prototype.copyMacroblock = function (motionH, motionV, sY, sCr, sCb) {
  1456. var width, scan, H, V, oddH, oddV, src, dest, last;
  1457. var dY = this.currentY32,
  1458. dCb = this.currentCb32,
  1459. dCr = this.currentCr32;
  1460. width = this.codedWidth;
  1461. scan = width - 16;
  1462. H = motionH >> 1;
  1463. V = motionV >> 1;
  1464. oddH = (motionH & 1) === 1;
  1465. oddV = (motionV & 1) === 1;
  1466. src = ((this.mbRow << 4) + V) * width + (this.mbCol << 4) + H;
  1467. dest = (this.mbRow * width + this.mbCol) << 2;
  1468. last = dest + (width << 2);
  1469. var x, y1, y2, y;
  1470. if (oddH) {
  1471. if (oddV) {
  1472. while (dest < last) {
  1473. y1 = sY[src] + sY[src + width];
  1474. src++;
  1475. for (x = 0; x < 4; x++) {
  1476. y2 = sY[src] + sY[src + width];
  1477. src++;
  1478. y = ((y1 + y2 + 2) >> 2) & 255;
  1479. y1 = sY[src] + sY[src + width];
  1480. src++;
  1481. y |= ((y1 + y2 + 2) << 6) & 65280;
  1482. y2 = sY[src] + sY[src + width];
  1483. src++;
  1484. y |= ((y1 + y2 + 2) << 14) & 16711680;
  1485. y1 = sY[src] + sY[src + width];
  1486. src++;
  1487. y |= ((y1 + y2 + 2) << 22) & 4278190080;
  1488. dY[dest++] = y;
  1489. }
  1490. dest += scan >> 2;
  1491. src += scan - 1;
  1492. }
  1493. } else {
  1494. while (dest < last) {
  1495. y1 = sY[src++];
  1496. for (x = 0; x < 4; x++) {
  1497. y2 = sY[src++];
  1498. y = ((y1 + y2 + 1) >> 1) & 255;
  1499. y1 = sY[src++];
  1500. y |= ((y1 + y2 + 1) << 7) & 65280;
  1501. y2 = sY[src++];
  1502. y |= ((y1 + y2 + 1) << 15) & 16711680;
  1503. y1 = sY[src++];
  1504. y |= ((y1 + y2 + 1) << 23) & 4278190080;
  1505. dY[dest++] = y;
  1506. }
  1507. dest += scan >> 2;
  1508. src += scan - 1;
  1509. }
  1510. }
  1511. } else {
  1512. if (oddV) {
  1513. while (dest < last) {
  1514. for (x = 0; x < 4; x++) {
  1515. y = ((sY[src] + sY[src + width] + 1) >> 1) & 255;
  1516. src++;
  1517. y |= ((sY[src] + sY[src + width] + 1) << 7) & 65280;
  1518. src++;
  1519. y |= ((sY[src] + sY[src + width] + 1) << 15) & 16711680;
  1520. src++;
  1521. y |= ((sY[src] + sY[src + width] + 1) << 23) & 4278190080;
  1522. src++;
  1523. dY[dest++] = y;
  1524. }
  1525. dest += scan >> 2;
  1526. src += scan;
  1527. }
  1528. } else {
  1529. while (dest < last) {
  1530. for (x = 0; x < 4; x++) {
  1531. y = sY[src];
  1532. src++;
  1533. y |= sY[src] << 8;
  1534. src++;
  1535. y |= sY[src] << 16;
  1536. src++;
  1537. y |= sY[src] << 24;
  1538. src++;
  1539. dY[dest++] = y;
  1540. }
  1541. dest += scan >> 2;
  1542. src += scan;
  1543. }
  1544. }
  1545. }
  1546. width = this.halfWidth;
  1547. scan = width - 8;
  1548. H = (motionH / 2) >> 1;
  1549. V = (motionV / 2) >> 1;
  1550. oddH = ((motionH / 2) & 1) === 1;
  1551. oddV = ((motionV / 2) & 1) === 1;
  1552. src = ((this.mbRow << 3) + V) * width + (this.mbCol << 3) + H;
  1553. dest = (this.mbRow * width + this.mbCol) << 1;
  1554. last = dest + (width << 1);
  1555. var cr1, cr2, cr, cb1, cb2, cb;
  1556. if (oddH) {
  1557. if (oddV) {
  1558. while (dest < last) {
  1559. cr1 = sCr[src] + sCr[src + width];
  1560. cb1 = sCb[src] + sCb[src + width];
  1561. src++;
  1562. for (x = 0; x < 2; x++) {
  1563. cr2 = sCr[src] + sCr[src + width];
  1564. cb2 = sCb[src] + sCb[src + width];
  1565. src++;
  1566. cr = ((cr1 + cr2 + 2) >> 2) & 255;
  1567. cb = ((cb1 + cb2 + 2) >> 2) & 255;
  1568. cr1 = sCr[src] + sCr[src + width];
  1569. cb1 = sCb[src] + sCb[src + width];
  1570. src++;
  1571. cr |= ((cr1 + cr2 + 2) << 6) & 65280;
  1572. cb |= ((cb1 + cb2 + 2) << 6) & 65280;
  1573. cr2 = sCr[src] + sCr[src + width];
  1574. cb2 = sCb[src] + sCb[src + width];
  1575. src++;
  1576. cr |= ((cr1 + cr2 + 2) << 14) & 16711680;
  1577. cb |= ((cb1 + cb2 + 2) << 14) & 16711680;
  1578. cr1 = sCr[src] + sCr[src + width];
  1579. cb1 = sCb[src] + sCb[src + width];
  1580. src++;
  1581. cr |= ((cr1 + cr2 + 2) << 22) & 4278190080;
  1582. cb |= ((cb1 + cb2 + 2) << 22) & 4278190080;
  1583. dCr[dest] = cr;
  1584. dCb[dest] = cb;
  1585. dest++;
  1586. }
  1587. dest += scan >> 2;
  1588. src += scan - 1;
  1589. }
  1590. } else {
  1591. while (dest < last) {
  1592. cr1 = sCr[src];
  1593. cb1 = sCb[src];
  1594. src++;
  1595. for (x = 0; x < 2; x++) {
  1596. cr2 = sCr[src];
  1597. cb2 = sCb[src++];
  1598. cr = ((cr1 + cr2 + 1) >> 1) & 255;
  1599. cb = ((cb1 + cb2 + 1) >> 1) & 255;
  1600. cr1 = sCr[src];
  1601. cb1 = sCb[src++];
  1602. cr |= ((cr1 + cr2 + 1) << 7) & 65280;
  1603. cb |= ((cb1 + cb2 + 1) << 7) & 65280;
  1604. cr2 = sCr[src];
  1605. cb2 = sCb[src++];
  1606. cr |= ((cr1 + cr2 + 1) << 15) & 16711680;
  1607. cb |= ((cb1 + cb2 + 1) << 15) & 16711680;
  1608. cr1 = sCr[src];
  1609. cb1 = sCb[src++];
  1610. cr |= ((cr1 + cr2 + 1) << 23) & 4278190080;
  1611. cb |= ((cb1 + cb2 + 1) << 23) & 4278190080;
  1612. dCr[dest] = cr;
  1613. dCb[dest] = cb;
  1614. dest++;
  1615. }
  1616. dest += scan >> 2;
  1617. src += scan - 1;
  1618. }
  1619. }
  1620. } else {
  1621. if (oddV) {
  1622. while (dest < last) {
  1623. for (x = 0; x < 2; x++) {
  1624. cr = ((sCr[src] + sCr[src + width] + 1) >> 1) & 255;
  1625. cb = ((sCb[src] + sCb[src + width] + 1) >> 1) & 255;
  1626. src++;
  1627. cr |= ((sCr[src] + sCr[src + width] + 1) << 7) & 65280;
  1628. cb |= ((sCb[src] + sCb[src + width] + 1) << 7) & 65280;
  1629. src++;
  1630. cr |= ((sCr[src] + sCr[src + width] + 1) << 15) & 16711680;
  1631. cb |= ((sCb[src] + sCb[src + width] + 1) << 15) & 16711680;
  1632. src++;
  1633. cr |= ((sCr[src] + sCr[src + width] + 1) << 23) & 4278190080;
  1634. cb |= ((sCb[src] + sCb[src + width] + 1) << 23) & 4278190080;
  1635. src++;
  1636. dCr[dest] = cr;
  1637. dCb[dest] = cb;
  1638. dest++;
  1639. }
  1640. dest += scan >> 2;
  1641. src += scan;
  1642. }
  1643. } else {
  1644. while (dest < last) {
  1645. for (x = 0; x < 2; x++) {
  1646. cr = sCr[src];
  1647. cb = sCb[src];
  1648. src++;
  1649. cr |= sCr[src] << 8;
  1650. cb |= sCb[src] << 8;
  1651. src++;
  1652. cr |= sCr[src] << 16;
  1653. cb |= sCb[src] << 16;
  1654. src++;
  1655. cr |= sCr[src] << 24;
  1656. cb |= sCb[src] << 24;
  1657. src++;
  1658. dCr[dest] = cr;
  1659. dCb[dest] = cb;
  1660. dest++;
  1661. }
  1662. dest += scan >> 2;
  1663. src += scan;
  1664. }
  1665. }
  1666. }
  1667. };
  1668. MPEG1.prototype.dcPredictorY = 0;
  1669. MPEG1.prototype.dcPredictorCr = 0;
  1670. MPEG1.prototype.dcPredictorCb = 0;
  1671. MPEG1.prototype.blockData = null;
  1672. MPEG1.prototype.decodeBlock = function (block) {
  1673. var n = 0,
  1674. quantMatrix;
  1675. if (this.macroblockIntra) {
  1676. var predictor, dctSize;
  1677. if (block < 4) {
  1678. predictor = this.dcPredictorY;
  1679. dctSize = this.readHuffman(MPEG1.DCT_DC_SIZE_LUMINANCE);
  1680. } else {
  1681. predictor = block === 4 ? this.dcPredictorCr : this.dcPredictorCb;
  1682. dctSize = this.readHuffman(MPEG1.DCT_DC_SIZE_CHROMINANCE);
  1683. }
  1684. if (dctSize > 0) {
  1685. var differential = this.bits.read(dctSize);
  1686. if ((differential & (1 << (dctSize - 1))) !== 0) {
  1687. this.blockData[0] = predictor + differential;
  1688. } else {
  1689. this.blockData[0] =
  1690. predictor + ((-1 << dctSize) | (differential + 1));
  1691. }
  1692. } else {
  1693. this.blockData[0] = predictor;
  1694. }
  1695. if (block < 4) {
  1696. this.dcPredictorY = this.blockData[0];
  1697. } else if (block === 4) {
  1698. this.dcPredictorCr = this.blockData[0];
  1699. } else {
  1700. this.dcPredictorCb = this.blockData[0];
  1701. }
  1702. this.blockData[0] <<= 3 + 5;
  1703. quantMatrix = this.intraQuantMatrix;
  1704. n = 1;
  1705. } else {
  1706. quantMatrix = this.nonIntraQuantMatrix;
  1707. }
  1708. var level = 0;
  1709. while (true) {
  1710. var run = 0,
  1711. coeff = this.readHuffman(MPEG1.DCT_COEFF);
  1712. if (coeff === 1 && n > 0 && this.bits.read(1) === 0) {
  1713. break;
  1714. }
  1715. if (coeff === 65535) {
  1716. run = this.bits.read(6);
  1717. level = this.bits.read(8);
  1718. if (level === 0) {
  1719. level = this.bits.read(8);
  1720. } else if (level === 128) {
  1721. level = this.bits.read(8) - 256;
  1722. } else if (level > 128) {
  1723. level = level - 256;
  1724. }
  1725. } else {
  1726. run = coeff >> 8;
  1727. level = coeff & 255;
  1728. if (this.bits.read(1)) {
  1729. level = -level;
  1730. }
  1731. }
  1732. n += run;
  1733. var dezigZagged = MPEG1.ZIG_ZAG[n];
  1734. n++;
  1735. level <<= 1;
  1736. if (!this.macroblockIntra) {
  1737. level += level < 0 ? -1 : 1;
  1738. }
  1739. level = (level * this.quantizerScale * quantMatrix[dezigZagged]) >> 4;
  1740. if ((level & 1) === 0) {
  1741. level -= level > 0 ? 1 : -1;
  1742. }
  1743. if (level > 2047) {
  1744. level = 2047;
  1745. } else if (level < -2048) {
  1746. level = -2048;
  1747. }
  1748. this.blockData[dezigZagged] =
  1749. level * MPEG1.PREMULTIPLIER_MATRIX[dezigZagged];
  1750. }
  1751. var destArray, destIndex, scan;
  1752. if (block < 4) {
  1753. destArray = this.currentY;
  1754. scan = this.codedWidth - 8;
  1755. destIndex = (this.mbRow * this.codedWidth + this.mbCol) << 4;
  1756. if ((block & 1) !== 0) {
  1757. destIndex += 8;
  1758. }
  1759. if ((block & 2) !== 0) {
  1760. destIndex += this.codedWidth << 3;
  1761. }
  1762. } else {
  1763. destArray = block === 4 ? this.currentCb : this.currentCr;
  1764. scan = (this.codedWidth >> 1) - 8;
  1765. destIndex = ((this.mbRow * this.codedWidth) << 2) + (this.mbCol << 3);
  1766. }
  1767. if (this.macroblockIntra) {
  1768. if (n === 1) {
  1769. MPEG1.CopyValueToDestination(
  1770. (this.blockData[0] + 128) >> 8,
  1771. destArray,
  1772. destIndex,
  1773. scan
  1774. );
  1775. this.blockData[0] = 0;
  1776. } else {
  1777. MPEG1.IDCT(this.blockData);
  1778. MPEG1.CopyBlockToDestination(
  1779. this.blockData,
  1780. destArray,
  1781. destIndex,
  1782. scan
  1783. );
  1784. JSMpeg.Fill(this.blockData, 0);
  1785. }
  1786. } else {
  1787. if (n === 1) {
  1788. MPEG1.AddValueToDestination(
  1789. (this.blockData[0] + 128) >> 8,
  1790. destArray,
  1791. destIndex,
  1792. scan
  1793. );
  1794. this.blockData[0] = 0;
  1795. } else {
  1796. MPEG1.IDCT(this.blockData);
  1797. MPEG1.AddBlockToDestination(this.blockData, destArray, destIndex, scan);
  1798. JSMpeg.Fill(this.blockData, 0);
  1799. }
  1800. }
  1801. n = 0;
  1802. };
  1803. MPEG1.CopyBlockToDestination = function (block, dest, index, scan) {
  1804. for (var n = 0; n < 64; n += 8, index += scan + 8) {
  1805. dest[index + 0] = block[n + 0];
  1806. dest[index + 1] = block[n + 1];
  1807. dest[index + 2] = block[n + 2];
  1808. dest[index + 3] = block[n + 3];
  1809. dest[index + 4] = block[n + 4];
  1810. dest[index + 5] = block[n + 5];
  1811. dest[index + 6] = block[n + 6];
  1812. dest[index + 7] = block[n + 7];
  1813. }
  1814. };
  1815. MPEG1.AddBlockToDestination = function (block, dest, index, scan) {
  1816. for (var n = 0; n < 64; n += 8, index += scan + 8) {
  1817. dest[index + 0] += block[n + 0];
  1818. dest[index + 1] += block[n + 1];
  1819. dest[index + 2] += block[n + 2];
  1820. dest[index + 3] += block[n + 3];
  1821. dest[index + 4] += block[n + 4];
  1822. dest[index + 5] += block[n + 5];
  1823. dest[index + 6] += block[n + 6];
  1824. dest[index + 7] += block[n + 7];
  1825. }
  1826. };
  1827. MPEG1.CopyValueToDestination = function (value, dest, index, scan) {
  1828. for (var n = 0; n < 64; n += 8, index += scan + 8) {
  1829. dest[index + 0] = value;
  1830. dest[index + 1] = value;
  1831. dest[index + 2] = value;
  1832. dest[index + 3] = value;
  1833. dest[index + 4] = value;
  1834. dest[index + 5] = value;
  1835. dest[index + 6] = value;
  1836. dest[index + 7] = value;
  1837. }
  1838. };
  1839. MPEG1.AddValueToDestination = function (value, dest, index, scan) {
  1840. for (var n = 0; n < 64; n += 8, index += scan + 8) {
  1841. dest[index + 0] += value;
  1842. dest[index + 1] += value;
  1843. dest[index + 2] += value;
  1844. dest[index + 3] += value;
  1845. dest[index + 4] += value;
  1846. dest[index + 5] += value;
  1847. dest[index + 6] += value;
  1848. dest[index + 7] += value;
  1849. }
  1850. };
  1851. MPEG1.IDCT = function (block) {
  1852. var b1,
  1853. b3,
  1854. b4,
  1855. b6,
  1856. b7,
  1857. tmp1,
  1858. tmp2,
  1859. m0,
  1860. x0,
  1861. x1,
  1862. x2,
  1863. x3,
  1864. x4,
  1865. y3,
  1866. y4,
  1867. y5,
  1868. y6,
  1869. y7;
  1870. for (var i = 0; i < 8; ++i) {
  1871. b1 = block[4 * 8 + i];
  1872. b3 = block[2 * 8 + i] + block[6 * 8 + i];
  1873. b4 = block[5 * 8 + i] - block[3 * 8 + i];
  1874. tmp1 = block[1 * 8 + i] + block[7 * 8 + i];
  1875. tmp2 = block[3 * 8 + i] + block[5 * 8 + i];
  1876. b6 = block[1 * 8 + i] - block[7 * 8 + i];
  1877. b7 = tmp1 + tmp2;
  1878. m0 = block[0 * 8 + i];
  1879. x4 = ((b6 * 473 - b4 * 196 + 128) >> 8) - b7;
  1880. x0 = x4 - (((tmp1 - tmp2) * 362 + 128) >> 8);
  1881. x1 = m0 - b1;
  1882. x2 = (((block[2 * 8 + i] - block[6 * 8 + i]) * 362 + 128) >> 8) - b3;
  1883. x3 = m0 + b1;
  1884. y3 = x1 + x2;
  1885. y4 = x3 + b3;
  1886. y5 = x1 - x2;
  1887. y6 = x3 - b3;
  1888. y7 = -x0 - ((b4 * 473 + b6 * 196 + 128) >> 8);
  1889. block[0 * 8 + i] = b7 + y4;
  1890. block[1 * 8 + i] = x4 + y3;
  1891. block[2 * 8 + i] = y5 - x0;
  1892. block[3 * 8 + i] = y6 - y7;
  1893. block[4 * 8 + i] = y6 + y7;
  1894. block[5 * 8 + i] = x0 + y5;
  1895. block[6 * 8 + i] = y3 - x4;
  1896. block[7 * 8 + i] = y4 - b7;
  1897. }
  1898. for (var i = 0; i < 64; i += 8) {
  1899. b1 = block[4 + i];
  1900. b3 = block[2 + i] + block[6 + i];
  1901. b4 = block[5 + i] - block[3 + i];
  1902. tmp1 = block[1 + i] + block[7 + i];
  1903. tmp2 = block[3 + i] + block[5 + i];
  1904. b6 = block[1 + i] - block[7 + i];
  1905. b7 = tmp1 + tmp2;
  1906. m0 = block[0 + i];
  1907. x4 = ((b6 * 473 - b4 * 196 + 128) >> 8) - b7;
  1908. x0 = x4 - (((tmp1 - tmp2) * 362 + 128) >> 8);
  1909. x1 = m0 - b1;
  1910. x2 = (((block[2 + i] - block[6 + i]) * 362 + 128) >> 8) - b3;
  1911. x3 = m0 + b1;
  1912. y3 = x1 + x2;
  1913. y4 = x3 + b3;
  1914. y5 = x1 - x2;
  1915. y6 = x3 - b3;
  1916. y7 = -x0 - ((b4 * 473 + b6 * 196 + 128) >> 8);
  1917. block[0 + i] = (b7 + y4 + 128) >> 8;
  1918. block[1 + i] = (x4 + y3 + 128) >> 8;
  1919. block[2 + i] = (y5 - x0 + 128) >> 8;
  1920. block[3 + i] = (y6 - y7 + 128) >> 8;
  1921. block[4 + i] = (y6 + y7 + 128) >> 8;
  1922. block[5 + i] = (x0 + y5 + 128) >> 8;
  1923. block[6 + i] = (y3 - x4 + 128) >> 8;
  1924. block[7 + i] = (y4 - b7 + 128) >> 8;
  1925. }
  1926. };
  1927. MPEG1.PICTURE_RATE = [
  1928. 0, 23.976, 24, 25, 29.97, 30, 50, 59.94, 60, 0, 0, 0, 0, 0, 0, 0,
  1929. ];
  1930. MPEG1.ZIG_ZAG = new Uint8Array([
  1931. 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40,
  1932. 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36,
  1933. 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61,
  1934. 54, 47, 55, 62, 63,
  1935. ]);
  1936. MPEG1.DEFAULT_INTRA_QUANT_MATRIX = new Uint8Array([
  1937. 8, 16, 19, 22, 26, 27, 29, 34, 16, 16, 22, 24, 27, 29, 34, 37, 19, 22, 26,
  1938. 27, 29, 34, 34, 38, 22, 22, 26, 27, 29, 34, 37, 40, 22, 26, 27, 29, 32, 35,
  1939. 40, 48, 26, 27, 29, 32, 35, 40, 48, 58, 26, 27, 29, 34, 38, 46, 56, 69, 27,
  1940. 29, 35, 38, 46, 56, 69, 83,
  1941. ]);
  1942. MPEG1.DEFAULT_NON_INTRA_QUANT_MATRIX = new Uint8Array([
  1943. 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  1944. 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  1945. 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  1946. 16, 16, 16, 16, 16, 16, 16,
  1947. ]);
  1948. MPEG1.PREMULTIPLIER_MATRIX = new Uint8Array([
  1949. 32, 44, 42, 38, 32, 25, 17, 9, 44, 62, 58, 52, 44, 35, 24, 12, 42, 58, 55,
  1950. 49, 42, 33, 23, 12, 38, 52, 49, 44, 38, 30, 20, 10, 32, 44, 42, 38, 32, 25,
  1951. 17, 9, 25, 35, 33, 30, 25, 20, 14, 7, 17, 24, 23, 20, 17, 14, 9, 5, 9, 12,
  1952. 12, 10, 9, 7, 5, 2,
  1953. ]);
  1954. MPEG1.MACROBLOCK_ADDRESS_INCREMENT = new Int16Array([
  1955. 1 * 3,
  1956. 2 * 3,
  1957. 0,
  1958. 3 * 3,
  1959. 4 * 3,
  1960. 0,
  1961. 0,
  1962. 0,
  1963. 1,
  1964. 5 * 3,
  1965. 6 * 3,
  1966. 0,
  1967. 7 * 3,
  1968. 8 * 3,
  1969. 0,
  1970. 9 * 3,
  1971. 10 * 3,
  1972. 0,
  1973. 11 * 3,
  1974. 12 * 3,
  1975. 0,
  1976. 0,
  1977. 0,
  1978. 3,
  1979. 0,
  1980. 0,
  1981. 2,
  1982. 13 * 3,
  1983. 14 * 3,
  1984. 0,
  1985. 15 * 3,
  1986. 16 * 3,
  1987. 0,
  1988. 0,
  1989. 0,
  1990. 5,
  1991. 0,
  1992. 0,
  1993. 4,
  1994. 17 * 3,
  1995. 18 * 3,
  1996. 0,
  1997. 19 * 3,
  1998. 20 * 3,
  1999. 0,
  2000. 0,
  2001. 0,
  2002. 7,
  2003. 0,
  2004. 0,
  2005. 6,
  2006. 21 * 3,
  2007. 22 * 3,
  2008. 0,
  2009. 23 * 3,
  2010. 24 * 3,
  2011. 0,
  2012. 25 * 3,
  2013. 26 * 3,
  2014. 0,
  2015. 27 * 3,
  2016. 28 * 3,
  2017. 0,
  2018. -1,
  2019. 29 * 3,
  2020. 0,
  2021. -1,
  2022. 30 * 3,
  2023. 0,
  2024. 31 * 3,
  2025. 32 * 3,
  2026. 0,
  2027. 33 * 3,
  2028. 34 * 3,
  2029. 0,
  2030. 35 * 3,
  2031. 36 * 3,
  2032. 0,
  2033. 37 * 3,
  2034. 38 * 3,
  2035. 0,
  2036. 0,
  2037. 0,
  2038. 9,
  2039. 0,
  2040. 0,
  2041. 8,
  2042. 39 * 3,
  2043. 40 * 3,
  2044. 0,
  2045. 41 * 3,
  2046. 42 * 3,
  2047. 0,
  2048. 43 * 3,
  2049. 44 * 3,
  2050. 0,
  2051. 45 * 3,
  2052. 46 * 3,
  2053. 0,
  2054. 0,
  2055. 0,
  2056. 15,
  2057. 0,
  2058. 0,
  2059. 14,
  2060. 0,
  2061. 0,
  2062. 13,
  2063. 0,
  2064. 0,
  2065. 12,
  2066. 0,
  2067. 0,
  2068. 11,
  2069. 0,
  2070. 0,
  2071. 10,
  2072. 47 * 3,
  2073. -1,
  2074. 0,
  2075. -1,
  2076. 48 * 3,
  2077. 0,
  2078. 49 * 3,
  2079. 50 * 3,
  2080. 0,
  2081. 51 * 3,
  2082. 52 * 3,
  2083. 0,
  2084. 53 * 3,
  2085. 54 * 3,
  2086. 0,
  2087. 55 * 3,
  2088. 56 * 3,
  2089. 0,
  2090. 57 * 3,
  2091. 58 * 3,
  2092. 0,
  2093. 59 * 3,
  2094. 60 * 3,
  2095. 0,
  2096. 61 * 3,
  2097. -1,
  2098. 0,
  2099. -1,
  2100. 62 * 3,
  2101. 0,
  2102. 63 * 3,
  2103. 64 * 3,
  2104. 0,
  2105. 65 * 3,
  2106. 66 * 3,
  2107. 0,
  2108. 67 * 3,
  2109. 68 * 3,
  2110. 0,
  2111. 69 * 3,
  2112. 70 * 3,
  2113. 0,
  2114. 71 * 3,
  2115. 72 * 3,
  2116. 0,
  2117. 73 * 3,
  2118. 74 * 3,
  2119. 0,
  2120. 0,
  2121. 0,
  2122. 21,
  2123. 0,
  2124. 0,
  2125. 20,
  2126. 0,
  2127. 0,
  2128. 19,
  2129. 0,
  2130. 0,
  2131. 18,
  2132. 0,
  2133. 0,
  2134. 17,
  2135. 0,
  2136. 0,
  2137. 16,
  2138. 0,
  2139. 0,
  2140. 35,
  2141. 0,
  2142. 0,
  2143. 34,
  2144. 0,
  2145. 0,
  2146. 33,
  2147. 0,
  2148. 0,
  2149. 32,
  2150. 0,
  2151. 0,
  2152. 31,
  2153. 0,
  2154. 0,
  2155. 30,
  2156. 0,
  2157. 0,
  2158. 29,
  2159. 0,
  2160. 0,
  2161. 28,
  2162. 0,
  2163. 0,
  2164. 27,
  2165. 0,
  2166. 0,
  2167. 26,
  2168. 0,
  2169. 0,
  2170. 25,
  2171. 0,
  2172. 0,
  2173. 24,
  2174. 0,
  2175. 0,
  2176. 23,
  2177. 0,
  2178. 0,
  2179. 22,
  2180. ]);
  2181. MPEG1.MACROBLOCK_TYPE_INTRA = new Int8Array([
  2182. 1 * 3,
  2183. 2 * 3,
  2184. 0,
  2185. -1,
  2186. 3 * 3,
  2187. 0,
  2188. 0,
  2189. 0,
  2190. 1,
  2191. 0,
  2192. 0,
  2193. 17,
  2194. ]);
  2195. MPEG1.MACROBLOCK_TYPE_PREDICTIVE = new Int8Array([
  2196. 1 * 3,
  2197. 2 * 3,
  2198. 0,
  2199. 3 * 3,
  2200. 4 * 3,
  2201. 0,
  2202. 0,
  2203. 0,
  2204. 10,
  2205. 5 * 3,
  2206. 6 * 3,
  2207. 0,
  2208. 0,
  2209. 0,
  2210. 2,
  2211. 7 * 3,
  2212. 8 * 3,
  2213. 0,
  2214. 0,
  2215. 0,
  2216. 8,
  2217. 9 * 3,
  2218. 10 * 3,
  2219. 0,
  2220. 11 * 3,
  2221. 12 * 3,
  2222. 0,
  2223. -1,
  2224. 13 * 3,
  2225. 0,
  2226. 0,
  2227. 0,
  2228. 18,
  2229. 0,
  2230. 0,
  2231. 26,
  2232. 0,
  2233. 0,
  2234. 1,
  2235. 0,
  2236. 0,
  2237. 17,
  2238. ]);
  2239. MPEG1.MACROBLOCK_TYPE_B = new Int8Array([
  2240. 1 * 3,
  2241. 2 * 3,
  2242. 0,
  2243. 3 * 3,
  2244. 5 * 3,
  2245. 0,
  2246. 4 * 3,
  2247. 6 * 3,
  2248. 0,
  2249. 8 * 3,
  2250. 7 * 3,
  2251. 0,
  2252. 0,
  2253. 0,
  2254. 12,
  2255. 9 * 3,
  2256. 10 * 3,
  2257. 0,
  2258. 0,
  2259. 0,
  2260. 14,
  2261. 13 * 3,
  2262. 14 * 3,
  2263. 0,
  2264. 12 * 3,
  2265. 11 * 3,
  2266. 0,
  2267. 0,
  2268. 0,
  2269. 4,
  2270. 0,
  2271. 0,
  2272. 6,
  2273. 18 * 3,
  2274. 16 * 3,
  2275. 0,
  2276. 15 * 3,
  2277. 17 * 3,
  2278. 0,
  2279. 0,
  2280. 0,
  2281. 8,
  2282. 0,
  2283. 0,
  2284. 10,
  2285. -1,
  2286. 19 * 3,
  2287. 0,
  2288. 0,
  2289. 0,
  2290. 1,
  2291. 20 * 3,
  2292. 21 * 3,
  2293. 0,
  2294. 0,
  2295. 0,
  2296. 30,
  2297. 0,
  2298. 0,
  2299. 17,
  2300. 0,
  2301. 0,
  2302. 22,
  2303. 0,
  2304. 0,
  2305. 26,
  2306. ]);
  2307. MPEG1.MACROBLOCK_TYPE = [
  2308. null,
  2309. MPEG1.MACROBLOCK_TYPE_INTRA,
  2310. MPEG1.MACROBLOCK_TYPE_PREDICTIVE,
  2311. MPEG1.MACROBLOCK_TYPE_B,
  2312. ];
  2313. MPEG1.CODE_BLOCK_PATTERN = new Int16Array([
  2314. 2 * 3,
  2315. 1 * 3,
  2316. 0,
  2317. 3 * 3,
  2318. 6 * 3,
  2319. 0,
  2320. 4 * 3,
  2321. 5 * 3,
  2322. 0,
  2323. 8 * 3,
  2324. 11 * 3,
  2325. 0,
  2326. 12 * 3,
  2327. 13 * 3,
  2328. 0,
  2329. 9 * 3,
  2330. 7 * 3,
  2331. 0,
  2332. 10 * 3,
  2333. 14 * 3,
  2334. 0,
  2335. 20 * 3,
  2336. 19 * 3,
  2337. 0,
  2338. 18 * 3,
  2339. 16 * 3,
  2340. 0,
  2341. 23 * 3,
  2342. 17 * 3,
  2343. 0,
  2344. 27 * 3,
  2345. 25 * 3,
  2346. 0,
  2347. 21 * 3,
  2348. 28 * 3,
  2349. 0,
  2350. 15 * 3,
  2351. 22 * 3,
  2352. 0,
  2353. 24 * 3,
  2354. 26 * 3,
  2355. 0,
  2356. 0,
  2357. 0,
  2358. 60,
  2359. 35 * 3,
  2360. 40 * 3,
  2361. 0,
  2362. 44 * 3,
  2363. 48 * 3,
  2364. 0,
  2365. 38 * 3,
  2366. 36 * 3,
  2367. 0,
  2368. 42 * 3,
  2369. 47 * 3,
  2370. 0,
  2371. 29 * 3,
  2372. 31 * 3,
  2373. 0,
  2374. 39 * 3,
  2375. 32 * 3,
  2376. 0,
  2377. 0,
  2378. 0,
  2379. 32,
  2380. 45 * 3,
  2381. 46 * 3,
  2382. 0,
  2383. 33 * 3,
  2384. 41 * 3,
  2385. 0,
  2386. 43 * 3,
  2387. 34 * 3,
  2388. 0,
  2389. 0,
  2390. 0,
  2391. 4,
  2392. 30 * 3,
  2393. 37 * 3,
  2394. 0,
  2395. 0,
  2396. 0,
  2397. 8,
  2398. 0,
  2399. 0,
  2400. 16,
  2401. 0,
  2402. 0,
  2403. 44,
  2404. 50 * 3,
  2405. 56 * 3,
  2406. 0,
  2407. 0,
  2408. 0,
  2409. 28,
  2410. 0,
  2411. 0,
  2412. 52,
  2413. 0,
  2414. 0,
  2415. 62,
  2416. 61 * 3,
  2417. 59 * 3,
  2418. 0,
  2419. 52 * 3,
  2420. 60 * 3,
  2421. 0,
  2422. 0,
  2423. 0,
  2424. 1,
  2425. 55 * 3,
  2426. 54 * 3,
  2427. 0,
  2428. 0,
  2429. 0,
  2430. 61,
  2431. 0,
  2432. 0,
  2433. 56,
  2434. 57 * 3,
  2435. 58 * 3,
  2436. 0,
  2437. 0,
  2438. 0,
  2439. 2,
  2440. 0,
  2441. 0,
  2442. 40,
  2443. 51 * 3,
  2444. 62 * 3,
  2445. 0,
  2446. 0,
  2447. 0,
  2448. 48,
  2449. 64 * 3,
  2450. 63 * 3,
  2451. 0,
  2452. 49 * 3,
  2453. 53 * 3,
  2454. 0,
  2455. 0,
  2456. 0,
  2457. 20,
  2458. 0,
  2459. 0,
  2460. 12,
  2461. 80 * 3,
  2462. 83 * 3,
  2463. 0,
  2464. 0,
  2465. 0,
  2466. 63,
  2467. 77 * 3,
  2468. 75 * 3,
  2469. 0,
  2470. 65 * 3,
  2471. 73 * 3,
  2472. 0,
  2473. 84 * 3,
  2474. 66 * 3,
  2475. 0,
  2476. 0,
  2477. 0,
  2478. 24,
  2479. 0,
  2480. 0,
  2481. 36,
  2482. 0,
  2483. 0,
  2484. 3,
  2485. 69 * 3,
  2486. 87 * 3,
  2487. 0,
  2488. 81 * 3,
  2489. 79 * 3,
  2490. 0,
  2491. 68 * 3,
  2492. 71 * 3,
  2493. 0,
  2494. 70 * 3,
  2495. 78 * 3,
  2496. 0,
  2497. 67 * 3,
  2498. 76 * 3,
  2499. 0,
  2500. 72 * 3,
  2501. 74 * 3,
  2502. 0,
  2503. 86 * 3,
  2504. 85 * 3,
  2505. 0,
  2506. 88 * 3,
  2507. 82 * 3,
  2508. 0,
  2509. -1,
  2510. 94 * 3,
  2511. 0,
  2512. 95 * 3,
  2513. 97 * 3,
  2514. 0,
  2515. 0,
  2516. 0,
  2517. 33,
  2518. 0,
  2519. 0,
  2520. 9,
  2521. 106 * 3,
  2522. 110 * 3,
  2523. 0,
  2524. 102 * 3,
  2525. 116 * 3,
  2526. 0,
  2527. 0,
  2528. 0,
  2529. 5,
  2530. 0,
  2531. 0,
  2532. 10,
  2533. 93 * 3,
  2534. 89 * 3,
  2535. 0,
  2536. 0,
  2537. 0,
  2538. 6,
  2539. 0,
  2540. 0,
  2541. 18,
  2542. 0,
  2543. 0,
  2544. 17,
  2545. 0,
  2546. 0,
  2547. 34,
  2548. 113 * 3,
  2549. 119 * 3,
  2550. 0,
  2551. 103 * 3,
  2552. 104 * 3,
  2553. 0,
  2554. 90 * 3,
  2555. 92 * 3,
  2556. 0,
  2557. 109 * 3,
  2558. 107 * 3,
  2559. 0,
  2560. 117 * 3,
  2561. 118 * 3,
  2562. 0,
  2563. 101 * 3,
  2564. 99 * 3,
  2565. 0,
  2566. 98 * 3,
  2567. 96 * 3,
  2568. 0,
  2569. 100 * 3,
  2570. 91 * 3,
  2571. 0,
  2572. 114 * 3,
  2573. 115 * 3,
  2574. 0,
  2575. 105 * 3,
  2576. 108 * 3,
  2577. 0,
  2578. 112 * 3,
  2579. 111 * 3,
  2580. 0,
  2581. 121 * 3,
  2582. 125 * 3,
  2583. 0,
  2584. 0,
  2585. 0,
  2586. 41,
  2587. 0,
  2588. 0,
  2589. 14,
  2590. 0,
  2591. 0,
  2592. 21,
  2593. 124 * 3,
  2594. 122 * 3,
  2595. 0,
  2596. 120 * 3,
  2597. 123 * 3,
  2598. 0,
  2599. 0,
  2600. 0,
  2601. 11,
  2602. 0,
  2603. 0,
  2604. 19,
  2605. 0,
  2606. 0,
  2607. 7,
  2608. 0,
  2609. 0,
  2610. 35,
  2611. 0,
  2612. 0,
  2613. 13,
  2614. 0,
  2615. 0,
  2616. 50,
  2617. 0,
  2618. 0,
  2619. 49,
  2620. 0,
  2621. 0,
  2622. 58,
  2623. 0,
  2624. 0,
  2625. 37,
  2626. 0,
  2627. 0,
  2628. 25,
  2629. 0,
  2630. 0,
  2631. 45,
  2632. 0,
  2633. 0,
  2634. 57,
  2635. 0,
  2636. 0,
  2637. 26,
  2638. 0,
  2639. 0,
  2640. 29,
  2641. 0,
  2642. 0,
  2643. 38,
  2644. 0,
  2645. 0,
  2646. 53,
  2647. 0,
  2648. 0,
  2649. 23,
  2650. 0,
  2651. 0,
  2652. 43,
  2653. 0,
  2654. 0,
  2655. 46,
  2656. 0,
  2657. 0,
  2658. 42,
  2659. 0,
  2660. 0,
  2661. 22,
  2662. 0,
  2663. 0,
  2664. 54,
  2665. 0,
  2666. 0,
  2667. 51,
  2668. 0,
  2669. 0,
  2670. 15,
  2671. 0,
  2672. 0,
  2673. 30,
  2674. 0,
  2675. 0,
  2676. 39,
  2677. 0,
  2678. 0,
  2679. 47,
  2680. 0,
  2681. 0,
  2682. 55,
  2683. 0,
  2684. 0,
  2685. 27,
  2686. 0,
  2687. 0,
  2688. 59,
  2689. 0,
  2690. 0,
  2691. 31,
  2692. ]);
  2693. MPEG1.MOTION = new Int16Array([
  2694. 1 * 3,
  2695. 2 * 3,
  2696. 0,
  2697. 4 * 3,
  2698. 3 * 3,
  2699. 0,
  2700. 0,
  2701. 0,
  2702. 0,
  2703. 6 * 3,
  2704. 5 * 3,
  2705. 0,
  2706. 8 * 3,
  2707. 7 * 3,
  2708. 0,
  2709. 0,
  2710. 0,
  2711. -1,
  2712. 0,
  2713. 0,
  2714. 1,
  2715. 9 * 3,
  2716. 10 * 3,
  2717. 0,
  2718. 12 * 3,
  2719. 11 * 3,
  2720. 0,
  2721. 0,
  2722. 0,
  2723. 2,
  2724. 0,
  2725. 0,
  2726. -2,
  2727. 14 * 3,
  2728. 15 * 3,
  2729. 0,
  2730. 16 * 3,
  2731. 13 * 3,
  2732. 0,
  2733. 20 * 3,
  2734. 18 * 3,
  2735. 0,
  2736. 0,
  2737. 0,
  2738. 3,
  2739. 0,
  2740. 0,
  2741. -3,
  2742. 17 * 3,
  2743. 19 * 3,
  2744. 0,
  2745. -1,
  2746. 23 * 3,
  2747. 0,
  2748. 27 * 3,
  2749. 25 * 3,
  2750. 0,
  2751. 26 * 3,
  2752. 21 * 3,
  2753. 0,
  2754. 24 * 3,
  2755. 22 * 3,
  2756. 0,
  2757. 32 * 3,
  2758. 28 * 3,
  2759. 0,
  2760. 29 * 3,
  2761. 31 * 3,
  2762. 0,
  2763. -1,
  2764. 33 * 3,
  2765. 0,
  2766. 36 * 3,
  2767. 35 * 3,
  2768. 0,
  2769. 0,
  2770. 0,
  2771. -4,
  2772. 30 * 3,
  2773. 34 * 3,
  2774. 0,
  2775. 0,
  2776. 0,
  2777. 4,
  2778. 0,
  2779. 0,
  2780. -7,
  2781. 0,
  2782. 0,
  2783. 5,
  2784. 37 * 3,
  2785. 41 * 3,
  2786. 0,
  2787. 0,
  2788. 0,
  2789. -5,
  2790. 0,
  2791. 0,
  2792. 7,
  2793. 38 * 3,
  2794. 40 * 3,
  2795. 0,
  2796. 42 * 3,
  2797. 39 * 3,
  2798. 0,
  2799. 0,
  2800. 0,
  2801. -6,
  2802. 0,
  2803. 0,
  2804. 6,
  2805. 51 * 3,
  2806. 54 * 3,
  2807. 0,
  2808. 50 * 3,
  2809. 49 * 3,
  2810. 0,
  2811. 45 * 3,
  2812. 46 * 3,
  2813. 0,
  2814. 52 * 3,
  2815. 47 * 3,
  2816. 0,
  2817. 43 * 3,
  2818. 53 * 3,
  2819. 0,
  2820. 44 * 3,
  2821. 48 * 3,
  2822. 0,
  2823. 0,
  2824. 0,
  2825. 10,
  2826. 0,
  2827. 0,
  2828. 9,
  2829. 0,
  2830. 0,
  2831. 8,
  2832. 0,
  2833. 0,
  2834. -8,
  2835. 57 * 3,
  2836. 66 * 3,
  2837. 0,
  2838. 0,
  2839. 0,
  2840. -9,
  2841. 60 * 3,
  2842. 64 * 3,
  2843. 0,
  2844. 56 * 3,
  2845. 61 * 3,
  2846. 0,
  2847. 55 * 3,
  2848. 62 * 3,
  2849. 0,
  2850. 58 * 3,
  2851. 63 * 3,
  2852. 0,
  2853. 0,
  2854. 0,
  2855. -10,
  2856. 59 * 3,
  2857. 65 * 3,
  2858. 0,
  2859. 0,
  2860. 0,
  2861. 12,
  2862. 0,
  2863. 0,
  2864. 16,
  2865. 0,
  2866. 0,
  2867. 13,
  2868. 0,
  2869. 0,
  2870. 14,
  2871. 0,
  2872. 0,
  2873. 11,
  2874. 0,
  2875. 0,
  2876. 15,
  2877. 0,
  2878. 0,
  2879. -16,
  2880. 0,
  2881. 0,
  2882. -12,
  2883. 0,
  2884. 0,
  2885. -14,
  2886. 0,
  2887. 0,
  2888. -15,
  2889. 0,
  2890. 0,
  2891. -11,
  2892. 0,
  2893. 0,
  2894. -13,
  2895. ]);
  2896. MPEG1.DCT_DC_SIZE_LUMINANCE = new Int8Array([
  2897. 2 * 3,
  2898. 1 * 3,
  2899. 0,
  2900. 6 * 3,
  2901. 5 * 3,
  2902. 0,
  2903. 3 * 3,
  2904. 4 * 3,
  2905. 0,
  2906. 0,
  2907. 0,
  2908. 1,
  2909. 0,
  2910. 0,
  2911. 2,
  2912. 9 * 3,
  2913. 8 * 3,
  2914. 0,
  2915. 7 * 3,
  2916. 10 * 3,
  2917. 0,
  2918. 0,
  2919. 0,
  2920. 0,
  2921. 12 * 3,
  2922. 11 * 3,
  2923. 0,
  2924. 0,
  2925. 0,
  2926. 4,
  2927. 0,
  2928. 0,
  2929. 3,
  2930. 13 * 3,
  2931. 14 * 3,
  2932. 0,
  2933. 0,
  2934. 0,
  2935. 5,
  2936. 0,
  2937. 0,
  2938. 6,
  2939. 16 * 3,
  2940. 15 * 3,
  2941. 0,
  2942. 17 * 3,
  2943. -1,
  2944. 0,
  2945. 0,
  2946. 0,
  2947. 7,
  2948. 0,
  2949. 0,
  2950. 8,
  2951. ]);
  2952. MPEG1.DCT_DC_SIZE_CHROMINANCE = new Int8Array([
  2953. 2 * 3,
  2954. 1 * 3,
  2955. 0,
  2956. 4 * 3,
  2957. 3 * 3,
  2958. 0,
  2959. 6 * 3,
  2960. 5 * 3,
  2961. 0,
  2962. 8 * 3,
  2963. 7 * 3,
  2964. 0,
  2965. 0,
  2966. 0,
  2967. 2,
  2968. 0,
  2969. 0,
  2970. 1,
  2971. 0,
  2972. 0,
  2973. 0,
  2974. 10 * 3,
  2975. 9 * 3,
  2976. 0,
  2977. 0,
  2978. 0,
  2979. 3,
  2980. 12 * 3,
  2981. 11 * 3,
  2982. 0,
  2983. 0,
  2984. 0,
  2985. 4,
  2986. 14 * 3,
  2987. 13 * 3,
  2988. 0,
  2989. 0,
  2990. 0,
  2991. 5,
  2992. 16 * 3,
  2993. 15 * 3,
  2994. 0,
  2995. 0,
  2996. 0,
  2997. 6,
  2998. 17 * 3,
  2999. -1,
  3000. 0,
  3001. 0,
  3002. 0,
  3003. 7,
  3004. 0,
  3005. 0,
  3006. 8,
  3007. ]);
  3008. MPEG1.DCT_COEFF = new Int32Array([
  3009. 1 * 3,
  3010. 2 * 3,
  3011. 0,
  3012. 4 * 3,
  3013. 3 * 3,
  3014. 0,
  3015. 0,
  3016. 0,
  3017. 1,
  3018. 7 * 3,
  3019. 8 * 3,
  3020. 0,
  3021. 6 * 3,
  3022. 5 * 3,
  3023. 0,
  3024. 13 * 3,
  3025. 9 * 3,
  3026. 0,
  3027. 11 * 3,
  3028. 10 * 3,
  3029. 0,
  3030. 14 * 3,
  3031. 12 * 3,
  3032. 0,
  3033. 0,
  3034. 0,
  3035. 257,
  3036. 20 * 3,
  3037. 22 * 3,
  3038. 0,
  3039. 18 * 3,
  3040. 21 * 3,
  3041. 0,
  3042. 16 * 3,
  3043. 19 * 3,
  3044. 0,
  3045. 0,
  3046. 0,
  3047. 513,
  3048. 17 * 3,
  3049. 15 * 3,
  3050. 0,
  3051. 0,
  3052. 0,
  3053. 2,
  3054. 0,
  3055. 0,
  3056. 3,
  3057. 27 * 3,
  3058. 25 * 3,
  3059. 0,
  3060. 29 * 3,
  3061. 31 * 3,
  3062. 0,
  3063. 24 * 3,
  3064. 26 * 3,
  3065. 0,
  3066. 32 * 3,
  3067. 30 * 3,
  3068. 0,
  3069. 0,
  3070. 0,
  3071. 1025,
  3072. 23 * 3,
  3073. 28 * 3,
  3074. 0,
  3075. 0,
  3076. 0,
  3077. 769,
  3078. 0,
  3079. 0,
  3080. 258,
  3081. 0,
  3082. 0,
  3083. 1793,
  3084. 0,
  3085. 0,
  3086. 65535,
  3087. 0,
  3088. 0,
  3089. 1537,
  3090. 37 * 3,
  3091. 36 * 3,
  3092. 0,
  3093. 0,
  3094. 0,
  3095. 1281,
  3096. 35 * 3,
  3097. 34 * 3,
  3098. 0,
  3099. 39 * 3,
  3100. 38 * 3,
  3101. 0,
  3102. 33 * 3,
  3103. 42 * 3,
  3104. 0,
  3105. 40 * 3,
  3106. 41 * 3,
  3107. 0,
  3108. 52 * 3,
  3109. 50 * 3,
  3110. 0,
  3111. 54 * 3,
  3112. 53 * 3,
  3113. 0,
  3114. 48 * 3,
  3115. 49 * 3,
  3116. 0,
  3117. 43 * 3,
  3118. 45 * 3,
  3119. 0,
  3120. 46 * 3,
  3121. 44 * 3,
  3122. 0,
  3123. 0,
  3124. 0,
  3125. 2049,
  3126. 0,
  3127. 0,
  3128. 4,
  3129. 0,
  3130. 0,
  3131. 514,
  3132. 0,
  3133. 0,
  3134. 2305,
  3135. 51 * 3,
  3136. 47 * 3,
  3137. 0,
  3138. 55 * 3,
  3139. 57 * 3,
  3140. 0,
  3141. 60 * 3,
  3142. 56 * 3,
  3143. 0,
  3144. 59 * 3,
  3145. 58 * 3,
  3146. 0,
  3147. 61 * 3,
  3148. 62 * 3,
  3149. 0,
  3150. 0,
  3151. 0,
  3152. 2561,
  3153. 0,
  3154. 0,
  3155. 3329,
  3156. 0,
  3157. 0,
  3158. 6,
  3159. 0,
  3160. 0,
  3161. 259,
  3162. 0,
  3163. 0,
  3164. 5,
  3165. 0,
  3166. 0,
  3167. 770,
  3168. 0,
  3169. 0,
  3170. 2817,
  3171. 0,
  3172. 0,
  3173. 3073,
  3174. 76 * 3,
  3175. 75 * 3,
  3176. 0,
  3177. 67 * 3,
  3178. 70 * 3,
  3179. 0,
  3180. 73 * 3,
  3181. 71 * 3,
  3182. 0,
  3183. 78 * 3,
  3184. 74 * 3,
  3185. 0,
  3186. 72 * 3,
  3187. 77 * 3,
  3188. 0,
  3189. 69 * 3,
  3190. 64 * 3,
  3191. 0,
  3192. 68 * 3,
  3193. 63 * 3,
  3194. 0,
  3195. 66 * 3,
  3196. 65 * 3,
  3197. 0,
  3198. 81 * 3,
  3199. 87 * 3,
  3200. 0,
  3201. 91 * 3,
  3202. 80 * 3,
  3203. 0,
  3204. 82 * 3,
  3205. 79 * 3,
  3206. 0,
  3207. 83 * 3,
  3208. 86 * 3,
  3209. 0,
  3210. 93 * 3,
  3211. 92 * 3,
  3212. 0,
  3213. 84 * 3,
  3214. 85 * 3,
  3215. 0,
  3216. 90 * 3,
  3217. 94 * 3,
  3218. 0,
  3219. 88 * 3,
  3220. 89 * 3,
  3221. 0,
  3222. 0,
  3223. 0,
  3224. 515,
  3225. 0,
  3226. 0,
  3227. 260,
  3228. 0,
  3229. 0,
  3230. 7,
  3231. 0,
  3232. 0,
  3233. 1026,
  3234. 0,
  3235. 0,
  3236. 1282,
  3237. 0,
  3238. 0,
  3239. 4097,
  3240. 0,
  3241. 0,
  3242. 3841,
  3243. 0,
  3244. 0,
  3245. 3585,
  3246. 105 * 3,
  3247. 107 * 3,
  3248. 0,
  3249. 111 * 3,
  3250. 114 * 3,
  3251. 0,
  3252. 104 * 3,
  3253. 97 * 3,
  3254. 0,
  3255. 125 * 3,
  3256. 119 * 3,
  3257. 0,
  3258. 96 * 3,
  3259. 98 * 3,
  3260. 0,
  3261. -1,
  3262. 123 * 3,
  3263. 0,
  3264. 95 * 3,
  3265. 101 * 3,
  3266. 0,
  3267. 106 * 3,
  3268. 121 * 3,
  3269. 0,
  3270. 99 * 3,
  3271. 102 * 3,
  3272. 0,
  3273. 113 * 3,
  3274. 103 * 3,
  3275. 0,
  3276. 112 * 3,
  3277. 116 * 3,
  3278. 0,
  3279. 110 * 3,
  3280. 100 * 3,
  3281. 0,
  3282. 124 * 3,
  3283. 115 * 3,
  3284. 0,
  3285. 117 * 3,
  3286. 122 * 3,
  3287. 0,
  3288. 109 * 3,
  3289. 118 * 3,
  3290. 0,
  3291. 120 * 3,
  3292. 108 * 3,
  3293. 0,
  3294. 127 * 3,
  3295. 136 * 3,
  3296. 0,
  3297. 139 * 3,
  3298. 140 * 3,
  3299. 0,
  3300. 130 * 3,
  3301. 126 * 3,
  3302. 0,
  3303. 145 * 3,
  3304. 146 * 3,
  3305. 0,
  3306. 128 * 3,
  3307. 129 * 3,
  3308. 0,
  3309. 0,
  3310. 0,
  3311. 2050,
  3312. 132 * 3,
  3313. 134 * 3,
  3314. 0,
  3315. 155 * 3,
  3316. 154 * 3,
  3317. 0,
  3318. 0,
  3319. 0,
  3320. 8,
  3321. 137 * 3,
  3322. 133 * 3,
  3323. 0,
  3324. 143 * 3,
  3325. 144 * 3,
  3326. 0,
  3327. 151 * 3,
  3328. 138 * 3,
  3329. 0,
  3330. 142 * 3,
  3331. 141 * 3,
  3332. 0,
  3333. 0,
  3334. 0,
  3335. 10,
  3336. 0,
  3337. 0,
  3338. 9,
  3339. 0,
  3340. 0,
  3341. 11,
  3342. 0,
  3343. 0,
  3344. 5377,
  3345. 0,
  3346. 0,
  3347. 1538,
  3348. 0,
  3349. 0,
  3350. 771,
  3351. 0,
  3352. 0,
  3353. 5121,
  3354. 0,
  3355. 0,
  3356. 1794,
  3357. 0,
  3358. 0,
  3359. 4353,
  3360. 0,
  3361. 0,
  3362. 4609,
  3363. 0,
  3364. 0,
  3365. 4865,
  3366. 148 * 3,
  3367. 152 * 3,
  3368. 0,
  3369. 0,
  3370. 0,
  3371. 1027,
  3372. 153 * 3,
  3373. 150 * 3,
  3374. 0,
  3375. 0,
  3376. 0,
  3377. 261,
  3378. 131 * 3,
  3379. 135 * 3,
  3380. 0,
  3381. 0,
  3382. 0,
  3383. 516,
  3384. 149 * 3,
  3385. 147 * 3,
  3386. 0,
  3387. 172 * 3,
  3388. 173 * 3,
  3389. 0,
  3390. 162 * 3,
  3391. 158 * 3,
  3392. 0,
  3393. 170 * 3,
  3394. 161 * 3,
  3395. 0,
  3396. 168 * 3,
  3397. 166 * 3,
  3398. 0,
  3399. 157 * 3,
  3400. 179 * 3,
  3401. 0,
  3402. 169 * 3,
  3403. 167 * 3,
  3404. 0,
  3405. 174 * 3,
  3406. 171 * 3,
  3407. 0,
  3408. 178 * 3,
  3409. 177 * 3,
  3410. 0,
  3411. 156 * 3,
  3412. 159 * 3,
  3413. 0,
  3414. 164 * 3,
  3415. 165 * 3,
  3416. 0,
  3417. 183 * 3,
  3418. 182 * 3,
  3419. 0,
  3420. 175 * 3,
  3421. 176 * 3,
  3422. 0,
  3423. 0,
  3424. 0,
  3425. 263,
  3426. 0,
  3427. 0,
  3428. 2562,
  3429. 0,
  3430. 0,
  3431. 2306,
  3432. 0,
  3433. 0,
  3434. 5633,
  3435. 0,
  3436. 0,
  3437. 5889,
  3438. 0,
  3439. 0,
  3440. 6401,
  3441. 0,
  3442. 0,
  3443. 6145,
  3444. 0,
  3445. 0,
  3446. 1283,
  3447. 0,
  3448. 0,
  3449. 772,
  3450. 0,
  3451. 0,
  3452. 13,
  3453. 0,
  3454. 0,
  3455. 12,
  3456. 0,
  3457. 0,
  3458. 14,
  3459. 0,
  3460. 0,
  3461. 15,
  3462. 0,
  3463. 0,
  3464. 517,
  3465. 0,
  3466. 0,
  3467. 6657,
  3468. 0,
  3469. 0,
  3470. 262,
  3471. 180 * 3,
  3472. 181 * 3,
  3473. 0,
  3474. 160 * 3,
  3475. 163 * 3,
  3476. 0,
  3477. 196 * 3,
  3478. 199 * 3,
  3479. 0,
  3480. 0,
  3481. 0,
  3482. 27,
  3483. 203 * 3,
  3484. 185 * 3,
  3485. 0,
  3486. 202 * 3,
  3487. 201 * 3,
  3488. 0,
  3489. 0,
  3490. 0,
  3491. 19,
  3492. 0,
  3493. 0,
  3494. 22,
  3495. 197 * 3,
  3496. 207 * 3,
  3497. 0,
  3498. 0,
  3499. 0,
  3500. 18,
  3501. 191 * 3,
  3502. 192 * 3,
  3503. 0,
  3504. 188 * 3,
  3505. 190 * 3,
  3506. 0,
  3507. 0,
  3508. 0,
  3509. 20,
  3510. 184 * 3,
  3511. 194 * 3,
  3512. 0,
  3513. 0,
  3514. 0,
  3515. 21,
  3516. 186 * 3,
  3517. 193 * 3,
  3518. 0,
  3519. 0,
  3520. 0,
  3521. 23,
  3522. 204 * 3,
  3523. 198 * 3,
  3524. 0,
  3525. 0,
  3526. 0,
  3527. 25,
  3528. 0,
  3529. 0,
  3530. 24,
  3531. 200 * 3,
  3532. 205 * 3,
  3533. 0,
  3534. 0,
  3535. 0,
  3536. 31,
  3537. 0,
  3538. 0,
  3539. 30,
  3540. 0,
  3541. 0,
  3542. 28,
  3543. 0,
  3544. 0,
  3545. 29,
  3546. 0,
  3547. 0,
  3548. 26,
  3549. 0,
  3550. 0,
  3551. 17,
  3552. 0,
  3553. 0,
  3554. 16,
  3555. 189 * 3,
  3556. 206 * 3,
  3557. 0,
  3558. 187 * 3,
  3559. 195 * 3,
  3560. 0,
  3561. 218 * 3,
  3562. 211 * 3,
  3563. 0,
  3564. 0,
  3565. 0,
  3566. 37,
  3567. 215 * 3,
  3568. 216 * 3,
  3569. 0,
  3570. 0,
  3571. 0,
  3572. 36,
  3573. 210 * 3,
  3574. 212 * 3,
  3575. 0,
  3576. 0,
  3577. 0,
  3578. 34,
  3579. 213 * 3,
  3580. 209 * 3,
  3581. 0,
  3582. 221 * 3,
  3583. 222 * 3,
  3584. 0,
  3585. 219 * 3,
  3586. 208 * 3,
  3587. 0,
  3588. 217 * 3,
  3589. 214 * 3,
  3590. 0,
  3591. 223 * 3,
  3592. 220 * 3,
  3593. 0,
  3594. 0,
  3595. 0,
  3596. 35,
  3597. 0,
  3598. 0,
  3599. 267,
  3600. 0,
  3601. 0,
  3602. 40,
  3603. 0,
  3604. 0,
  3605. 268,
  3606. 0,
  3607. 0,
  3608. 266,
  3609. 0,
  3610. 0,
  3611. 32,
  3612. 0,
  3613. 0,
  3614. 264,
  3615. 0,
  3616. 0,
  3617. 265,
  3618. 0,
  3619. 0,
  3620. 38,
  3621. 0,
  3622. 0,
  3623. 269,
  3624. 0,
  3625. 0,
  3626. 270,
  3627. 0,
  3628. 0,
  3629. 33,
  3630. 0,
  3631. 0,
  3632. 39,
  3633. 0,
  3634. 0,
  3635. 7937,
  3636. 0,
  3637. 0,
  3638. 6913,
  3639. 0,
  3640. 0,
  3641. 7681,
  3642. 0,
  3643. 0,
  3644. 4098,
  3645. 0,
  3646. 0,
  3647. 7425,
  3648. 0,
  3649. 0,
  3650. 7169,
  3651. 0,
  3652. 0,
  3653. 271,
  3654. 0,
  3655. 0,
  3656. 274,
  3657. 0,
  3658. 0,
  3659. 273,
  3660. 0,
  3661. 0,
  3662. 272,
  3663. 0,
  3664. 0,
  3665. 1539,
  3666. 0,
  3667. 0,
  3668. 2818,
  3669. 0,
  3670. 0,
  3671. 3586,
  3672. 0,
  3673. 0,
  3674. 3330,
  3675. 0,
  3676. 0,
  3677. 3074,
  3678. 0,
  3679. 0,
  3680. 3842,
  3681. ]);
  3682. MPEG1.PICTURE_TYPE = { INTRA: 1, PREDICTIVE: 2, B: 3 };
  3683. MPEG1.START = {
  3684. SEQUENCE: 179,
  3685. SLICE_FIRST: 1,
  3686. SLICE_LAST: 175,
  3687. PICTURE: 0,
  3688. EXTENSION: 181,
  3689. USER_DATA: 178,
  3690. };
  3691. return MPEG1;
  3692. })();
  3693. JSMpeg.Decoder.MPEG1VideoWASM = (function () {
  3694. 'use strict';
  3695. var MPEG1WASM = function (options) {
  3696. JSMpeg.Decoder.Base.call(this, options);
  3697. this.onDecodeCallback = options.onVideoDecode;
  3698. this.module = options.wasmModule;
  3699. this.bufferSize = options.videoBufferSize || 512 * 1024;
  3700. this.bufferMode = options.streaming
  3701. ? JSMpeg.BitBuffer.MODE.EVICT
  3702. : JSMpeg.BitBuffer.MODE.EXPAND;
  3703. this.decodeFirstFrame = options.decodeFirstFrame !== false;
  3704. this.hasSequenceHeader = false;
  3705. };
  3706. MPEG1WASM.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
  3707. MPEG1WASM.prototype.constructor = MPEG1WASM;
  3708. MPEG1WASM.prototype.initializeWasmDecoder = function () {
  3709. if (!this.module.instance) {
  3710. console.warn('JSMpeg: WASM module not compiled yet');
  3711. return;
  3712. }
  3713. this.instance = this.module.instance;
  3714. this.functions = this.module.instance.exports;
  3715. this.decoder = this.functions._mpeg1_decoder_create(
  3716. this.bufferSize,
  3717. this.bufferMode
  3718. );
  3719. };
  3720. MPEG1WASM.prototype.destroy = function () {
  3721. if (!this.decoder) {
  3722. return;
  3723. }
  3724. this.functions._mpeg1_decoder_destroy(this.decoder);
  3725. };
  3726. MPEG1WASM.prototype.bufferGetIndex = function () {
  3727. if (!this.decoder) {
  3728. return;
  3729. }
  3730. return this.functions._mpeg1_decoder_get_index(this.decoder);
  3731. };
  3732. MPEG1WASM.prototype.bufferSetIndex = function (index) {
  3733. if (!this.decoder) {
  3734. return;
  3735. }
  3736. this.functions._mpeg1_decoder_set_index(this.decoder, index);
  3737. };
  3738. MPEG1WASM.prototype.bufferWrite = function (buffers) {
  3739. if (!this.decoder) {
  3740. this.initializeWasmDecoder();
  3741. }
  3742. var totalLength = 0;
  3743. for (var i = 0; i < buffers.length; i++) {
  3744. totalLength += buffers[i].length;
  3745. }
  3746. var ptr = this.functions._mpeg1_decoder_get_write_ptr(
  3747. this.decoder,
  3748. totalLength
  3749. );
  3750. for (var i = 0; i < buffers.length; i++) {
  3751. this.instance.heapU8.set(buffers[i], ptr);
  3752. ptr += buffers[i].length;
  3753. }
  3754. this.functions._mpeg1_decoder_did_write(this.decoder, totalLength);
  3755. return totalLength;
  3756. };
  3757. MPEG1WASM.prototype.write = function (pts, buffers) {
  3758. JSMpeg.Decoder.Base.prototype.write.call(this, pts, buffers);
  3759. if (
  3760. !this.hasSequenceHeader &&
  3761. this.functions._mpeg1_decoder_has_sequence_header(this.decoder)
  3762. ) {
  3763. this.loadSequenceHeader();
  3764. }
  3765. };
  3766. MPEG1WASM.prototype.loadSequenceHeader = function () {
  3767. this.hasSequenceHeader = true;
  3768. this.frameRate = this.functions._mpeg1_decoder_get_frame_rate(this.decoder);
  3769. this.codedSize = this.functions._mpeg1_decoder_get_coded_size(this.decoder);
  3770. if (this.destination) {
  3771. var w = this.functions._mpeg1_decoder_get_width(this.decoder);
  3772. var h = this.functions._mpeg1_decoder_get_height(this.decoder);
  3773. this.destination.resize(w, h);
  3774. }
  3775. if (this.decodeFirstFrame) {
  3776. this.decode();
  3777. }
  3778. };
  3779. MPEG1WASM.prototype.decode = function () {
  3780. var startTime = JSMpeg.Now();
  3781. if (!this.decoder) {
  3782. return false;
  3783. }
  3784. var didDecode = this.functions._mpeg1_decoder_decode(this.decoder);
  3785. if (!didDecode) {
  3786. return false;
  3787. }
  3788. if (this.destination) {
  3789. var ptrY = this.functions._mpeg1_decoder_get_y_ptr(this.decoder),
  3790. ptrCr = this.functions._mpeg1_decoder_get_cr_ptr(this.decoder),
  3791. ptrCb = this.functions._mpeg1_decoder_get_cb_ptr(this.decoder);
  3792. var dy = this.instance.heapU8.subarray(ptrY, ptrY + this.codedSize);
  3793. var dcr = this.instance.heapU8.subarray(
  3794. ptrCr,
  3795. ptrCr + (this.codedSize >> 2)
  3796. );
  3797. var dcb = this.instance.heapU8.subarray(
  3798. ptrCb,
  3799. ptrCb + (this.codedSize >> 2)
  3800. );
  3801. this.destination.render(dy, dcr, dcb, false);
  3802. }
  3803. this.advanceDecodedTime(1 / this.frameRate);
  3804. var elapsedTime = JSMpeg.Now() - startTime;
  3805. if (this.onDecodeCallback) {
  3806. this.onDecodeCallback(this, elapsedTime);
  3807. }
  3808. return true;
  3809. };
  3810. return MPEG1WASM;
  3811. })();
  3812. JSMpeg.Decoder.MP2Audio = (function () {
  3813. 'use strict';
  3814. var MP2 = function (options) {
  3815. JSMpeg.Decoder.Base.call(this, options);
  3816. this.onDecodeCallback = options.onAudioDecode;
  3817. var bufferSize = options.audioBufferSize || 128 * 1024;
  3818. var bufferMode = options.streaming
  3819. ? JSMpeg.BitBuffer.MODE.EVICT
  3820. : JSMpeg.BitBuffer.MODE.EXPAND;
  3821. this.bits = new JSMpeg.BitBuffer(bufferSize, bufferMode);
  3822. this.left = new Float32Array(1152);
  3823. this.right = new Float32Array(1152);
  3824. this.sampleRate = 44100;
  3825. this.D = new Float32Array(1024);
  3826. this.D.set(MP2.SYNTHESIS_WINDOW, 0);
  3827. this.D.set(MP2.SYNTHESIS_WINDOW, 512);
  3828. this.V = [new Float32Array(1024), new Float32Array(1024)];
  3829. this.U = new Int32Array(32);
  3830. this.VPos = 0;
  3831. this.allocation = [new Array(32), new Array(32)];
  3832. this.scaleFactorInfo = [new Uint8Array(32), new Uint8Array(32)];
  3833. this.scaleFactor = [new Array(32), new Array(32)];
  3834. this.sample = [new Array(32), new Array(32)];
  3835. for (var j = 0; j < 2; j++) {
  3836. for (var i = 0; i < 32; i++) {
  3837. this.scaleFactor[j][i] = [0, 0, 0];
  3838. this.sample[j][i] = [0, 0, 0];
  3839. }
  3840. }
  3841. };
  3842. MP2.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
  3843. MP2.prototype.constructor = MP2;
  3844. MP2.prototype.decode = function () {
  3845. var startTime = JSMpeg.Now();
  3846. var pos = this.bits.index >> 3;
  3847. if (pos >= this.bits.byteLength) {
  3848. return false;
  3849. }
  3850. var decoded = this.decodeFrame(this.left, this.right);
  3851. this.bits.index = (pos + decoded) << 3;
  3852. if (!decoded) {
  3853. return false;
  3854. }
  3855. if (this.destination) {
  3856. this.destination.play(this.sampleRate, this.left, this.right);
  3857. }
  3858. this.advanceDecodedTime(this.left.length / this.sampleRate);
  3859. var elapsedTime = JSMpeg.Now() - startTime;
  3860. if (this.onDecodeCallback) {
  3861. this.onDecodeCallback(this, elapsedTime);
  3862. }
  3863. return true;
  3864. };
  3865. MP2.prototype.getCurrentTime = function () {
  3866. var enqueuedTime = this.destination ? this.destination.enqueuedTime : 0;
  3867. return this.decodedTime - enqueuedTime;
  3868. };
  3869. MP2.prototype.decodeFrame = function (left, right) {
  3870. var sync = this.bits.read(11),
  3871. version = this.bits.read(2),
  3872. layer = this.bits.read(2),
  3873. hasCRC = !this.bits.read(1);
  3874. if (
  3875. sync !== MP2.FRAME_SYNC ||
  3876. version !== MP2.VERSION.MPEG_1 ||
  3877. layer !== MP2.LAYER.II
  3878. ) {
  3879. return 0;
  3880. }
  3881. var bitrateIndex = this.bits.read(4) - 1;
  3882. if (bitrateIndex > 13) {
  3883. return 0;
  3884. }
  3885. var sampleRateIndex = this.bits.read(2);
  3886. var sampleRate = MP2.SAMPLE_RATE[sampleRateIndex];
  3887. if (sampleRateIndex === 3) {
  3888. return 0;
  3889. }
  3890. if (version === MP2.VERSION.MPEG_2) {
  3891. sampleRateIndex += 4;
  3892. bitrateIndex += 14;
  3893. }
  3894. var padding = this.bits.read(1),
  3895. privat = this.bits.read(1),
  3896. mode = this.bits.read(2);
  3897. var bound = 0;
  3898. if (mode === MP2.MODE.JOINT_STEREO) {
  3899. bound = (this.bits.read(2) + 1) << 2;
  3900. } else {
  3901. this.bits.skip(2);
  3902. bound = mode === MP2.MODE.MONO ? 0 : 32;
  3903. }
  3904. this.bits.skip(4);
  3905. if (hasCRC) {
  3906. this.bits.skip(16);
  3907. }
  3908. var bitrate = MP2.BIT_RATE[bitrateIndex],
  3909. sampleRate = MP2.SAMPLE_RATE[sampleRateIndex],
  3910. frameSize = ((144e3 * bitrate) / sampleRate + padding) | 0;
  3911. var tab3 = 0;
  3912. var sblimit = 0;
  3913. if (version === MP2.VERSION.MPEG_2) {
  3914. tab3 = 2;
  3915. sblimit = 30;
  3916. } else {
  3917. var tab1 = mode === MP2.MODE.MONO ? 0 : 1;
  3918. var tab2 = MP2.QUANT_LUT_STEP_1[tab1][bitrateIndex];
  3919. tab3 = MP2.QUANT_LUT_STEP_2[tab2][sampleRateIndex];
  3920. sblimit = tab3 & 63;
  3921. tab3 >>= 6;
  3922. }
  3923. if (bound > sblimit) {
  3924. bound = sblimit;
  3925. }
  3926. for (var sb = 0; sb < bound; sb++) {
  3927. this.allocation[0][sb] = this.readAllocation(sb, tab3);
  3928. this.allocation[1][sb] = this.readAllocation(sb, tab3);
  3929. }
  3930. for (var sb = bound; sb < sblimit; sb++) {
  3931. this.allocation[0][sb] = this.allocation[1][sb] = this.readAllocation(
  3932. sb,
  3933. tab3
  3934. );
  3935. }
  3936. var channels = mode === MP2.MODE.MONO ? 1 : 2;
  3937. for (var sb = 0; sb < sblimit; sb++) {
  3938. for (ch = 0; ch < channels; ch++) {
  3939. if (this.allocation[ch][sb]) {
  3940. this.scaleFactorInfo[ch][sb] = this.bits.read(2);
  3941. }
  3942. }
  3943. if (mode === MP2.MODE.MONO) {
  3944. this.scaleFactorInfo[1][sb] = this.scaleFactorInfo[0][sb];
  3945. }
  3946. }
  3947. for (var sb = 0; sb < sblimit; sb++) {
  3948. for (var ch = 0; ch < channels; ch++) {
  3949. if (this.allocation[ch][sb]) {
  3950. var sf = this.scaleFactor[ch][sb];
  3951. switch (this.scaleFactorInfo[ch][sb]) {
  3952. case 0:
  3953. sf[0] = this.bits.read(6);
  3954. sf[1] = this.bits.read(6);
  3955. sf[2] = this.bits.read(6);
  3956. break;
  3957. case 1:
  3958. sf[0] = sf[1] = this.bits.read(6);
  3959. sf[2] = this.bits.read(6);
  3960. break;
  3961. case 2:
  3962. sf[0] = sf[1] = sf[2] = this.bits.read(6);
  3963. break;
  3964. case 3:
  3965. sf[0] = this.bits.read(6);
  3966. sf[1] = sf[2] = this.bits.read(6);
  3967. break;
  3968. }
  3969. }
  3970. }
  3971. if (mode === MP2.MODE.MONO) {
  3972. this.scaleFactor[1][sb][0] = this.scaleFactor[0][sb][0];
  3973. this.scaleFactor[1][sb][1] = this.scaleFactor[0][sb][1];
  3974. this.scaleFactor[1][sb][2] = this.scaleFactor[0][sb][2];
  3975. }
  3976. }
  3977. var outPos = 0;
  3978. for (var part = 0; part < 3; part++) {
  3979. for (var granule = 0; granule < 4; granule++) {
  3980. for (var sb = 0; sb < bound; sb++) {
  3981. this.readSamples(0, sb, part);
  3982. this.readSamples(1, sb, part);
  3983. }
  3984. for (var sb = bound; sb < sblimit; sb++) {
  3985. this.readSamples(0, sb, part);
  3986. this.sample[1][sb][0] = this.sample[0][sb][0];
  3987. this.sample[1][sb][1] = this.sample[0][sb][1];
  3988. this.sample[1][sb][2] = this.sample[0][sb][2];
  3989. }
  3990. for (var sb = sblimit; sb < 32; sb++) {
  3991. this.sample[0][sb][0] = 0;
  3992. this.sample[0][sb][1] = 0;
  3993. this.sample[0][sb][2] = 0;
  3994. this.sample[1][sb][0] = 0;
  3995. this.sample[1][sb][1] = 0;
  3996. this.sample[1][sb][2] = 0;
  3997. }
  3998. for (var p = 0; p < 3; p++) {
  3999. this.VPos = (this.VPos - 64) & 1023;
  4000. for (var ch = 0; ch < 2; ch++) {
  4001. MP2.MatrixTransform(this.sample[ch], p, this.V[ch], this.VPos);
  4002. JSMpeg.Fill(this.U, 0);
  4003. var dIndex = 512 - (this.VPos >> 1);
  4004. var vIndex = this.VPos % 128 >> 1;
  4005. while (vIndex < 1024) {
  4006. for (var i = 0; i < 32; ++i) {
  4007. this.U[i] += this.D[dIndex++] * this.V[ch][vIndex++];
  4008. }
  4009. vIndex += 128 - 32;
  4010. dIndex += 64 - 32;
  4011. }
  4012. vIndex = 128 - 32 + 1024 - vIndex;
  4013. dIndex -= 512 - 32;
  4014. while (vIndex < 1024) {
  4015. for (var i = 0; i < 32; ++i) {
  4016. this.U[i] += this.D[dIndex++] * this.V[ch][vIndex++];
  4017. }
  4018. vIndex += 128 - 32;
  4019. dIndex += 64 - 32;
  4020. }
  4021. var outChannel = ch === 0 ? left : right;
  4022. for (var j = 0; j < 32; j++) {
  4023. outChannel[outPos + j] = this.U[j] / 2147418112;
  4024. }
  4025. }
  4026. outPos += 32;
  4027. }
  4028. }
  4029. }
  4030. this.sampleRate = sampleRate;
  4031. return frameSize;
  4032. };
  4033. MP2.prototype.readAllocation = function (sb, tab3) {
  4034. var tab4 = MP2.QUANT_LUT_STEP_3[tab3][sb];
  4035. var qtab = MP2.QUANT_LUT_STEP4[tab4 & 15][this.bits.read(tab4 >> 4)];
  4036. return qtab ? MP2.QUANT_TAB[qtab - 1] : 0;
  4037. };
  4038. MP2.prototype.readSamples = function (ch, sb, part) {
  4039. var q = this.allocation[ch][sb],
  4040. sf = this.scaleFactor[ch][sb][part],
  4041. sample = this.sample[ch][sb],
  4042. val = 0;
  4043. if (!q) {
  4044. sample[0] = sample[1] = sample[2] = 0;
  4045. return;
  4046. }
  4047. if (sf === 63) {
  4048. sf = 0;
  4049. } else {
  4050. var shift = (sf / 3) | 0;
  4051. sf = (MP2.SCALEFACTOR_BASE[sf % 3] + ((1 << shift) >> 1)) >> shift;
  4052. }
  4053. var adj = q.levels;
  4054. if (q.group) {
  4055. val = this.bits.read(q.bits);
  4056. sample[0] = val % adj;
  4057. val = (val / adj) | 0;
  4058. sample[1] = val % adj;
  4059. sample[2] = (val / adj) | 0;
  4060. } else {
  4061. sample[0] = this.bits.read(q.bits);
  4062. sample[1] = this.bits.read(q.bits);
  4063. sample[2] = this.bits.read(q.bits);
  4064. }
  4065. var scale = (65536 / (adj + 1)) | 0;
  4066. adj = ((adj + 1) >> 1) - 1;
  4067. val = (adj - sample[0]) * scale;
  4068. sample[0] = (val * (sf >> 12) + ((val * (sf & 4095) + 2048) >> 12)) >> 12;
  4069. val = (adj - sample[1]) * scale;
  4070. sample[1] = (val * (sf >> 12) + ((val * (sf & 4095) + 2048) >> 12)) >> 12;
  4071. val = (adj - sample[2]) * scale;
  4072. sample[2] = (val * (sf >> 12) + ((val * (sf & 4095) + 2048) >> 12)) >> 12;
  4073. };
  4074. MP2.MatrixTransform = function (s, ss, d, dp) {
  4075. var t01,
  4076. t02,
  4077. t03,
  4078. t04,
  4079. t05,
  4080. t06,
  4081. t07,
  4082. t08,
  4083. t09,
  4084. t10,
  4085. t11,
  4086. t12,
  4087. t13,
  4088. t14,
  4089. t15,
  4090. t16,
  4091. t17,
  4092. t18,
  4093. t19,
  4094. t20,
  4095. t21,
  4096. t22,
  4097. t23,
  4098. t24,
  4099. t25,
  4100. t26,
  4101. t27,
  4102. t28,
  4103. t29,
  4104. t30,
  4105. t31,
  4106. t32,
  4107. t33;
  4108. t01 = s[0][ss] + s[31][ss];
  4109. t02 = (s[0][ss] - s[31][ss]) * 0.500602998235;
  4110. t03 = s[1][ss] + s[30][ss];
  4111. t04 = (s[1][ss] - s[30][ss]) * 0.505470959898;
  4112. t05 = s[2][ss] + s[29][ss];
  4113. t06 = (s[2][ss] - s[29][ss]) * 0.515447309923;
  4114. t07 = s[3][ss] + s[28][ss];
  4115. t08 = (s[3][ss] - s[28][ss]) * 0.53104259109;
  4116. t09 = s[4][ss] + s[27][ss];
  4117. t10 = (s[4][ss] - s[27][ss]) * 0.553103896034;
  4118. t11 = s[5][ss] + s[26][ss];
  4119. t12 = (s[5][ss] - s[26][ss]) * 0.582934968206;
  4120. t13 = s[6][ss] + s[25][ss];
  4121. t14 = (s[6][ss] - s[25][ss]) * 0.622504123036;
  4122. t15 = s[7][ss] + s[24][ss];
  4123. t16 = (s[7][ss] - s[24][ss]) * 0.674808341455;
  4124. t17 = s[8][ss] + s[23][ss];
  4125. t18 = (s[8][ss] - s[23][ss]) * 0.744536271002;
  4126. t19 = s[9][ss] + s[22][ss];
  4127. t20 = (s[9][ss] - s[22][ss]) * 0.839349645416;
  4128. t21 = s[10][ss] + s[21][ss];
  4129. t22 = (s[10][ss] - s[21][ss]) * 0.972568237862;
  4130. t23 = s[11][ss] + s[20][ss];
  4131. t24 = (s[11][ss] - s[20][ss]) * 1.16943993343;
  4132. t25 = s[12][ss] + s[19][ss];
  4133. t26 = (s[12][ss] - s[19][ss]) * 1.48416461631;
  4134. t27 = s[13][ss] + s[18][ss];
  4135. t28 = (s[13][ss] - s[18][ss]) * 2.05778100995;
  4136. t29 = s[14][ss] + s[17][ss];
  4137. t30 = (s[14][ss] - s[17][ss]) * 3.40760841847;
  4138. t31 = s[15][ss] + s[16][ss];
  4139. t32 = (s[15][ss] - s[16][ss]) * 10.1900081235;
  4140. t33 = t01 + t31;
  4141. t31 = (t01 - t31) * 0.502419286188;
  4142. t01 = t03 + t29;
  4143. t29 = (t03 - t29) * 0.52249861494;
  4144. t03 = t05 + t27;
  4145. t27 = (t05 - t27) * 0.566944034816;
  4146. t05 = t07 + t25;
  4147. t25 = (t07 - t25) * 0.64682178336;
  4148. t07 = t09 + t23;
  4149. t23 = (t09 - t23) * 0.788154623451;
  4150. t09 = t11 + t21;
  4151. t21 = (t11 - t21) * 1.06067768599;
  4152. t11 = t13 + t19;
  4153. t19 = (t13 - t19) * 1.72244709824;
  4154. t13 = t15 + t17;
  4155. t17 = (t15 - t17) * 5.10114861869;
  4156. t15 = t33 + t13;
  4157. t13 = (t33 - t13) * 0.509795579104;
  4158. t33 = t01 + t11;
  4159. t01 = (t01 - t11) * 0.601344886935;
  4160. t11 = t03 + t09;
  4161. t09 = (t03 - t09) * 0.899976223136;
  4162. t03 = t05 + t07;
  4163. t07 = (t05 - t07) * 2.56291544774;
  4164. t05 = t15 + t03;
  4165. t15 = (t15 - t03) * 0.541196100146;
  4166. t03 = t33 + t11;
  4167. t11 = (t33 - t11) * 1.30656296488;
  4168. t33 = t05 + t03;
  4169. t05 = (t05 - t03) * 0.707106781187;
  4170. t03 = t15 + t11;
  4171. t15 = (t15 - t11) * 0.707106781187;
  4172. t03 += t15;
  4173. t11 = t13 + t07;
  4174. t13 = (t13 - t07) * 0.541196100146;
  4175. t07 = t01 + t09;
  4176. t09 = (t01 - t09) * 1.30656296488;
  4177. t01 = t11 + t07;
  4178. t07 = (t11 - t07) * 0.707106781187;
  4179. t11 = t13 + t09;
  4180. t13 = (t13 - t09) * 0.707106781187;
  4181. t11 += t13;
  4182. t01 += t11;
  4183. t11 += t07;
  4184. t07 += t13;
  4185. t09 = t31 + t17;
  4186. t31 = (t31 - t17) * 0.509795579104;
  4187. t17 = t29 + t19;
  4188. t29 = (t29 - t19) * 0.601344886935;
  4189. t19 = t27 + t21;
  4190. t21 = (t27 - t21) * 0.899976223136;
  4191. t27 = t25 + t23;
  4192. t23 = (t25 - t23) * 2.56291544774;
  4193. t25 = t09 + t27;
  4194. t09 = (t09 - t27) * 0.541196100146;
  4195. t27 = t17 + t19;
  4196. t19 = (t17 - t19) * 1.30656296488;
  4197. t17 = t25 + t27;
  4198. t27 = (t25 - t27) * 0.707106781187;
  4199. t25 = t09 + t19;
  4200. t19 = (t09 - t19) * 0.707106781187;
  4201. t25 += t19;
  4202. t09 = t31 + t23;
  4203. t31 = (t31 - t23) * 0.541196100146;
  4204. t23 = t29 + t21;
  4205. t21 = (t29 - t21) * 1.30656296488;
  4206. t29 = t09 + t23;
  4207. t23 = (t09 - t23) * 0.707106781187;
  4208. t09 = t31 + t21;
  4209. t31 = (t31 - t21) * 0.707106781187;
  4210. t09 += t31;
  4211. t29 += t09;
  4212. t09 += t23;
  4213. t23 += t31;
  4214. t17 += t29;
  4215. t29 += t25;
  4216. t25 += t09;
  4217. t09 += t27;
  4218. t27 += t23;
  4219. t23 += t19;
  4220. t19 += t31;
  4221. t21 = t02 + t32;
  4222. t02 = (t02 - t32) * 0.502419286188;
  4223. t32 = t04 + t30;
  4224. t04 = (t04 - t30) * 0.52249861494;
  4225. t30 = t06 + t28;
  4226. t28 = (t06 - t28) * 0.566944034816;
  4227. t06 = t08 + t26;
  4228. t08 = (t08 - t26) * 0.64682178336;
  4229. t26 = t10 + t24;
  4230. t10 = (t10 - t24) * 0.788154623451;
  4231. t24 = t12 + t22;
  4232. t22 = (t12 - t22) * 1.06067768599;
  4233. t12 = t14 + t20;
  4234. t20 = (t14 - t20) * 1.72244709824;
  4235. t14 = t16 + t18;
  4236. t16 = (t16 - t18) * 5.10114861869;
  4237. t18 = t21 + t14;
  4238. t14 = (t21 - t14) * 0.509795579104;
  4239. t21 = t32 + t12;
  4240. t32 = (t32 - t12) * 0.601344886935;
  4241. t12 = t30 + t24;
  4242. t24 = (t30 - t24) * 0.899976223136;
  4243. t30 = t06 + t26;
  4244. t26 = (t06 - t26) * 2.56291544774;
  4245. t06 = t18 + t30;
  4246. t18 = (t18 - t30) * 0.541196100146;
  4247. t30 = t21 + t12;
  4248. t12 = (t21 - t12) * 1.30656296488;
  4249. t21 = t06 + t30;
  4250. t30 = (t06 - t30) * 0.707106781187;
  4251. t06 = t18 + t12;
  4252. t12 = (t18 - t12) * 0.707106781187;
  4253. t06 += t12;
  4254. t18 = t14 + t26;
  4255. t26 = (t14 - t26) * 0.541196100146;
  4256. t14 = t32 + t24;
  4257. t24 = (t32 - t24) * 1.30656296488;
  4258. t32 = t18 + t14;
  4259. t14 = (t18 - t14) * 0.707106781187;
  4260. t18 = t26 + t24;
  4261. t24 = (t26 - t24) * 0.707106781187;
  4262. t18 += t24;
  4263. t32 += t18;
  4264. t18 += t14;
  4265. t26 = t14 + t24;
  4266. t14 = t02 + t16;
  4267. t02 = (t02 - t16) * 0.509795579104;
  4268. t16 = t04 + t20;
  4269. t04 = (t04 - t20) * 0.601344886935;
  4270. t20 = t28 + t22;
  4271. t22 = (t28 - t22) * 0.899976223136;
  4272. t28 = t08 + t10;
  4273. t10 = (t08 - t10) * 2.56291544774;
  4274. t08 = t14 + t28;
  4275. t14 = (t14 - t28) * 0.541196100146;
  4276. t28 = t16 + t20;
  4277. t20 = (t16 - t20) * 1.30656296488;
  4278. t16 = t08 + t28;
  4279. t28 = (t08 - t28) * 0.707106781187;
  4280. t08 = t14 + t20;
  4281. t20 = (t14 - t20) * 0.707106781187;
  4282. t08 += t20;
  4283. t14 = t02 + t10;
  4284. t02 = (t02 - t10) * 0.541196100146;
  4285. t10 = t04 + t22;
  4286. t22 = (t04 - t22) * 1.30656296488;
  4287. t04 = t14 + t10;
  4288. t10 = (t14 - t10) * 0.707106781187;
  4289. t14 = t02 + t22;
  4290. t02 = (t02 - t22) * 0.707106781187;
  4291. t14 += t02;
  4292. t04 += t14;
  4293. t14 += t10;
  4294. t10 += t02;
  4295. t16 += t04;
  4296. t04 += t08;
  4297. t08 += t14;
  4298. t14 += t28;
  4299. t28 += t10;
  4300. t10 += t20;
  4301. t20 += t02;
  4302. t21 += t16;
  4303. t16 += t32;
  4304. t32 += t04;
  4305. t04 += t06;
  4306. t06 += t08;
  4307. t08 += t18;
  4308. t18 += t14;
  4309. t14 += t30;
  4310. t30 += t28;
  4311. t28 += t26;
  4312. t26 += t10;
  4313. t10 += t12;
  4314. t12 += t20;
  4315. t20 += t24;
  4316. t24 += t02;
  4317. d[dp + 48] = -t33;
  4318. d[dp + 49] = d[dp + 47] = -t21;
  4319. d[dp + 50] = d[dp + 46] = -t17;
  4320. d[dp + 51] = d[dp + 45] = -t16;
  4321. d[dp + 52] = d[dp + 44] = -t01;
  4322. d[dp + 53] = d[dp + 43] = -t32;
  4323. d[dp + 54] = d[dp + 42] = -t29;
  4324. d[dp + 55] = d[dp + 41] = -t04;
  4325. d[dp + 56] = d[dp + 40] = -t03;
  4326. d[dp + 57] = d[dp + 39] = -t06;
  4327. d[dp + 58] = d[dp + 38] = -t25;
  4328. d[dp + 59] = d[dp + 37] = -t08;
  4329. d[dp + 60] = d[dp + 36] = -t11;
  4330. d[dp + 61] = d[dp + 35] = -t18;
  4331. d[dp + 62] = d[dp + 34] = -t09;
  4332. d[dp + 63] = d[dp + 33] = -t14;
  4333. d[dp + 32] = -t05;
  4334. d[dp + 0] = t05;
  4335. d[dp + 31] = -t30;
  4336. d[dp + 1] = t30;
  4337. d[dp + 30] = -t27;
  4338. d[dp + 2] = t27;
  4339. d[dp + 29] = -t28;
  4340. d[dp + 3] = t28;
  4341. d[dp + 28] = -t07;
  4342. d[dp + 4] = t07;
  4343. d[dp + 27] = -t26;
  4344. d[dp + 5] = t26;
  4345. d[dp + 26] = -t23;
  4346. d[dp + 6] = t23;
  4347. d[dp + 25] = -t10;
  4348. d[dp + 7] = t10;
  4349. d[dp + 24] = -t15;
  4350. d[dp + 8] = t15;
  4351. d[dp + 23] = -t12;
  4352. d[dp + 9] = t12;
  4353. d[dp + 22] = -t19;
  4354. d[dp + 10] = t19;
  4355. d[dp + 21] = -t20;
  4356. d[dp + 11] = t20;
  4357. d[dp + 20] = -t13;
  4358. d[dp + 12] = t13;
  4359. d[dp + 19] = -t24;
  4360. d[dp + 13] = t24;
  4361. d[dp + 18] = -t31;
  4362. d[dp + 14] = t31;
  4363. d[dp + 17] = -t02;
  4364. d[dp + 15] = t02;
  4365. d[dp + 16] = 0;
  4366. };
  4367. MP2.FRAME_SYNC = 2047;
  4368. MP2.VERSION = { MPEG_2_5: 0, MPEG_2: 2, MPEG_1: 3 };
  4369. MP2.LAYER = { III: 1, II: 2, I: 3 };
  4370. MP2.MODE = { STEREO: 0, JOINT_STEREO: 1, DUAL_CHANNEL: 2, MONO: 3 };
  4371. MP2.SAMPLE_RATE = new Uint16Array([
  4372. 44100, 48e3, 32e3, 0, 22050, 24e3, 16e3, 0,
  4373. ]);
  4374. MP2.BIT_RATE = new Uint16Array([
  4375. 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 8, 16, 24,
  4376. 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,
  4377. ]);
  4378. MP2.SCALEFACTOR_BASE = new Uint32Array([33554432, 26632170, 21137968]);
  4379. MP2.SYNTHESIS_WINDOW = new Float32Array([
  4380. 0, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -1, -1, -1, -1, -1.5, -1.5, -2, -2,
  4381. -2.5, -2.5, -3, -3.5, -3.5, -4, -4.5, -5, -5.5, -6.5, -7, -8, -8.5, -9.5,
  4382. -10.5, -12, -13, -14.5, -15.5, -17.5, -19, -20.5, -22.5, -24.5, -26.5, -29,
  4383. -31.5, -34, -36.5, -39.5, -42.5, -45.5, -48.5, -52, -55.5, -58.5, -62.5,
  4384. -66, -69.5, -73.5, -77, -80.5, -84.5, -88, -91.5, -95, -98, -101, -104,
  4385. 106.5, 109, 111, 112.5, 113.5, 114, 114, 113.5, 112, 110.5, 107.5, 104, 100,
  4386. 94.5, 88.5, 81.5, 73, 63.5, 53, 41.5, 28.5, 14.5, -1, -18, -36, -55.5,
  4387. -76.5, -98.5, -122, -147, -173.5, -200.5, -229.5, -259.5, -290.5, -322.5,
  4388. -355.5, -389.5, -424, -459.5, -495.5, -532, -568.5, -605, -641.5, -678,
  4389. -714, -749, -783.5, -817, -849, -879.5, -908.5, -935, -959.5, -981, -1000.5,
  4390. -1016, -1028.5, -1037.5, -1042.5, -1043.5, -1040, -1031.5, 1018.5, 1e3, 976,
  4391. 946.5, 911, 869.5, 822, 767.5, 707, 640, 565.5, 485, 397, 302.5, 201, 92.5,
  4392. -22.5, -144, -272.5, -407, -547.5, -694, -846, -1003, -1165, -1331.5, -1502,
  4393. -1675.5, -1852.5, -2031.5, -2212.5, -2394, -2576.5, -2758.5, -2939.5,
  4394. -3118.5, -3294.5, -3467.5, -3635.5, -3798.5, -3955, -4104.5, -4245.5,
  4395. -4377.5, -4499, -4609.5, -4708, -4792.5, -4863.5, -4919, -4958, -4979.5,
  4396. -4983, -4967.5, -4931.5, -4875, -4796, -4694.5, -4569.5, -4420, -4246,
  4397. -4046, -3820, -3567, 3287, 2979.5, 2644, 2280.5, 1888, 1467.5, 1018.5, 541,
  4398. 35, -499, -1061, -1650, -2266.5, -2909, -3577, -4270, -4987.5, -5727.5,
  4399. -6490, -7274, -8077.5, -8899.5, -9739, -10594.5, -11464.5, -12347, -13241,
  4400. -14144.5, -15056, -15973.5, -16895.5, -17820, -18744.5, -19668, -20588,
  4401. -21503, -22410.5, -23308.5, -24195, -25068.5, -25926.5, -26767, -27589,
  4402. -28389, -29166.5, -29919, -30644.5, -31342, -32009.5, -32645, -33247,
  4403. -33814.5, -34346, -34839.5, -35295, -35710, -36084.5, -36417.5, -36707.5,
  4404. -36954, -37156.5, -37315, -37428, -37496, 37519, 37496, 37428, 37315,
  4405. 37156.5, 36954, 36707.5, 36417.5, 36084.5, 35710, 35295, 34839.5, 34346,
  4406. 33814.5, 33247, 32645, 32009.5, 31342, 30644.5, 29919, 29166.5, 28389,
  4407. 27589, 26767, 25926.5, 25068.5, 24195, 23308.5, 22410.5, 21503, 20588,
  4408. 19668, 18744.5, 17820, 16895.5, 15973.5, 15056, 14144.5, 13241, 12347,
  4409. 11464.5, 10594.5, 9739, 8899.5, 8077.5, 7274, 6490, 5727.5, 4987.5, 4270,
  4410. 3577, 2909, 2266.5, 1650, 1061, 499, -35, -541, -1018.5, -1467.5, -1888,
  4411. -2280.5, -2644, -2979.5, 3287, 3567, 3820, 4046, 4246, 4420, 4569.5, 4694.5,
  4412. 4796, 4875, 4931.5, 4967.5, 4983, 4979.5, 4958, 4919, 4863.5, 4792.5, 4708,
  4413. 4609.5, 4499, 4377.5, 4245.5, 4104.5, 3955, 3798.5, 3635.5, 3467.5, 3294.5,
  4414. 3118.5, 2939.5, 2758.5, 2576.5, 2394, 2212.5, 2031.5, 1852.5, 1675.5, 1502,
  4415. 1331.5, 1165, 1003, 846, 694, 547.5, 407, 272.5, 144, 22.5, -92.5, -201,
  4416. -302.5, -397, -485, -565.5, -640, -707, -767.5, -822, -869.5, -911, -946.5,
  4417. -976, -1e3, 1018.5, 1031.5, 1040, 1043.5, 1042.5, 1037.5, 1028.5, 1016,
  4418. 1000.5, 981, 959.5, 935, 908.5, 879.5, 849, 817, 783.5, 749, 714, 678,
  4419. 641.5, 605, 568.5, 532, 495.5, 459.5, 424, 389.5, 355.5, 322.5, 290.5,
  4420. 259.5, 229.5, 200.5, 173.5, 147, 122, 98.5, 76.5, 55.5, 36, 18, 1, -14.5,
  4421. -28.5, -41.5, -53, -63.5, -73, -81.5, -88.5, -94.5, -100, -104, -107.5,
  4422. -110.5, -112, -113.5, -114, -114, -113.5, -112.5, -111, -109, 106.5, 104,
  4423. 101, 98, 95, 91.5, 88, 84.5, 80.5, 77, 73.5, 69.5, 66, 62.5, 58.5, 55.5, 52,
  4424. 48.5, 45.5, 42.5, 39.5, 36.5, 34, 31.5, 29, 26.5, 24.5, 22.5, 20.5, 19,
  4425. 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,
  4426. 3.5, 3, 2.5, 2.5, 2, 2, 1.5, 1.5, 1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
  4427. ]);
  4428. MP2.QUANT_LUT_STEP_1 = [
  4429. [0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2],
  4430. [0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2],
  4431. ];
  4432. MP2.QUANT_TAB = { A: 27 | 64, B: 30 | 64, C: 8, D: 12 };
  4433. MP2.QUANT_LUT_STEP_2 = [
  4434. [MP2.QUANT_TAB.C, MP2.QUANT_TAB.C, MP2.QUANT_TAB.D],
  4435. [MP2.QUANT_TAB.A, MP2.QUANT_TAB.A, MP2.QUANT_TAB.A],
  4436. [MP2.QUANT_TAB.B, MP2.QUANT_TAB.A, MP2.QUANT_TAB.B],
  4437. ];
  4438. MP2.QUANT_LUT_STEP_3 = [
  4439. [68, 68, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52],
  4440. [
  4441. 67, 67, 67, 66, 66, 66, 66, 66, 66, 66, 66, 49, 49, 49, 49, 49, 49, 49,
  4442. 49, 49, 49, 49, 49, 32, 32, 32, 32, 32, 32, 32,
  4443. ],
  4444. [
  4445. 69, 69, 69, 69, 52, 52, 52, 52, 52, 52, 52, 36, 36, 36, 36, 36, 36, 36,
  4446. 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
  4447. ],
  4448. ];
  4449. MP2.QUANT_LUT_STEP4 = [
  4450. [0, 1, 2, 17],
  4451. [0, 1, 2, 3, 4, 5, 6, 17],
  4452. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17],
  4453. [0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
  4454. [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17],
  4455. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
  4456. ];
  4457. MP2.QUANT_TAB = [
  4458. { levels: 3, group: 1, bits: 5 },
  4459. { levels: 5, group: 1, bits: 7 },
  4460. { levels: 7, group: 0, bits: 3 },
  4461. { levels: 9, group: 1, bits: 10 },
  4462. { levels: 15, group: 0, bits: 4 },
  4463. { levels: 31, group: 0, bits: 5 },
  4464. { levels: 63, group: 0, bits: 6 },
  4465. { levels: 127, group: 0, bits: 7 },
  4466. { levels: 255, group: 0, bits: 8 },
  4467. { levels: 511, group: 0, bits: 9 },
  4468. { levels: 1023, group: 0, bits: 10 },
  4469. { levels: 2047, group: 0, bits: 11 },
  4470. { levels: 4095, group: 0, bits: 12 },
  4471. { levels: 8191, group: 0, bits: 13 },
  4472. { levels: 16383, group: 0, bits: 14 },
  4473. { levels: 32767, group: 0, bits: 15 },
  4474. { levels: 65535, group: 0, bits: 16 },
  4475. ];
  4476. return MP2;
  4477. })();
  4478. JSMpeg.Decoder.MP2AudioWASM = (function () {
  4479. 'use strict';
  4480. var MP2WASM = function (options) {
  4481. JSMpeg.Decoder.Base.call(this, options);
  4482. this.onDecodeCallback = options.onAudioDecode;
  4483. this.module = options.wasmModule;
  4484. this.bufferSize = options.audioBufferSize || 128 * 1024;
  4485. this.bufferMode = options.streaming
  4486. ? JSMpeg.BitBuffer.MODE.EVICT
  4487. : JSMpeg.BitBuffer.MODE.EXPAND;
  4488. this.sampleRate = 0;
  4489. };
  4490. MP2WASM.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
  4491. MP2WASM.prototype.constructor = MP2WASM;
  4492. MP2WASM.prototype.initializeWasmDecoder = function () {
  4493. if (!this.module.instance) {
  4494. console.warn('JSMpeg: WASM module not compiled yet');
  4495. return;
  4496. }
  4497. this.instance = this.module.instance;
  4498. this.functions = this.module.instance.exports;
  4499. this.decoder = this.functions._mp2_decoder_create(
  4500. this.bufferSize,
  4501. this.bufferMode
  4502. );
  4503. };
  4504. MP2WASM.prototype.destroy = function () {
  4505. if (!this.decoder) {
  4506. return;
  4507. }
  4508. this.functions._mp2_decoder_destroy(this.decoder);
  4509. };
  4510. MP2WASM.prototype.bufferGetIndex = function () {
  4511. if (!this.decoder) {
  4512. return;
  4513. }
  4514. return this.functions._mp2_decoder_get_index(this.decoder);
  4515. };
  4516. MP2WASM.prototype.bufferSetIndex = function (index) {
  4517. if (!this.decoder) {
  4518. return;
  4519. }
  4520. this.functions._mp2_decoder_set_index(this.decoder, index);
  4521. };
  4522. MP2WASM.prototype.bufferWrite = function (buffers) {
  4523. if (!this.decoder) {
  4524. this.initializeWasmDecoder();
  4525. }
  4526. var totalLength = 0;
  4527. for (var i = 0; i < buffers.length; i++) {
  4528. totalLength += buffers[i].length;
  4529. }
  4530. var ptr = this.functions._mp2_decoder_get_write_ptr(
  4531. this.decoder,
  4532. totalLength
  4533. );
  4534. for (var i = 0; i < buffers.length; i++) {
  4535. this.instance.heapU8.set(buffers[i], ptr);
  4536. ptr += buffers[i].length;
  4537. }
  4538. this.functions._mp2_decoder_did_write(this.decoder, totalLength);
  4539. return totalLength;
  4540. };
  4541. MP2WASM.prototype.decode = function () {
  4542. var startTime = JSMpeg.Now();
  4543. if (!this.decoder) {
  4544. return false;
  4545. }
  4546. var decodedBytes = this.functions._mp2_decoder_decode(this.decoder);
  4547. if (decodedBytes === 0) {
  4548. return false;
  4549. }
  4550. if (!this.sampleRate) {
  4551. this.sampleRate = this.functions._mp2_decoder_get_sample_rate(
  4552. this.decoder
  4553. );
  4554. }
  4555. if (this.destination) {
  4556. var leftPtr = this.functions._mp2_decoder_get_left_channel_ptr(
  4557. this.decoder
  4558. ),
  4559. rightPtr = this.functions._mp2_decoder_get_right_channel_ptr(
  4560. this.decoder
  4561. );
  4562. var leftOffset = leftPtr / Float32Array.BYTES_PER_ELEMENT,
  4563. rightOffset = rightPtr / Float32Array.BYTES_PER_ELEMENT;
  4564. var left = this.instance.heapF32.subarray(
  4565. leftOffset,
  4566. leftOffset + MP2WASM.SAMPLES_PER_FRAME
  4567. ),
  4568. right = this.instance.heapF32.subarray(
  4569. rightOffset,
  4570. rightOffset + MP2WASM.SAMPLES_PER_FRAME
  4571. );
  4572. this.destination.play(this.sampleRate, left, right);
  4573. }
  4574. this.advanceDecodedTime(MP2WASM.SAMPLES_PER_FRAME / this.sampleRate);
  4575. var elapsedTime = JSMpeg.Now() - startTime;
  4576. if (this.onDecodeCallback) {
  4577. this.onDecodeCallback(this, elapsedTime);
  4578. }
  4579. return true;
  4580. };
  4581. MP2WASM.prototype.getCurrentTime = function () {
  4582. var enqueuedTime = this.destination ? this.destination.enqueuedTime : 0;
  4583. return this.decodedTime - enqueuedTime;
  4584. };
  4585. MP2WASM.SAMPLES_PER_FRAME = 1152;
  4586. return MP2WASM;
  4587. })();
  4588. JSMpeg.Renderer.WebGL = (function () {
  4589. 'use strict';
  4590. var WebGLRenderer = function (options) {
  4591. if (options.canvas) {
  4592. this.canvas = options.canvas;
  4593. this.ownsCanvasElement = false;
  4594. } else {
  4595. this.canvas = document.createElement('canvas');
  4596. this.ownsCanvasElement = true;
  4597. }
  4598. this.width = this.canvas.width;
  4599. this.height = this.canvas.height;
  4600. this.enabled = true;
  4601. this.hasTextureData = {};
  4602. var contextCreateOptions = {
  4603. preserveDrawingBuffer: !!options.preserveDrawingBuffer,
  4604. alpha: false,
  4605. depth: false,
  4606. stencil: false,
  4607. antialias: false,
  4608. premultipliedAlpha: false,
  4609. };
  4610. this.gl =
  4611. this.canvas.getContext('webgl', contextCreateOptions) ||
  4612. this.canvas.getContext('experimental-webgl', contextCreateOptions);
  4613. if (!this.gl) {
  4614. throw new Error('Failed to get WebGL Context');
  4615. }
  4616. this.handleContextLostBound = this.handleContextLost.bind(this);
  4617. this.handleContextRestoredBound = this.handleContextRestored.bind(this);
  4618. this.canvas.addEventListener(
  4619. 'webglcontextlost',
  4620. this.handleContextLostBound,
  4621. false
  4622. );
  4623. this.canvas.addEventListener(
  4624. 'webglcontextrestored',
  4625. this.handleContextRestoredBound,
  4626. false
  4627. );
  4628. this.initGL();
  4629. };
  4630. WebGLRenderer.prototype.initGL = function () {
  4631. this.hasTextureData = {};
  4632. var gl = this.gl;
  4633. var vertexAttr = null;
  4634. gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
  4635. this.vertexBuffer = gl.createBuffer();
  4636. var vertexCoords = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);
  4637. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
  4638. gl.bufferData(gl.ARRAY_BUFFER, vertexCoords, gl.STATIC_DRAW);
  4639. this.program = this.createProgram(
  4640. WebGLRenderer.SHADER.VERTEX_IDENTITY,
  4641. WebGLRenderer.SHADER.FRAGMENT_YCRCB_TO_RGBA
  4642. );
  4643. vertexAttr = gl.getAttribLocation(this.program, 'vertex');
  4644. gl.enableVertexAttribArray(vertexAttr);
  4645. gl.vertexAttribPointer(vertexAttr, 2, gl.FLOAT, false, 0, 0);
  4646. this.textureY = this.createTexture(0, 'textureY');
  4647. this.textureCb = this.createTexture(1, 'textureCb');
  4648. this.textureCr = this.createTexture(2, 'textureCr');
  4649. this.loadingProgram = this.createProgram(
  4650. WebGLRenderer.SHADER.VERTEX_IDENTITY,
  4651. WebGLRenderer.SHADER.FRAGMENT_LOADING
  4652. );
  4653. vertexAttr = gl.getAttribLocation(this.loadingProgram, 'vertex');
  4654. gl.enableVertexAttribArray(vertexAttr);
  4655. gl.vertexAttribPointer(vertexAttr, 2, gl.FLOAT, false, 0, 0);
  4656. this.shouldCreateUnclampedViews = !this.allowsClampedTextureData();
  4657. };
  4658. WebGLRenderer.prototype.handleContextLost = function (ev) {
  4659. ev.preventDefault();
  4660. };
  4661. WebGLRenderer.prototype.handleContextRestored = function (ev) {
  4662. this.initGL();
  4663. };
  4664. WebGLRenderer.prototype.destroy = function () {
  4665. var gl = this.gl;
  4666. this.deleteTexture(gl.TEXTURE0, this.textureY);
  4667. this.deleteTexture(gl.TEXTURE1, this.textureCb);
  4668. this.deleteTexture(gl.TEXTURE2, this.textureCr);
  4669. gl.useProgram(null);
  4670. gl.deleteProgram(this.program);
  4671. gl.deleteProgram(this.loadingProgram);
  4672. gl.bindBuffer(gl.ARRAY_BUFFER, null);
  4673. gl.deleteBuffer(this.vertexBuffer);
  4674. this.canvas.removeEventListener(
  4675. 'webglcontextlost',
  4676. this.handleContextLostBound,
  4677. false
  4678. );
  4679. this.canvas.removeEventListener(
  4680. 'webglcontextrestored',
  4681. this.handleContextRestoredBound,
  4682. false
  4683. );
  4684. if (this.ownsCanvasElement) {
  4685. this.canvas.remove();
  4686. }
  4687. };
  4688. WebGLRenderer.prototype.resize = function (width, height) {
  4689. this.width = width | 0;
  4690. this.height = height | 0;
  4691. this.canvas.width = this.width;
  4692. this.canvas.height = this.height;
  4693. this.gl.useProgram(this.program);
  4694. var codedWidth = ((this.width + 15) >> 4) << 4;
  4695. this.gl.viewport(0, 0, codedWidth, this.height);
  4696. };
  4697. WebGLRenderer.prototype.createTexture = function (index, name) {
  4698. var gl = this.gl;
  4699. var texture = gl.createTexture();
  4700. gl.bindTexture(gl.TEXTURE_2D, texture);
  4701. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
  4702. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
  4703. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
  4704. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
  4705. gl.uniform1i(gl.getUniformLocation(this.program, name), index);
  4706. return texture;
  4707. };
  4708. WebGLRenderer.prototype.createProgram = function (vsh, fsh) {
  4709. var gl = this.gl;
  4710. var program = gl.createProgram();
  4711. gl.attachShader(program, this.compileShader(gl.VERTEX_SHADER, vsh));
  4712. gl.attachShader(program, this.compileShader(gl.FRAGMENT_SHADER, fsh));
  4713. gl.linkProgram(program);
  4714. gl.useProgram(program);
  4715. return program;
  4716. };
  4717. WebGLRenderer.prototype.compileShader = function (type, source) {
  4718. var gl = this.gl;
  4719. var shader = gl.createShader(type);
  4720. gl.shaderSource(shader, source);
  4721. gl.compileShader(shader);
  4722. if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
  4723. throw new Error(gl.getShaderInfoLog(shader));
  4724. }
  4725. return shader;
  4726. };
  4727. WebGLRenderer.prototype.allowsClampedTextureData = function () {
  4728. var gl = this.gl;
  4729. var texture = gl.createTexture();
  4730. gl.bindTexture(gl.TEXTURE_2D, texture);
  4731. gl.texImage2D(
  4732. gl.TEXTURE_2D,
  4733. 0,
  4734. gl.LUMINANCE,
  4735. 1,
  4736. 1,
  4737. 0,
  4738. gl.LUMINANCE,
  4739. gl.UNSIGNED_BYTE,
  4740. new Uint8ClampedArray([0])
  4741. );
  4742. return gl.getError() === 0;
  4743. };
  4744. WebGLRenderer.prototype.renderProgress = function (progress) {
  4745. var gl = this.gl;
  4746. gl.useProgram(this.loadingProgram);
  4747. var loc = gl.getUniformLocation(this.loadingProgram, 'progress');
  4748. gl.uniform1f(loc, progress);
  4749. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
  4750. };
  4751. WebGLRenderer.prototype.render = function (y, cb, cr, isClampedArray) {
  4752. if (!this.enabled) {
  4753. return;
  4754. }
  4755. var gl = this.gl;
  4756. var w = ((this.width + 15) >> 4) << 4,
  4757. h = this.height,
  4758. w2 = w >> 1,
  4759. h2 = h >> 1;
  4760. if (isClampedArray && this.shouldCreateUnclampedViews) {
  4761. (y = new Uint8Array(y.buffer)),
  4762. (cb = new Uint8Array(cb.buffer)),
  4763. (cr = new Uint8Array(cr.buffer));
  4764. }
  4765. gl.useProgram(this.program);
  4766. this.updateTexture(gl.TEXTURE0, this.textureY, w, h, y);
  4767. this.updateTexture(gl.TEXTURE1, this.textureCb, w2, h2, cb);
  4768. this.updateTexture(gl.TEXTURE2, this.textureCr, w2, h2, cr);
  4769. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
  4770. };
  4771. WebGLRenderer.prototype.updateTexture = function (unit, texture, w, h, data) {
  4772. var gl = this.gl;
  4773. gl.activeTexture(unit);
  4774. gl.bindTexture(gl.TEXTURE_2D, texture);
  4775. if (this.hasTextureData[unit]) {
  4776. gl.texSubImage2D(
  4777. gl.TEXTURE_2D,
  4778. 0,
  4779. 0,
  4780. 0,
  4781. w,
  4782. h,
  4783. gl.LUMINANCE,
  4784. gl.UNSIGNED_BYTE,
  4785. data
  4786. );
  4787. } else {
  4788. this.hasTextureData[unit] = true;
  4789. gl.texImage2D(
  4790. gl.TEXTURE_2D,
  4791. 0,
  4792. gl.LUMINANCE,
  4793. w,
  4794. h,
  4795. 0,
  4796. gl.LUMINANCE,
  4797. gl.UNSIGNED_BYTE,
  4798. data
  4799. );
  4800. }
  4801. };
  4802. WebGLRenderer.prototype.deleteTexture = function (unit, texture) {
  4803. var gl = this.gl;
  4804. gl.activeTexture(unit);
  4805. gl.bindTexture(gl.TEXTURE_2D, null);
  4806. gl.deleteTexture(texture);
  4807. };
  4808. WebGLRenderer.IsSupported = function () {
  4809. try {
  4810. if (!window.WebGLRenderingContext) {
  4811. return false;
  4812. }
  4813. var canvas = document.createElement('canvas');
  4814. return !!(
  4815. canvas.getContext('webgl') || canvas.getContext('experimental-webgl')
  4816. );
  4817. } catch (err) {
  4818. return false;
  4819. }
  4820. };
  4821. WebGLRenderer.SHADER = {
  4822. FRAGMENT_YCRCB_TO_RGBA: [
  4823. 'precision mediump float;',
  4824. 'uniform sampler2D textureY;',
  4825. 'uniform sampler2D textureCb;',
  4826. 'uniform sampler2D textureCr;',
  4827. 'varying vec2 texCoord;',
  4828. 'mat4 rec601 = mat4(',
  4829. '1.16438, 0.00000, 1.59603, -0.87079,',
  4830. '1.16438, -0.39176, -0.81297, 0.52959,',
  4831. '1.16438, 2.01723, 0.00000, -1.08139,',
  4832. '0, 0, 0, 1',
  4833. ');',
  4834. 'void main() {',
  4835. 'float y = texture2D(textureY, texCoord).r;',
  4836. 'float cb = texture2D(textureCb, texCoord).r;',
  4837. 'float cr = texture2D(textureCr, texCoord).r;',
  4838. 'gl_FragColor = vec4(y, cr, cb, 1.0) * rec601;',
  4839. '}',
  4840. ].join('\n'),
  4841. FRAGMENT_LOADING: [
  4842. 'precision mediump float;',
  4843. 'uniform float progress;',
  4844. 'varying vec2 texCoord;',
  4845. 'void main() {',
  4846. 'float c = ceil(progress-(1.0-texCoord.y));',
  4847. 'gl_FragColor = vec4(c,c,c,1);',
  4848. '}',
  4849. ].join('\n'),
  4850. VERTEX_IDENTITY: [
  4851. 'attribute vec2 vertex;',
  4852. 'varying vec2 texCoord;',
  4853. 'void main() {',
  4854. 'texCoord = vertex;',
  4855. 'gl_Position = vec4((vertex * 2.0 - 1.0) * vec2(1, -1), 0.0, 1.0);',
  4856. '}',
  4857. ].join('\n'),
  4858. };
  4859. return WebGLRenderer;
  4860. })();
  4861. JSMpeg.Renderer.Canvas2D = (function () {
  4862. 'use strict';
  4863. var CanvasRenderer = function (options) {
  4864. if (options.canvas) {
  4865. this.canvas = options.canvas;
  4866. this.ownsCanvasElement = false;
  4867. } else {
  4868. this.canvas = document.createElement('canvas');
  4869. this.ownsCanvasElement = true;
  4870. }
  4871. this.width = this.canvas.width;
  4872. this.height = this.canvas.height;
  4873. this.enabled = true;
  4874. this.context = this.canvas.getContext('2d');
  4875. };
  4876. CanvasRenderer.prototype.destroy = function () {
  4877. if (this.ownsCanvasElement) {
  4878. this.canvas.remove();
  4879. }
  4880. };
  4881. CanvasRenderer.prototype.resize = function (width, height) {
  4882. this.width = width | 0;
  4883. this.height = height | 0;
  4884. this.canvas.width = this.width;
  4885. this.canvas.height = this.height;
  4886. this.imageData = this.context.getImageData(0, 0, this.width, this.height);
  4887. JSMpeg.Fill(this.imageData.data, 255);
  4888. };
  4889. CanvasRenderer.prototype.renderProgress = function (progress) {
  4890. var w = this.canvas.width,
  4891. h = this.canvas.height,
  4892. ctx = this.context;
  4893. ctx.fillStyle = '#222';
  4894. ctx.fillRect(0, 0, w, h);
  4895. ctx.fillStyle = '#fff';
  4896. ctx.fillRect(0, h - h * progress, w, h * progress);
  4897. };
  4898. CanvasRenderer.prototype.render = function (y, cb, cr) {
  4899. this.YCbCrToRGBA(y, cb, cr, this.imageData.data);
  4900. this.context.putImageData(this.imageData, 0, 0);
  4901. };
  4902. CanvasRenderer.prototype.YCbCrToRGBA = function (y, cb, cr, rgba) {
  4903. if (!this.enabled) {
  4904. return;
  4905. }
  4906. var w = ((this.width + 15) >> 4) << 4,
  4907. w2 = w >> 1;
  4908. var yIndex1 = 0,
  4909. yIndex2 = w,
  4910. yNext2Lines = w + (w - this.width);
  4911. var cIndex = 0,
  4912. cNextLine = w2 - (this.width >> 1);
  4913. var rgbaIndex1 = 0,
  4914. rgbaIndex2 = this.width * 4,
  4915. rgbaNext2Lines = this.width * 4;
  4916. var cols = this.width >> 1,
  4917. rows = this.height >> 1;
  4918. var ccb, ccr, r, g, b;
  4919. for (var row = 0; row < rows; row++) {
  4920. for (var col = 0; col < cols; col++) {
  4921. ccb = cb[cIndex];
  4922. ccr = cr[cIndex];
  4923. cIndex++;
  4924. r = ccb + ((ccb * 103) >> 8) - 179;
  4925. g = ((ccr * 88) >> 8) - 44 + ((ccb * 183) >> 8) - 91;
  4926. b = ccr + ((ccr * 198) >> 8) - 227;
  4927. var y1 = y[yIndex1++];
  4928. var y2 = y[yIndex1++];
  4929. rgba[rgbaIndex1] = y1 + r;
  4930. rgba[rgbaIndex1 + 1] = y1 - g;
  4931. rgba[rgbaIndex1 + 2] = y1 + b;
  4932. rgba[rgbaIndex1 + 4] = y2 + r;
  4933. rgba[rgbaIndex1 + 5] = y2 - g;
  4934. rgba[rgbaIndex1 + 6] = y2 + b;
  4935. rgbaIndex1 += 8;
  4936. var y3 = y[yIndex2++];
  4937. var y4 = y[yIndex2++];
  4938. rgba[rgbaIndex2] = y3 + r;
  4939. rgba[rgbaIndex2 + 1] = y3 - g;
  4940. rgba[rgbaIndex2 + 2] = y3 + b;
  4941. rgba[rgbaIndex2 + 4] = y4 + r;
  4942. rgba[rgbaIndex2 + 5] = y4 - g;
  4943. rgba[rgbaIndex2 + 6] = y4 + b;
  4944. rgbaIndex2 += 8;
  4945. }
  4946. yIndex1 += yNext2Lines;
  4947. yIndex2 += yNext2Lines;
  4948. rgbaIndex1 += rgbaNext2Lines;
  4949. rgbaIndex2 += rgbaNext2Lines;
  4950. cIndex += cNextLine;
  4951. }
  4952. };
  4953. return CanvasRenderer;
  4954. })();
  4955. JSMpeg.AudioOutput.WebAudio = (function () {
  4956. 'use strict';
  4957. var WebAudioOut = function (options) {
  4958. this.context = WebAudioOut.CachedContext =
  4959. WebAudioOut.CachedContext ||
  4960. new (window.AudioContext || window.webkitAudioContext)();
  4961. this.gain = this.context.createGain();
  4962. this.destination = this.gain;
  4963. this.gain.connect(this.context.destination);
  4964. this.context._connections = (this.context._connections || 0) + 1;
  4965. this.startTime = 0;
  4966. this.buffer = null;
  4967. this.wallclockStartTime = 0;
  4968. this.volume = 1;
  4969. this.enabled = true;
  4970. this.unlocked = !WebAudioOut.NeedsUnlocking();
  4971. Object.defineProperty(this, 'enqueuedTime', { get: this.getEnqueuedTime });
  4972. };
  4973. WebAudioOut.prototype.destroy = function () {
  4974. this.gain.disconnect();
  4975. this.context._connections--;
  4976. if (this.context._connections === 0) {
  4977. this.context.close();
  4978. WebAudioOut.CachedContext = null;
  4979. }
  4980. };
  4981. WebAudioOut.prototype.play = function (sampleRate, left, right) {
  4982. if (!this.enabled) {
  4983. return;
  4984. }
  4985. if (!this.unlocked) {
  4986. var ts = JSMpeg.Now();
  4987. if (this.wallclockStartTime < ts) {
  4988. this.wallclockStartTime = ts;
  4989. }
  4990. this.wallclockStartTime += left.length / sampleRate;
  4991. return;
  4992. }
  4993. this.gain.gain.value = this.volume;
  4994. var buffer = this.context.createBuffer(2, left.length, sampleRate);
  4995. buffer.getChannelData(0).set(left);
  4996. buffer.getChannelData(1).set(right);
  4997. var source = this.context.createBufferSource();
  4998. source.buffer = buffer;
  4999. source.connect(this.destination);
  5000. var now = this.context.currentTime;
  5001. var duration = buffer.duration;
  5002. if (this.startTime < now) {
  5003. this.startTime = now;
  5004. this.wallclockStartTime = JSMpeg.Now();
  5005. }
  5006. source.start(this.startTime);
  5007. this.startTime += duration;
  5008. this.wallclockStartTime += duration;
  5009. };
  5010. WebAudioOut.prototype.stop = function () {
  5011. this.gain.gain.value = 0;
  5012. };
  5013. WebAudioOut.prototype.getEnqueuedTime = function () {
  5014. return Math.max(this.wallclockStartTime - JSMpeg.Now(), 0);
  5015. };
  5016. WebAudioOut.prototype.resetEnqueuedTime = function () {
  5017. this.startTime = this.context.currentTime;
  5018. this.wallclockStartTime = JSMpeg.Now();
  5019. };
  5020. WebAudioOut.prototype.unlock = function (callback) {
  5021. if (this.unlocked) {
  5022. if (callback) {
  5023. callback();
  5024. }
  5025. return;
  5026. }
  5027. this.unlockCallback = callback;
  5028. var buffer = this.context.createBuffer(1, 1, 22050);
  5029. var source = this.context.createBufferSource();
  5030. source.buffer = buffer;
  5031. source.connect(this.destination);
  5032. source.start(0);
  5033. setTimeout(this.checkIfUnlocked.bind(this, source, 0), 0);
  5034. };
  5035. WebAudioOut.prototype.checkIfUnlocked = function (source, attempt) {
  5036. if (
  5037. source.playbackState === source.PLAYING_STATE ||
  5038. source.playbackState === source.FINISHED_STATE
  5039. ) {
  5040. this.unlocked = true;
  5041. if (this.unlockCallback) {
  5042. this.unlockCallback();
  5043. this.unlockCallback = null;
  5044. }
  5045. } else if (attempt < 10) {
  5046. setTimeout(this.checkIfUnlocked.bind(this, source, attempt + 1), 100);
  5047. }
  5048. };
  5049. WebAudioOut.NeedsUnlocking = function () {
  5050. return /iPhone|iPad|iPod/i.test(navigator.userAgent);
  5051. };
  5052. WebAudioOut.IsSupported = function () {
  5053. return window.AudioContext || window.webkitAudioContext;
  5054. };
  5055. WebAudioOut.CachedContext = null;
  5056. return WebAudioOut;
  5057. })();
  5058. JSMpeg.WASMModule = (function () {
  5059. 'use strict';
  5060. var WASM = function () {
  5061. this.stackSize = 5 * 1024 * 1024;
  5062. this.pageSize = 64 * 1024;
  5063. this.onInitCallbacks = [];
  5064. this.ready = false;
  5065. this.loadingFromFileStarted = false;
  5066. this.loadingFromBufferStarted = false;
  5067. };
  5068. WASM.prototype.write = function (buffer) {
  5069. this.loadFromBuffer(buffer);
  5070. };
  5071. WASM.prototype.loadFromFile = function (url, callback) {
  5072. if (callback) {
  5073. this.onInitCallbacks.push(callback);
  5074. }
  5075. if (this.loadingFromFileStarted) {
  5076. return;
  5077. }
  5078. this.loadingFromFileStarted = true;
  5079. this.onInitCallback = callback;
  5080. var ajax = new JSMpeg.Source.Ajax(url, {});
  5081. ajax.connect(this);
  5082. ajax.start();
  5083. };
  5084. WASM.prototype.loadFromBuffer = function (buffer, callback) {
  5085. if (callback) {
  5086. this.onInitCallbacks.push(callback);
  5087. }
  5088. if (this.loadingFromBufferStarted) {
  5089. return;
  5090. }
  5091. this.loadingFromBufferStarted = true;
  5092. this.moduleInfo = this.readDylinkSection(buffer);
  5093. if (!this.moduleInfo) {
  5094. for (var i = 0; i < this.onInitCallbacks.length; i++) {
  5095. this.onInitCallbacks[i](null);
  5096. }
  5097. return;
  5098. }
  5099. this.memory = new WebAssembly.Memory({ initial: 256 });
  5100. var env = {
  5101. memory: this.memory,
  5102. memoryBase: 0,
  5103. __memory_base: 0,
  5104. table: new WebAssembly.Table({
  5105. initial: this.moduleInfo.tableSize,
  5106. element: 'anyfunc',
  5107. }),
  5108. tableBase: 0,
  5109. __table_base: 0,
  5110. abort: this.c_abort.bind(this),
  5111. ___assert_fail: this.c_assertFail.bind(this),
  5112. _sbrk: this.c_sbrk.bind(this),
  5113. };
  5114. this.brk = this.align(this.moduleInfo.memorySize + this.stackSize);
  5115. WebAssembly.instantiate(buffer, { env: env }).then(
  5116. function (results) {
  5117. this.instance = results.instance;
  5118. if (this.instance.exports.__post_instantiate) {
  5119. this.instance.exports.__post_instantiate();
  5120. }
  5121. this.createHeapViews();
  5122. this.ready = true;
  5123. for (var i = 0; i < this.onInitCallbacks.length; i++) {
  5124. this.onInitCallbacks[i](this);
  5125. }
  5126. }.bind(this)
  5127. );
  5128. };
  5129. WASM.prototype.createHeapViews = function () {
  5130. this.instance.heapU8 = new Uint8Array(this.memory.buffer);
  5131. this.instance.heapU32 = new Uint32Array(this.memory.buffer);
  5132. this.instance.heapF32 = new Float32Array(this.memory.buffer);
  5133. };
  5134. WASM.prototype.align = function (addr) {
  5135. var a = Math.pow(2, this.moduleInfo.memoryAlignment);
  5136. return Math.ceil(addr / a) * a;
  5137. };
  5138. WASM.prototype.c_sbrk = function (size) {
  5139. var previousBrk = this.brk;
  5140. this.brk += size;
  5141. if (this.brk > this.memory.buffer.byteLength) {
  5142. var bytesNeeded = this.brk - this.memory.buffer.byteLength;
  5143. var pagesNeeded = Math.ceil(bytesNeeded / this.pageSize);
  5144. this.memory.grow(pagesNeeded);
  5145. this.createHeapViews();
  5146. }
  5147. return previousBrk;
  5148. };
  5149. WASM.prototype.c_abort = function (size) {
  5150. console.warn('JSMPeg: WASM abort', arguments);
  5151. };
  5152. WASM.prototype.c_assertFail = function (size) {
  5153. console.warn('JSMPeg: WASM ___assert_fail', arguments);
  5154. };
  5155. WASM.prototype.readDylinkSection = function (buffer) {
  5156. var bytes = new Uint8Array(buffer);
  5157. var next = 0;
  5158. var readVarUint = function () {
  5159. var ret = 0;
  5160. var mul = 1;
  5161. while (1) {
  5162. var byte = bytes[next++];
  5163. ret += (byte & 127) * mul;
  5164. mul *= 128;
  5165. if (!(byte & 128)) {
  5166. return ret;
  5167. }
  5168. }
  5169. };
  5170. var matchNextBytes = function (expected) {
  5171. for (var i = 0; i < expected.length; i++) {
  5172. var b =
  5173. typeof expected[i] === 'string'
  5174. ? expected[i].charCodeAt(0)
  5175. : expected[i];
  5176. if (bytes[next++] !== b) {
  5177. return false;
  5178. }
  5179. }
  5180. return true;
  5181. };
  5182. if (!matchNextBytes([0, 'a', 's', 'm'])) {
  5183. console.warn('JSMpeg: WASM header not found');
  5184. return null;
  5185. }
  5186. var next = 9;
  5187. var sectionSize = readVarUint();
  5188. if (!matchNextBytes([6, 'd', 'y', 'l', 'i', 'n', 'k'])) {
  5189. console.warn('JSMpeg: No dylink section found in WASM');
  5190. return null;
  5191. }
  5192. return {
  5193. memorySize: readVarUint(),
  5194. memoryAlignment: readVarUint(),
  5195. tableSize: readVarUint(),
  5196. tableAlignment: readVarUint(),
  5197. };
  5198. };
  5199. WASM.IsSupported = function () {
  5200. return !!window.WebAssembly;
  5201. };
  5202. WASM.GetModule = function () {
  5203. WASM.CACHED_MODULE = WASM.CACHED_MODULE || new WASM();
  5204. return WASM.CACHED_MODULE;
  5205. };
  5206. return WASM;
  5207. })();
  5208. JSMpeg.WASM_BINARY_INLINED =
  5209. 'AGFzbQEAAAAADwZkeWxpbmuA0MACBAAAAAE0CWAEf39/fwBgAX8Bf2ACf38Bf2ABfwBgAn9/AGABfwF9YAZ/f39/f38AYAN/f38Bf2AAAAJGBANlbnYOX19fYXNzZXJ0X2ZhaWwAAANlbnYFX3NicmsAAQNlbnYNX19tZW1vcnlfYmFzZQN/AANlbnYGbWVtb3J5AgCAAgM9PAIDAgEEBAMBBQEBAQEBAQEDBAMGAwQAAwAAAAIDAgEEBAEBAQEBAAACAwIBAgECAQEBAQMEAwMCBwcHCAYLAn8BQQALfwFBAAsHggYfEl9fcG9zdF9pbnN0YW50aWF0ZQA9BV9mcmVlADgHX21hbGxvYwAxB19tZW1jcHkAOghfbWVtbW92ZQA7B19tZW1zZXQAPBNfbXAyX2RlY29kZXJfY3JlYXRlAB0TX21wMl9kZWNvZGVyX2RlY29kZQAmFF9tcDJfZGVjb2Rlcl9kZXN0cm95AB4WX21wMl9kZWNvZGVyX2RpZF93cml0ZQAiFl9tcDJfZGVjb2Rlcl9nZXRfaW5kZXgAICFfbXAyX2RlY29kZXJfZ2V0X2xlZnRfY2hhbm5lbF9wdHIAJCJfbXAyX2RlY29kZXJfZ2V0X3JpZ2h0X2NoYW5uZWxfcHRyACUcX21wMl9kZWNvZGVyX2dldF9zYW1wbGVfcmF0ZQAjGl9tcDJfZGVjb2Rlcl9nZXRfd3JpdGVfcHRyAB8WX21wMl9kZWNvZGVyX3NldF9pbmRleAAhFV9tcGVnMV9kZWNvZGVyX2NyZWF0ZQACFV9tcGVnMV9kZWNvZGVyX2RlY29kZQARFl9tcGVnMV9kZWNvZGVyX2Rlc3Ryb3kAAxhfbXBlZzFfZGVjb2Rlcl9kaWRfd3JpdGUABxlfbXBlZzFfZGVjb2Rlcl9nZXRfY2JfcHRyABAdX21wZWcxX2RlY29kZXJfZ2V0X2NvZGVkX3NpemUACxlfbXBlZzFfZGVjb2Rlcl9nZXRfY3JfcHRyAA8dX21wZWcxX2RlY29kZXJfZ2V0X2ZyYW1lX3JhdGUAChlfbXBlZzFfZGVjb2Rlcl9nZXRfaGVpZ2h0AA0YX21wZWcxX2RlY29kZXJfZ2V0X2luZGV4AAUYX21wZWcxX2RlY29kZXJfZ2V0X3dpZHRoAAwcX21wZWcxX2RlY29kZXJfZ2V0X3dy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BQJ/IANBzQBHDQIgACgCgAFBBhAwIQMCQAJAIAAoAoABQQgQMCIEIgYEQCAGQYABRgRADAIFDAMLAAsgACgCgAFBCBAwDAILIAAoAoABQQgQMEGAfmoMAQsgBEGAfmogBCAEQYABShsLCyEEDAELIAZB/wFxIgNBACADayAAKAKAAUEBEDBFGyEEIAZBCHUhAwsgAiADaiIGIwBBQGtqLQAAIgMgBWotAAAgACgCREEAIARBAXQiAkEfdUEBciAAKAJcGyACamxsIgJBBHVBAEEBQX8gAkEPShsgAkEQcRtrIgJBgHAgAkGAcEobIQIgAEGcAWogA0ECdGogAyMAQZA1amotAAAgAkH/DyACQf8PSBtsNgIAIAZBAWohAgwBCwsgAUEESARAIABBhAFqIQUgAUEDdEEIcSAAKAJUIAAoAhgiAyAAKAJQbGpBBHRyIANBA3RBACABQQJxG2ohBAUgAEGMAWogAEGIAWogAUEERhshBSAAKAJQIAAoAhgiAUECdGwgACgCVEEDdGohBCABQQF1IQMLIANBeGohAyAFKAIAIQUgAkEBRiECIABBnAFqIQEgACgCXARAIAIEQCABKAIAQYABakEIdSAFIAQgAxAYIAFBADYCAAUgARAZIAEgBSAEIAMQGiABQQBBgAIQPBoLBSACBEAgASgCAEGAAWpBCHUgBSAEIAMQGyABQQA2AgAFIAEQGSABIAUgBCADEBwgAUEAQYACEDwaCwsL7AYAIAEgAmogAEEAIABBAEobIgBB/wEgAEH/AUgbQf8BcSIAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAIgA0EIaiIDaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAIgA2oiAmogADoAACABIAJBAWpqIAA6AAAgASACQQJqaiAAOgAAIAEgAkEDamogADoAACABIAJBBGpqIAA6AAAgASACQQVqaiAAOgAAIAEgAkEGamogADoAACABIAJBB2pqIAA6AAAgASACIANqIgJqIAA6AAAgASACQQFqaiAAOgAAIAEgAkECamogADoAACABIAJBA2pqIAA6AAAgASACQQRqaiAAOgAAIAEgAkEFamogADoAACABIAJBBmpqIAA6AAAgASACQQdqaiAAOgAAIAEgAiADaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAIgA2oiAmogADoAACABIAJBAWpqIAA6AAAgASACQQJqaiAAOgAAIAEgAkEDamogADoAACABIAJBBGpqIAA6AAAgASACQQVqaiAAOgAAIAEgAkEGamogADoAACABIAJBB2pqIAA6AAAgASACIANqIgJqIAA6AAAgASACQQFqaiAAOgAAIAEgAkECamogADoAACABIAJBA2pqIAA6AAAgASACQQRqaiAAOgAAIAEgAkEFamogADoAACABIAJBBmpqIAA6AAAgASACQQdqaiAAOgAAIAEgAiADaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAAAubBgEUfwNAIAFBEGpBAnQgAGoiBygCACIGIAFBMGpBAnQgAGoiDSgCACIJaiEFIAFBCGpBAnQgAGoiDigCACICIAFBOGpBAnQgAGoiDygCACIDaiEEIAIgA2siEEHZA2wgAUEoakECdCAAaiIKKAIAIgIgAUEYakECdCAAaiIRKAIAIgNrIgtBvH5sQYABampBCHUgBCACIANqIghqIgJrIgMgBCAIa0HqAmxBgAFqQQh1ayEEIAFBAnQgAGoiCCgCACIMIAFBIGpBAnQgAGoiEigCACITayIUIAYgCWtB6gJsQYABakEIdSAFayIJaiEGIAggAiAMIBNqIgggBWoiDGo2AgAgDiADIAZqNgIAIAcgFCAJayIHIARrNgIAIBEgC0HZA2xBgAFqIBBBxAFsakEIdSAEaiIJIAggBWsiBWo2AgAgEiAFIAlrNgIAIAogBCAHajYCACANIAYgA2s2AgAgDyAMIAJr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aiABQQxsaiAAKAIIQQYQMCICNgLUAiAAIANBgANsaiABQQxsaiACNgLQAiAFIAI2AgAMAgsgBSAAKAIIQQYQMDYCACAAIANBgANsaiABQQxsaiAAKAIIQQYQMCICNgLUAiAAIANBgANsaiABQQxsaiACNgLQAgsLCyADQQFqIgMgCEkNAAsgAUEBaiIBIAtHDQALCwsLaiALQSBJIRsgAEHMtgFqIQQgAEHMCGohHCAAQcz2AGohHSAAQcwLaiEeIABBzJYBaiEfA0BBACEWIBQhAwNAIBgEQEEAIQEDQCAAQQAgASAOECggAEEBIAEgDhAoIAFBAWoiASANSA0ACwsgGQRAIA0hAQNAIABBACABIA4QKCAAQcwLaiABQQxsaiAAQcwIaiABQQxsaigCADYCACAAIAFBDGxqQdALaiAAIAFBDGxqQdAIaigCADYCACAAIAFBDGxqQdQLaiAAIAFBDGxqQdQIaigCADYCACABQQFqIgEgC0gNAAsLIBsEQCALIQEDQCAAQcwIaiABQQxsakEANgIAIAAgAUEMbGpB0AhqQQA2AgAgACABQQxsakHUCGpBADYCACAAQcwLaiABQQxsakEANgIAIAAgAUEMbGpB0AtqQQA2AgAgACABQQxsakHUC2pBADYCACABQQFqIgFBIEcNAAsLIAAoAgQhASADIRFBACESA0AgACABQcAHakH/B3EiATYCBCAcIBIgHSABECkgBEIANwIAIARCADcCCCAEQgA3AhAgBEIANwIYIARCADcCICAEQgA3AiggBEIANwIwIARCADcCOCAEQUBrQgA3AgAgBEIANwJIIARCADcCUCAEQgA3AlggBEIANwJgIARCADcCaCAEQgA3AnAgBEIANwJ4IAAoAgQiD0EBdSETQf8HIA9BgAFvQQF1IgxrIgFBgH9xIRUgAUEHdkEGdEHABGohEEGABCATayEGIAwhAQNAIAYhB0EAIQkgASECA0AgB0EBaiEIIAJBAWohBSAAQcy2AWogCUECdGoiCiAAQczWAGogB0ECdGoqAgAgAEHM9gBqIAJBAnRqKgIAlCAKKAIAspKoNgIAIAlBAWoiCUEgRwRAIAghByAFIQIMAQsLIAFBgAFqIQIgBkFAayEGIAFBgAdIBEAgAiEBDAELC0HgByAMIBVqayIBQYAISARAIBAgE2tBoHxqIQYD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IkogWCBLk7tEujBFka7n9D+itiJLk7tEuEt/Zp6g5j+itiI6kiEqIANBMGpBAnQgAmogTSA8kow4AgAgA0EvakECdCACaiApICiSIEwgSZIgJJIiKJKMIik4AgAgA0ExakECdCACaiApOAIAIANBLmpBAnQgAmogRiBFkiAjkowiKTgCACADQTJqQQJ0IAJqICk4AgAgA0EtakECdCACaiAwIC2SIEAgPpIgJpIiKZIiPCAokowiKDgCACADQTNqQQJ0IAJqICg4AgAgA0EsakECdCACaiA2IE+SIFEgUJIgNZIiKJKMIjY4AgAgA0E0akECdCACaiA2OAIAIANBK2pBAnQgAmogPCA/IDiSIDOSIjwgJJIiJJKMIjY4AgAgA0E1akECdCACaiA2OAIAIANBKmpBAnQgAmogPSBSkiA7kiI9ICOSjCIjOAIAIANBNmpBAnQgAmogIzgCACADQSlqQQJ0IAJqIEsgSpIgOpIiIyAkkowiJDgCACADQTdqQQJ0IAJqICQ4AgAgA0EoakECdCACaiBIIE6SIDGSjCIkOAIAIANBOGpBAnQgAmogJDgCACADQSdqQQJ0IAJqICMgPCArkiIjkowiJDgCACADQTlqQQJ0IAJqICQ4AgAgA0EmakECdCACaiA9ICeSjCIkOAIAIANBOmpBAnQgAmogJDgCACADQSVqQQJ0IAJqICkgLSAwk7tEuEt/Zp6g5j+itiIpkiItICOSjCIjOAIAIANBO2pBAnQgAmogIzgCACADQSRqQQJ0IAJqICggR5KMIiM4AgAgA0E8akECdCACaiAjOAIAIANBI2pBAnQgAmogLSArIDKSIiOSjCIoOAIAIANBPWpBAnQgAmogKDgCACADQSJqQQJ0IAJqICcgU5KMIic4AgAgA0E+akECdCACaiAnOAIAIANBIWpBAnQgAmogIyBCkowiIzgCACADQT9qQQJ0IAJqICM4AgAgA0EgakECdCACaiA0jDgCACADQQJ0IAJqIDQ4AgAgA0EfakECdCACaiAsjDgCACADQQFqQQJ0IAJqICw4AgAgA0EeakECdCACaiA5jDgCACADQQJqQQJ0IAJqIDk4AgAgA0EdakECdCACaiApICaSIjQgQZIiI4w4AgAgA0EDakECdCACaiAjOAIAIANBHGpBAnQgAmogL4w4AgAgA0EEakECdCACaiAvOAIAIANBG2pBAnQgAmogNCA3IDOSIjSSIi+MOAIAIANBBWpBAnQgAmogLzgCACADQRpqQQJ0IAJqIEQgO5IiL4w4AgAgA0EGakECdCACaiAvOAIAIANBGWpBAnQgAmogNCA6kiI0jDgCACADQQdqQQJ0IAJqIDQ4AgAgA0EYakECdCACaiAxjDgCACADQQhqQQJ0IAJqIDE4AgAgA0EXakECdCACaiAqjDgCACADQQlqQQJ0IAJqICo4AgAgA0EWakECdCACaiA7IC6SIjGMOAIAIANBCmpBAnQgAmogMTgCACADQRVqQQJ0IAJqIEMgJpIiMYw4AgAgA0ELakECdCACaiAxOAIAIANBFGpBAnQgAmogNYw4AgAgA0EMakECdCACaiA1OAIAIANBE2pBAnQgAmogJiAlkiImjDgCACADQQ1qQQJ0IAJqICY4AgAgA0ESakECdCACaiAujDgCACADQQ5qQQJ0IAJqIC44AgAgA0ERakECdCACaiAljDgCACADQQ9qQQJ0IAJqICU4AgAgA0EQakECdCACakMAAAAAOAIACy8BAX9BFBAxIgIgATYCECACIAAQMTYCACACIAA2AgggAkEANgIMIAJBADYCBCACCw0AIAAoAgAQOCAAEDgL6QEBBH8gACgCCCIDIAAoAgwiAmsiBCABSQRAAkAgACgCEEECRgRAIAAgACgCACABIARrIANBAXQiAiACIARqIAFJGyIBEDk2AgAgACABNgIIIAAoAgQgACgCDCIBQQN0IgJNDQEgACACNgIEDAELIAIgACgCBCIFQQN2IgNGIAMgBGogAUlyBEAgAEEANgIMIABBADYCBEEAIQEMAQsgAwRAIAAoAgAiASABIANqIAIgA2sQOxogACAAKAIMIANrIgE2AgwgACAAKAIEIAVBeHFrNgIEBSACIQELCwUgAiEBCyAAKAIAIAFqC40BAQR/IAAoAgRBB2pBA3YiASAAKAIMIgRJBEACQCAAKAIAIQIDQAJAIAFBAWohAyABIAJqLAAARQRAIAIgA2osAABFBEAgAiABQQJqaiwAAEEBRg0CCwsgAyAETw0CIAMhAQwBCwsgACABQQN0QSBqNgIEIAIgAUEDamotAAAPCwsgACAEQQN0NgIEQX8LqQEBBH8gACgCBEEHakEDdiICIAAoAgwiBUkEQAJAIAAoAgAh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aiIGQRBLDQALIAMgCWohAyAIayECIQEMAgsgAyABKAIAIgU6AAAgAyABLAABOgABIAJBbGpBcHEiCEESaiIJIAFqIAJBbmogA0ECaiEEIAJBfmohBiABQQJqIQIgBSEBA0AgBCACKAICIgVBEHQgAUEQdnI2AgAgBCACKAIGIgFBEHQgBUEQdnI2AgQgBCACKAIKIgVBEHQgAUEQdnI2AgggBCACKAIOIgFBEHQgBUEQdnI2AgwgAkEQaiECIARBEGohBCAGQXBqIgZBEUsNAAsgAyAJaiEDIAhrIQIhAQwBCyADIAEoAgAiBToAACACQWxqQXBxIghBEWoiCSABaiACQW9qIANBAWohBCACQX9qIQYgAUEBaiECIAUhAQNAIAQgAigCAyIFQRh0IAFBCHZyNgIAIAQgAigCByIBQRh0IAVBCHZyNgIEIAQgAigCCyIFQRh0IAFBCHZyNgIIIAQgAigCDyIBQRh0IAVBCHZyNgIMIAJBEGohAiAEQRBqIQQgBkFwaiIGQRJLDQALIAMgCWohAyAIayECIQELCyACQRBxBEAgAyABLAAAOgAAIAMgASwAAToAASADIAEsAAI6AAIgAyABLAADOgADIAMgASwABDoABCADIAEsAAU6AAUgAyABLAAGOgAGIAMgASwABzoAByADIAEsAAg6AAggAyABLAAJOgAJIAMgASwACjoACiADIAEsAAs6AAsgAyABLAAMOgAMIAMgASwADToADSADIAEsAA46AA4gAyABLAAPOgAPIANBEGohAyABQRBqIQELIAJBCHEEQCADIAEsAAA6AAAgAyABLAABOgABIAMgASwAAjoAAiADIAEsAAM6AAMgAyABLAAEOgAEIAMgASwABToABSADIAEsAAY6AAYgAyABLAAHOgAHIANBCGohAyABQQhqIQELIAJBBHEEQCADIAEsAAA6AAAgAyABLAABOgABIAMgASwAAjoAAiADIAEsAAM6AAMgA0EEaiEDIAFBBGohAQsgAkECcQRAIAMgASwAADoAACADIAEsAAE6AAEgA0ECaiEDIAFBAmohAQsgAkEBcUUEQCAADwsgAyABLAAAOgAAIAALwAMBBn8gACABRgRAIAAPCyABIAJqIABLIAAgAmoiBSABS3FFBEAgACABIAIQOhogAA8LIAEgACIDc0EDcUUhBCADIAFJBH8g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JCQkJCQkJCQkJCQkJCQkJCQAAAABAhEAAAAAAAAAAAAAAAAAAQIDBAUGEQAAAAAAAAAAAAECAwQFBgcICQoLDA0OEQABAwUGBwgJCgsMDQ4PEBEAAQIEBQYHCAkKCwwNDg8RAAECAwQFBgcICQoLDA0ODwMAAQUFAAEHBwAAAwkAAQoPAAAEHwAABT8AAAZ/AAAH/wAACP8BAAn/AwAK/wcAC/8PAAz/HwAN/z8ADv9/AA///wAQAAAAAAAAAAAAAAAAAAAAAupflgEwikIBCAgMW1tbXltec2l6ZSA+IDAAL2hvbWUvZG9taW5pYy9wcm9qZWN0cy9lbXNkay9mYXN0Y29tcC9lbXNjcmlwdGVuL3N5c3RlbS9saWIvZW1tYWxsb2MuY3BwAGdldEZyZWVMaXN0SW5kZXgATUlOX0ZSRUVMSVNUX0lOREVYIDw9IGluZGV4ICYmIGluZGV4IDwgTUFYX0ZSRUVMSVNUX0lOREVYAGdldEFmdGVyKHJlZ2lvbikgPD0gc2JyaygwKQBlbW1hbGxvY19tYWxsb2MAcmVnaW9uLT5nZXRVc2VkKCkAZ2V0UGF5bG9hZAAoY2hhciopZXh0cmFQdHIgPT0gKGNoYXIqKXB0ciArIHNicmtTaXplAGFsbG9jYXRlUmVnaW9uACFsYXN0UmVnaW9uACFmaXJzdFJlZ2lvbgBmaXJzdFJlZ2lvbgBwdHIgPT0gZ2V0QWZ0ZXIobGFzdFJlZ2lvbikAZXh0ZW5kTGFzdFJlZ2lvbgBhZGRUb0ZyZWVMaXN0AGdldEJpZ0Vub3VnaEZyZWVMaXN0SW5kZXgAcGF5bG9hZFNpemUgPj0gc2l6ZQBwb3NzaWJseVNwbGl0UmVtYWluZGVyAGV4dHJhID49IE1JTl9SRUdJT05fU0laRQB0b3RhbFNwbGl0U2l6ZSA+PSBNSU5fUkVHSU9OX1NJWkUAbWVyZ2VJbnRvRXhpc3RpbmdGcmVlUmVnaW9uAHJlZ2lvbiA9PSBsYXN0UmVnaW9uAGVtbWFsbG9jX3JlYWxsb2M=';