public.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023
  1. const userAgentKey = {
  2. Opera: 'Opera',
  3. Chrome: 'Chrome',
  4. Firefox: 'Firefox',
  5. Edge: 'Edge',
  6. Edg: 'Edg',
  7. IE: 'IE',
  8. Safari: 'Safari',
  9. }
  10. //Get platform type
  11. function getPlatformType() {
  12. const { platform } = navigator
  13. return platform
  14. }
  15. function getBrowserType() {
  16. const { userAgent } = navigator
  17. // Determine if it is an Edge browser
  18. if (userAgent.includes('Edge')) {
  19. return userAgentKey.Edge
  20. }
  21. // Determine if it is an Edge browser
  22. if (userAgent.includes('Edg')) {
  23. return userAgentKey.Edg
  24. }
  25. // Determine if it is a Firefox browser
  26. if (userAgent.includes('Firefox')) {
  27. return userAgentKey.Firefox
  28. }
  29. // Determine if it is a Chrome browser
  30. if (userAgent.includes('Chrome')) {
  31. return userAgentKey.Chrome
  32. }
  33. // Determine if it is a Safari browser
  34. if (userAgent.includes('Safari')) {
  35. return userAgentKey.Safari
  36. }
  37. // Determine if it is a ie browser
  38. if (
  39. userAgent.includes('compatible') &&
  40. userAgent.includes('MSIE') &&
  41. userAgent.includes('Opera')
  42. ) {
  43. return userAgentKey.IE
  44. }
  45. // Determine if it is a Opera browser
  46. if (userAgent.includes('Opera')) {
  47. return userAgentKey.Opera
  48. }
  49. return ''
  50. }
  51. function getBrowserVersion(browserType) {
  52. const { userAgent } = navigator
  53. return userAgent.split(browserType)[1].split('.')[0].slice(1)
  54. }
  55. function checkBrowser() {
  56. const browserType = getBrowserType()
  57. const browserVersion = getBrowserVersion(browserType)
  58. let bSupportMultiThread = false
  59. let errorCode = 0
  60. if (typeof SharedArrayBuffer == 'undefined') {
  61. bSupportMultiThread = false
  62. } else {
  63. switch (browserType) {
  64. case userAgentKey.Chrome:
  65. bSupportMultiThread = browserVersion >= 91
  66. errorCode = 701
  67. break
  68. case userAgentKey.Firefox:
  69. bSupportMultiThread = browserVersion >= 97
  70. errorCode = 702
  71. break
  72. case userAgentKey.Edge:
  73. bSupportMultiThread = browserVersion >= 91
  74. errorCode = 703
  75. break
  76. case userAgentKey.Edg:
  77. bSupportMultiThread = browserVersion >= 91
  78. errorCode = 703
  79. break
  80. default:
  81. bSupportMultiThread = false
  82. }
  83. }
  84. return { bSupportMultiThread, browserType, errorCode }
  85. }
  86. function checkSupportH265MSE() {
  87. const browserType = getBrowserType()
  88. const browserVersion = getBrowserVersion(browserType)
  89. var bSupportH265MSE = false
  90. switch (browserType) {
  91. case userAgentKey.Chrome:
  92. bSupportH265MSE = browserVersion >= 104
  93. break
  94. default:
  95. bSupportH265MSE = 0
  96. }
  97. return bSupportH265MSE
  98. }
  99. function Uint8ArrayToString(dataArray) {
  100. var dataString = ''
  101. for (var i = 0; i < dataArray.length; i++) {
  102. var szCode = String.fromCharCode(dataArray[i])
  103. dataString += szCode
  104. if (szCode == '\0') {
  105. break
  106. }
  107. }
  108. return dataString
  109. }
  110. var isDebug = false
  111. var debug = (function (flag) {
  112. if (flag) {
  113. return {
  114. log: function (message) {
  115. console.log(message)
  116. },
  117. error: function (message) {
  118. console.error(message)
  119. },
  120. count: function (message) {
  121. console.count(message)
  122. },
  123. info: function (message) {
  124. console.info(message)
  125. },
  126. trace: function (message) {
  127. console.trace(message)
  128. },
  129. }
  130. } else {
  131. return {
  132. log: function () {},
  133. error: function () {},
  134. count: function () {},
  135. info: function () {},
  136. }
  137. }
  138. })(isDebug)
  139. function BrowserDetect() {
  140. var agent = navigator.userAgent.toLowerCase(),
  141. name = navigator.appName,
  142. browser = null
  143. if (
  144. name === 'Microsoft Internet Explorer' ||
  145. agent.indexOf('trident') > -1 ||
  146. agent.indexOf('edge/') > -1
  147. ) {
  148. browser = 'ie'
  149. if (name === 'Microsoft Internet Explorer') {
  150. agent = /msie ([0-9]{1,}[\.0-9]{0,})/.exec(agent)
  151. browser += parseInt(agent[1])
  152. } else {
  153. if (agent.indexOf('trident') > -1) {
  154. browser += 11
  155. } else if (agent.indexOf('edge/') > -1) {
  156. browser = 'edge'
  157. }
  158. }
  159. } else if (agent.indexOf('safari') > -1) {
  160. if (agent.indexOf('chrome') > -1) {
  161. browser = 'chrome'
  162. } else {
  163. browser = 'safari'
  164. }
  165. } else if (agent.indexOf('firefox') > -1) {
  166. browser = 'firefox'
  167. }
  168. return browser
  169. }
  170. var Script = (function script() {
  171. function Constructor() {}
  172. Constructor.createFromElementId = function (id) {
  173. var script = document.getElementById(id)
  174. //assert(script, "Could not find shader with ID: " + id);
  175. var source = ''
  176. var currentChild = script.firstChild
  177. while (currentChild) {
  178. if (currentChild.nodeType === 3) {
  179. source += currentChild.textContent
  180. }
  181. currentChild = currentChild.nextSibling
  182. }
  183. var res = new Constructor()
  184. res.type = script.type
  185. res.source = source
  186. return res
  187. }
  188. Constructor.createFromSource = function (type, source) {
  189. var res = new Constructor()
  190. res.type = type
  191. res.source = source
  192. return res
  193. }
  194. return Constructor
  195. })()
  196. var Shader = (function shader() {
  197. function Constructor(gl, script) {
  198. if (script.type === 'x-shader/x-fragment') {
  199. this.shader = gl.createShader(gl.FRAGMENT_SHADER)
  200. } else if (script.type === 'x-shader/x-vertex') {
  201. this.shader = gl.createShader(gl.VERTEX_SHADER)
  202. } else {
  203. error('Unknown shader type: ' + script.type)
  204. return
  205. }
  206. gl.shaderSource(this.shader, script.source)
  207. gl.compileShader(this.shader)
  208. if (!gl.getShaderParameter(this.shader, gl.COMPILE_STATUS)) {
  209. error('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(this.shader))
  210. return
  211. }
  212. }
  213. return Constructor
  214. })()
  215. var Program = (function () {
  216. function Constructor(gl) {
  217. this.gl = gl
  218. this.program = this.gl.createProgram()
  219. }
  220. Constructor.prototype = {
  221. attach: function (shader) {
  222. this.gl.attachShader(this.program, shader.shader)
  223. },
  224. link: function () {
  225. this.gl.linkProgram(this.program)
  226. //assert(this.gl.getProgramParameter(this.program, this.gl.LINK_STATUS), "Unable to initialize the shader program.")
  227. },
  228. use: function () {
  229. this.gl.useProgram(this.program)
  230. },
  231. getAttributeLocation: function (name) {
  232. return this.gl.getAttribLocation(this.program, name)
  233. },
  234. setMatrixUniform: function (name, array) {
  235. var uniform = this.gl.getUniformLocation(this.program, name)
  236. this.gl.uniformMatrix4fv(uniform, false, array)
  237. },
  238. }
  239. return Constructor
  240. })()
  241. var Texture = (function texture() {
  242. var textureIDs = null
  243. function Constructor(gl, size, format) {
  244. this.gl = gl
  245. this.size = size
  246. this.texture = gl.createTexture()
  247. gl.bindTexture(gl.TEXTURE_2D, this.texture)
  248. this.format = format ? format : gl.LUMINANCE
  249. gl.texImage2D(
  250. gl.TEXTURE_2D,
  251. 0,
  252. this.format,
  253. size.w,
  254. size.h,
  255. 0,
  256. this.format,
  257. gl.UNSIGNED_BYTE,
  258. null,
  259. )
  260. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)
  261. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)
  262. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
  263. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
  264. }
  265. Constructor.prototype = {
  266. fill: function (textureData, useTexSubImage2D) {
  267. var gl = this.gl
  268. //assert(textureData.length >= this.size.w * this.size.h, "Texture size mismatch, data:" + textureData.length + ", texture: " + this.size.w * this.size.h);
  269. gl.bindTexture(gl.TEXTURE_2D, this.texture)
  270. if (useTexSubImage2D) {
  271. gl.texSubImage2D(
  272. gl.TEXTURE_2D,
  273. 0,
  274. 0,
  275. 0,
  276. this.size.w,
  277. this.size.h,
  278. this.format,
  279. gl.UNSIGNED_BYTE,
  280. textureData,
  281. )
  282. } else {
  283. gl.texImage2D(
  284. gl.TEXTURE_2D,
  285. 0,
  286. this.format,
  287. this.size.w,
  288. this.size.h,
  289. 0,
  290. this.format,
  291. gl.UNSIGNED_BYTE,
  292. textureData,
  293. )
  294. }
  295. },
  296. bind: function (num, program, name) {
  297. var gl = this.gl
  298. if (!textureIDs) {
  299. textureIDs = [gl.TEXTURE0, gl.TEXTURE1, gl.TEXTURE2]
  300. }
  301. gl.activeTexture(textureIDs[num])
  302. gl.bindTexture(gl.TEXTURE_2D, this.texture)
  303. gl.uniform1i(gl.getUniformLocation(program.program, name), num)
  304. },
  305. }
  306. return Constructor
  307. })()
  308. /**
  309. * Created by 33596 on 2018/5/8.
  310. */
  311. var base64ArrayBuffer = function (arrayBuffer) {
  312. var base64 = ''
  313. var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  314. var bytes = new Uint8Array(arrayBuffer)
  315. var byteLength = bytes.byteLength
  316. var byteRemainder = byteLength % 3
  317. var mainLength = byteLength - byteRemainder
  318. var a = 0,
  319. b = 0,
  320. c = 0,
  321. d = 0
  322. var chunk = 0
  323. // Main loop deals with bytes in chunks of 3
  324. for (var i = 0; i < mainLength; i = i + 3) {
  325. // Combine the three bytes into a single integer
  326. chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]
  327. // Use bitmasks to extract 6-bit segments from the triplet
  328. a = (chunk & 16515072) >> 18 // 16515072 = (2^6 - 1) << 18
  329. b = (chunk & 258048) >> 12 // 258048 = (2^6 - 1) << 12
  330. c = (chunk & 4032) >> 6 // 4032 = (2^6 - 1) << 6
  331. d = chunk & 63 // 63 = 2^6 - 1
  332. // Convert the raw binary segments to the appropriate ASCII encoding
  333. base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]
  334. }
  335. // Deal with the remaining bytes and padding
  336. if (byteRemainder === 1) {
  337. chunk = bytes[mainLength]
  338. a = (chunk & 252) >> 2 // 252 = (2^6 - 1) << 2
  339. // Set the 4 least significant bits to zero
  340. b = (chunk & 3) << 4 // 3 = 2^2 - 1
  341. base64 += encodings[a] + encodings[b] + '=='
  342. } else if (byteRemainder === 2) {
  343. chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]
  344. a = (chunk & 64512) >> 10 // 64512 = (2^6 - 1) << 10
  345. b = (chunk & 1008) >> 4 // 1008 = (2^6 - 1) << 4
  346. // Set the 2 least significant bits to zero
  347. c = (chunk & 15) << 2 // 15 = 2^4 - 1
  348. base64 += encodings[a] + encodings[b] + encodings[c] + '='
  349. }
  350. return base64
  351. }
  352. function CommonAudioUtil() {
  353. var power2 = [
  354. 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000,
  355. ]
  356. /*
  357. * quan()
  358. *
  359. * quantizes the input val against the table of size short integers.
  360. * It returns i if table[i - 1] <= val < table[i].
  361. *
  362. * Using linear search for simple coding.
  363. */
  364. var quan = function (val, table, size) {
  365. //int, *int, int
  366. var i = 0 //int
  367. var j = 0
  368. for (i = 0; i < size; i++) {
  369. if (val < table[j]) {
  370. break
  371. } else {
  372. j++
  373. }
  374. }
  375. return i
  376. }
  377. /*
  378. * fmult()
  379. *
  380. * returns the integer product of the 14-bit integer "an" and
  381. * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn".
  382. */
  383. var fmult = function (an, srn) {
  384. // int, int
  385. var anmag = 0 //int
  386. var anexp = 0 //int
  387. var anmant = 0 //int
  388. var wanexp = 0 //int
  389. var wanmant = 0 //int
  390. var retval = 0 //int
  391. anmag = an > 0 ? an : -an & 0x1fff
  392. anexp = quan(anmag, power2, 15) - 6
  393. if (anmag === 0) {
  394. anmant = 32
  395. } else {
  396. anmant = anexp >= 0 ? anmag >> anexp : anmag << -anexp
  397. }
  398. wanexp = anexp + ((srn >> 6) & 0xf) - 13
  399. wanmant = (anmant * (srn & parseInt('077', 8)) + 0x30) >> 4
  400. retval = wanexp >= 0 ? (wanmant << wanexp) & 0x7fff : wanmant >> -wanexp
  401. return (an ^ srn) < 0 ? -retval : retval
  402. }
  403. /*
  404. * g72x_init_state()
  405. *
  406. * This routine initializes and/or resets the g72x_state structure
  407. * pointed to by 'statePtr'.
  408. * All the initial state values are specified in the CCITT G.721 document.
  409. */
  410. this.g726InitState = function () {
  411. // var a[2];//int /* Coefficients of pole portion of prediction filter. */
  412. // var b[6];//int /* Coefficients of zero portion of prediction filter. */
  413. // var pk[2];//int /* Signs of previous two samples of a partially reconstructed signal. */
  414. // var dq[6];//short /* int here fails in newupdate on encode!
  415. // // Previous 6 samples of the quantized difference
  416. // // signal represented in an internal floating point
  417. // // format.
  418. // var sr[2];//int /* Previous 2 samples of the quantized difference
  419. var statePtr = {}
  420. var cnta = 0 //int
  421. statePtr.pp = new Array(2)
  422. statePtr.zp = new Array(6)
  423. statePtr.pk = new Array(2)
  424. statePtr.dq = new Array(6)
  425. statePtr.sr = new Array(2)
  426. statePtr.yl = 34816
  427. statePtr.yu = 544
  428. statePtr.dms = 0
  429. statePtr.dml = 0
  430. statePtr.ppp = 0
  431. for (cnta = 0; cnta < 2; cnta++) {
  432. statePtr.pp[cnta] = 0
  433. statePtr.pk[cnta] = 0
  434. statePtr.sr[cnta] = 32
  435. }
  436. for (cnta = 0; cnta < 6; cnta++) {
  437. statePtr.zp[cnta] = 0
  438. statePtr.dq[cnta] = 32
  439. }
  440. statePtr.td = 0
  441. // g726_state = statePtr;
  442. return statePtr
  443. }
  444. /*
  445. * predictorZero()
  446. *
  447. * computes the estimated signal from 6-zero predictor.
  448. *
  449. */
  450. this.predictorZero = function (statePtr) {
  451. var i = 0 //int
  452. var sezi = 0 //int
  453. sezi = fmult(statePtr.zp[0] >> 2, statePtr.dq[0])
  454. for (i = 1; i < 6; i++) {
  455. /* ACCUM */
  456. sezi += fmult(statePtr.zp[i] >> 2, statePtr.dq[i])
  457. }
  458. return sezi
  459. }
  460. /*
  461. * predictorPole()
  462. *
  463. * computes the estimated signal from 2-pole predictor.
  464. *
  465. */
  466. this.predictorPole = function (statePtr) {
  467. return fmult(statePtr.pp[1] >> 2, statePtr.sr[1]) + fmult(statePtr.pp[0] >> 2, statePtr.sr[0])
  468. }
  469. /*
  470. * stepSize()
  471. *
  472. * computes the quantization step size of the adaptive quantizer.
  473. *
  474. */
  475. this.stepSize = function (statePtr) {
  476. var y = 0 //int
  477. var dif = 0 //int
  478. var al = 0 //int
  479. if (statePtr.ppp >= 256) {
  480. return statePtr.yu
  481. } else {
  482. y = statePtr.yl >> 6
  483. dif = statePtr.yu - y
  484. al = statePtr.ppp >> 2
  485. if (dif > 0) {
  486. y += (dif * al) >> 6
  487. } else if (dif < 0) {
  488. y += (dif * al + 0x3f) >> 6
  489. }
  490. return y
  491. }
  492. }
  493. /*
  494. * quantize()
  495. *
  496. * Given a raw sample, 'd', of the difference signal and a
  497. * quantization step size scale factor, 'y', this routine returns the
  498. * ADPCM codeword to which that sample gets quantized. The step
  499. * size scale factor division operation is done in the log base 2 domain
  500. * as a subtraction.
  501. */
  502. this.quantize = function (
  503. rd /* Raw difference signal sample */,
  504. y /* Step size multiplier */,
  505. table /* quantization table */, //wjuncho
  506. size,
  507. ) /* table size of integers */ {
  508. var dqm = 0 //int /* Magnitude of 'd' */
  509. var exp = 0 //int /* Integer part of base 2 log of 'd' */
  510. var mant = 0 //int /* Fractional part of base 2 log */
  511. var dl = 0 //int /* Log of magnitude of 'd' */
  512. var dln = 0 //int /* Step size scale factor normalized log */
  513. var i = 0 //int
  514. /*
  515. * LOG
  516. *
  517. * Compute base 2 log of 'd', and store in 'dl'.
  518. */
  519. dqm = Math.abs(rd)
  520. exp = quan(dqm >> 1, power2, 15)
  521. mant = ((dqm << 7) >> exp) & 0x7f
  522. /* Fractional portion. */
  523. dl = (exp << 7) + mant
  524. /*
  525. * SUBTB
  526. *
  527. * "Divide" by step size multiplier.
  528. */
  529. dln = dl - (y >> 2)
  530. /*
  531. * QUAN
  532. *
  533. * Obtain codword i for 'd'.
  534. */
  535. i = quan(dln, table, size)
  536. if (rd < 0) {
  537. /* take 1's complement of i */
  538. return (size << 1) + 1 - i
  539. } else if (i === 0) {
  540. /* take 1's complement of 0 */
  541. return (size << 1) + 1
  542. /* new in 1988 */
  543. } else {
  544. return i
  545. }
  546. }
  547. /*
  548. * reconstruct()
  549. *
  550. * Returns reconstructed difference signal 'dq' obtained from
  551. * codeword 'i' and quantization step size scale factor 'y'.
  552. * Multiplication is performed in log base 2 domain as addition.
  553. */
  554. this.reconstruct = function (
  555. sign /* 0 for non-negative value */,
  556. dqln /* G.72x codeword */,
  557. y,
  558. ) /* Step size multiplier */ {
  559. var dql = 0 //int /* Log of 'dq' magnitude */
  560. var dex = 0 //int /* Integer part of log */
  561. var dqt = 0 //int
  562. var dq = 0 //int /* Reconstructed difference signal sample */
  563. dql = dqln + (y >> 2)
  564. /* ADDA */
  565. if (dql < 0) {
  566. return sign ? -0x8000 : 0
  567. } else {
  568. /* ANTILOG */
  569. dex = (dql >> 7) & 15
  570. dqt = 128 + (dql & 127)
  571. dq = (dqt << 7) >> (14 - dex) //wjuncho convert it to (short) :: dq = (short)((dqt << 7) >> (14 - dex));
  572. return sign ? dq - 0x8000 : dq
  573. }
  574. }
  575. /*
  576. * update()
  577. *
  578. * updates the state variables for each output code
  579. */
  580. this.update = function (
  581. codeSize, //int /* distinguish 723_40 with others */
  582. y, //int /* quantizer step size */
  583. wi, //int /* scale factor multiplier */
  584. fi, //int /* for long/short term energies */
  585. dq, //int /* quantized prediction difference */
  586. sr, //int /* reconstructed signal */
  587. dqsez, //int /* difference from 2-pole predictor */
  588. statePtr,
  589. ) /* coder state pointer */ {
  590. var cnt = 0 //int
  591. var mag = 0,
  592. exp = 0 //int /* Adaptive predictor, FLOAT A */
  593. var a2p = 0 //int /* LIMC */
  594. var a1ul = 0 //int /* UPA1 */
  595. var pks1 = 0 //int /* UPA2 */
  596. var fa1 = 0 //int
  597. var tr = 0 //int /* tone/transition detector */
  598. var ylint = 0,
  599. thr2 = 0,
  600. dqthr = 0 //int
  601. var ylfrac = 0,
  602. thr1 = 0 //int
  603. var pk0 = 0 //int
  604. pk0 = dqsez < 0 ? 1 : 0
  605. /* needed in updating predictor poles */
  606. mag = dq & 0x7fff
  607. /* prediction difference magnitude */
  608. /* TRANS */
  609. ylint = statePtr.yl >> 15
  610. /* exponent part of yl */
  611. ylfrac = (statePtr.yl >> 10) & 0x1f
  612. /* fractional part of yl */
  613. thr1 = (32 + ylfrac) << ylint
  614. /* threshold */
  615. thr2 = ylint > 9 ? 31 << 10 : thr1
  616. /* limit thr2 to 31 << 10 */
  617. dqthr = (thr2 + (thr2 >> 1)) >> 1
  618. /* dqthr = 0.75 * thr2 */
  619. if (statePtr.td === 0) {
  620. /* signal supposed voice */
  621. tr = 0
  622. } else if (mag <= dqthr) {
  623. /* supposed data, but small mag */
  624. tr = 0
  625. /* treated as voice */
  626. } else {
  627. /* signal is data (modem) */
  628. tr = 1
  629. }
  630. /*
  631. * Quantizer scale factor adaptation.
  632. */
  633. /* FUNCTW & FILTD & DELAY */
  634. /* update non-steady state step size multiplier */
  635. statePtr.yu = y + ((wi - y) >> 5)
  636. /* LIMB */
  637. if (statePtr.yu < 544) {
  638. /* 544 <= yu <= 5120 */
  639. statePtr.yu = 544
  640. } else if (statePtr.yu > 5120) {
  641. statePtr.yu = 5120
  642. }
  643. /* FILTE & DELAY */
  644. /* update steady state step size multiplier */
  645. statePtr.yl += statePtr.yu + (-statePtr.yl >> 6)
  646. /*
  647. * Adaptive predictor coefficients.
  648. */
  649. if (tr === 1) {
  650. /* reset a's and b's for modem signal */
  651. statePtr.pp[0] = 0
  652. statePtr.pp[1] = 0
  653. statePtr.zp[0] = 0
  654. statePtr.zp[1] = 0
  655. statePtr.zp[2] = 0
  656. statePtr.zp[3] = 0
  657. statePtr.zp[4] = 0
  658. statePtr.zp[5] = 0
  659. a2p = 0
  660. } else {
  661. /* update a's and b's */
  662. pks1 = pk0 ^ statePtr.pk[0]
  663. /* UPA2 */
  664. /* update predictor pole a[1] */
  665. a2p = statePtr.pp[1] - (statePtr.pp[1] >> 7)
  666. if (dqsez !== 0) {
  667. fa1 = pks1 ? statePtr.pp[0] : -statePtr.pp[0]
  668. if (fa1 < -8191) {
  669. /* a2p = function of fa1 */
  670. a2p -= 0x100
  671. } else if (fa1 > 8191) {
  672. a2p += 0xff
  673. } else {
  674. a2p += fa1 >> 5
  675. }
  676. if (pk0 ^ statePtr.pk[1]) {
  677. /* LIMC */
  678. if (a2p <= -12160) {
  679. a2p = -12288
  680. } else if (a2p >= 12416) {
  681. a2p = 12288
  682. } else {
  683. a2p -= 0x80
  684. }
  685. } else if (a2p <= -12416) {
  686. a2p = -12288
  687. } else if (a2p >= 12160) {
  688. a2p = 12288
  689. } else {
  690. a2p += 0x80
  691. }
  692. }
  693. /* TRIGB & DELAY */
  694. statePtr.pp[1] = a2p
  695. /* UPA1 */
  696. /* update predictor pole a[0] */
  697. statePtr.pp[0] -= statePtr.pp[0] >> 8
  698. if (dqsez !== 0) {
  699. if (pks1 === 0) {
  700. statePtr.pp[0] += 192
  701. } else {
  702. statePtr.pp[0] -= 192
  703. }
  704. }
  705. /* LIMD */
  706. a1ul = 15360 - a2p
  707. if (statePtr.pp[0] < -a1ul) {
  708. statePtr.pp[0] = -a1ul
  709. } else if (statePtr.pp[0] > a1ul) {
  710. statePtr.pp[0] = a1ul
  711. }
  712. /* UPB : update predictor zeros b[6] */
  713. for (cnt = 0; cnt < 6; cnt++) {
  714. if (codeSize === 5) {
  715. /* for 40Kbps G.723 */
  716. statePtr.zp[cnt] -= statePtr.zp[cnt] >> 9
  717. } else {
  718. /* for G.721 and 24Kbps G.723 */
  719. statePtr.zp[cnt] -= statePtr.zp[cnt] >> 8
  720. }
  721. if (dq & 0x7fff) {
  722. /* XOR */
  723. if ((dq ^ statePtr.dq[cnt]) >= 0) {
  724. statePtr.zp[cnt] += 128
  725. } else {
  726. statePtr.zp[cnt] -= 128
  727. }
  728. }
  729. }
  730. }
  731. for (cnt = 5; cnt > 0; cnt--) {
  732. statePtr.dq[cnt] = statePtr.dq[cnt - 1]
  733. }
  734. /* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */
  735. if (mag === 0) {
  736. statePtr.dq[0] = dq >= 0 ? 0x20 : 0xfc20
  737. } else {
  738. exp = quan(mag, power2, 15)
  739. statePtr.dq[0] =
  740. dq >= 0 //wjuncho statePtr.dq[0] = (short)((dq >= 0) ?
  741. ? (exp << 6) + ((mag << 6) >> exp)
  742. : (exp << 6) + ((mag << 6) >> exp) - 0x400
  743. }
  744. statePtr.sr[1] = statePtr.sr[0]
  745. /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
  746. if (sr === 0) {
  747. statePtr.sr[0] = 0x20
  748. } else if (sr > 0) {
  749. exp = quan(sr, power2, 15)
  750. statePtr.sr[0] = (exp << 6) + ((sr << 6) >> exp)
  751. } else if (sr > -32768) {
  752. mag = -sr
  753. exp = quan(mag, power2, 15)
  754. statePtr.sr[0] = (exp << 6) + ((mag << 6) >> exp) - 0x400
  755. } else {
  756. statePtr.sr[0] = 0xfc20
  757. }
  758. /* DELAY A */
  759. statePtr.pk[1] = statePtr.pk[0]
  760. statePtr.pk[0] = pk0
  761. /* TONE */
  762. if (tr === 1) {
  763. /* this sample has been treated as data */
  764. statePtr.td = 0
  765. /* next one will be treated as voice */
  766. } else if (a2p < -11776) {
  767. /* small sample-to-sample correlation */
  768. statePtr.td = 1
  769. /* signal may be data */
  770. } else {
  771. /* signal is voice */
  772. statePtr.td = 0
  773. }
  774. /*
  775. * Adaptation speed control.
  776. */
  777. statePtr.dms += (fi - statePtr.dms) >> 5
  778. /* FILTA */
  779. statePtr.dml += ((fi << 2) - statePtr.dml) >> 7
  780. /* FILTB */
  781. if (tr === 1) {
  782. statePtr.ppp = 256
  783. } else if (y < 1536) {
  784. /* SUBTC */
  785. statePtr.ppp += (0x200 - statePtr.ppp) >> 4
  786. } else if (statePtr.td === 1) {
  787. statePtr.ppp += (0x200 - statePtr.ppp) >> 4
  788. } else if (Math.abs((statePtr.dms << 2) - statePtr.dml) >= statePtr.dml >> 3) {
  789. statePtr.ppp += (0x200 - statePtr.ppp) >> 4
  790. } else {
  791. statePtr.ppp += -statePtr.ppp >> 4
  792. }
  793. return statePtr
  794. }
  795. /*
  796. * tandem_adjust(sr, se, y, i, sign)
  797. *
  798. * At the end of ADPCM decoding, it simulates an encoder which may be receiving
  799. * the output of this decoder as a tandem process. If the output of the
  800. * simulated encoder differs from the input to this decoder, the decoder output
  801. * is adjusted by one level of A-law or u-law codes.
  802. *
  803. * Input:
  804. * sr decoder output linear PCM sample,
  805. * se predictor estimate sample,
  806. * y quantizer step size,
  807. * i decoder input code,
  808. * sign sign bit of code i
  809. *
  810. * Return:
  811. * adjusted A-law or u-law compressed sample.
  812. */
  813. // var tandem_adjust_alaw = function(
  814. // sr, /* decoder output linear PCM sample */ //int
  815. // se, /* predictor estimate sample */ //int
  816. // y, /* quantizer step size */ //int
  817. // i, /* decoder input code */ //int
  818. // sign, //int
  819. // qtab) //*int
  820. // {
  821. // var sp; /* A-law compressed 8-bit code */
  822. // var dx; /* prediction error */
  823. // var id; /* quantized prediction error */
  824. // var sd; /* adjusted A-law decoded sample value */
  825. // var im; /* biased magnitude of i */
  826. // var imx; /* biased magnitude of id */
  827. // if (sr <= -32768)
  828. // sr = -1;
  829. // sp = linear2alaw((sr >> 1) << 3); /* short to A-law compression */
  830. // dx = (alaw2linear(sp) >> 2) - se; /* 16-bit prediction error */
  831. // id = quantize(dx, y, qtab, sign - 1);
  832. // if (id === i) { no adjustment on sp
  833. // return (sp);
  834. // } else { /* sp adjustment needed */
  835. // /* ADPCM codes : 8, 9, ... F, 0, 1, ... , 6, 7 */
  836. // im = i ^ sign; /* 2's complement to biased unsigned */
  837. // imx = id ^ sign;
  838. // if (imx > im) { /* sp adjusted to next lower value */
  839. // if (sp & 0x80) {
  840. // sd = (sp === 0xD5) ? 0x55 :
  841. // ((sp ^ 0x55) - 1) ^ 0x55;
  842. // } else {
  843. // sd = (sp === 0x2A) ? 0x2A :
  844. // ((sp ^ 0x55) + 1) ^ 0x55;
  845. // }
  846. // } else { /* sp adjusted to next higher value */
  847. // if (sp & 0x80)
  848. // sd = (sp === 0xAA) ? 0xAA :
  849. // ((sp ^ 0x55) + 1) ^ 0x55;
  850. // else
  851. // sd = (sp === 0x55) ? 0xD5 :
  852. // ((sp ^ 0x55) - 1) ^ 0x55;
  853. // }
  854. // return (sd);
  855. // }
  856. // };
  857. // var tandem_adjust_ulaw = function(
  858. // sr, /* decoder output linear PCM sample */ // int
  859. // se, /* predictor estimate sample */ // int
  860. // y, /* quantizer step size */ // int
  861. // i, /* decoder input code */ // int
  862. // sign, // int
  863. // qtab) // *int
  864. // {
  865. // var sp; /* u-law compressed 8-bit code */
  866. // var dx; /* prediction error */
  867. // var id; /* quantized prediction error */
  868. // var sd; /* adjusted u-law decoded sample value */
  869. // var im; /* biased magnitude of i */
  870. // var imx; /* biased magnitude of id */
  871. // if (sr <= -32768){
  872. // sr = 0;
  873. // }
  874. // sp = linear2ulaw(sr << 2); /* short to u-law compression */
  875. // dx = (ulaw2linear(sp) >> 2) - se; 16-bit prediction error
  876. // id = quantize(dx, y, qtab, sign - 1);
  877. // if (id === i) {
  878. // return (sp);
  879. // } else {
  880. // /* ADPCM codes : 8, 9, ... F, 0, 1, ... , 6, 7 */
  881. // im = i ^ sign; /* 2's complement to biased unsigned */
  882. // imx = id ^ sign;
  883. // if (imx > im) { /* sp adjusted to next lower value */
  884. // if (sp & 0x80)
  885. // sd = (sp === 0xFF) ? 0x7E : sp + 1;
  886. // else
  887. // sd = (sp === 0) ? 0 : sp - 1;
  888. // } else { /* sp adjusted to next higher value */
  889. // if (sp & 0x80)
  890. // sd = (sp === 0x80) ? 0x80 : sp - 1;
  891. // else
  892. // sd = (sp === 0x7F) ? 0xFE : sp + 1;
  893. // }
  894. // return (sd);
  895. // }
  896. // };
  897. // constructor.prototype = {
  898. // quan: function(val, table, size) {
  899. // return quan(val, table, size);
  900. // },
  901. // fmult: function(an, srn) {
  902. // return fmult(an, srn);
  903. // },
  904. // g726InitState: function() {
  905. // return g726InitState();
  906. // },
  907. // predictorZero: function(statePtr) {
  908. // return predictorZero(statePtr);
  909. // },
  910. // predictorPole: function(statePtr) {
  911. // return predictorPole(statePtr);
  912. // },
  913. // stepSize: function(statePtr) {
  914. // return stepSize(statePtr);
  915. // },
  916. // quantize: function(d, y, table, size) {
  917. // return quantize(d, y, table, size);
  918. // },
  919. // reconstruct: function(sign, dqln, y) {
  920. // return reconstruct(sign, dqln, y);
  921. // },
  922. // update: function(codeSize, y, wi, fi, dq, sr, dqsez, statePtr) {
  923. // return update(codeSize, y, wi, fi, dq, sr, dqsez, statePtr);
  924. // },
  925. // // tandem_adjust_alaw: function(sr, se, y, i, sign, qtab) {
  926. // // return tandem_adjust_alaw(sr, se, y, i, sign, qtab);
  927. // // },
  928. // // tandem_adjust_ulaw: function(sr, se, y, i, sign, qtab) {
  929. // // return tandem_adjust_ulaw(sr, se, y, i, sign, qtab);
  930. // // }
  931. // };
  932. // return new constructor();
  933. }
  934. export {
  935. debug,
  936. BrowserDetect,
  937. checkBrowser,
  938. checkSupportH265MSE,
  939. Texture,
  940. Script,
  941. Program,
  942. Shader,
  943. CommonAudioUtil,
  944. Uint8ArrayToString,
  945. getPlatformType,
  946. getBrowserType,
  947. }