std.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. class Std
  2. {
  3. constructor()
  4. {}
  5. static memmem(data1, data1Offset, data2)
  6. {
  7. for (let i = 0; i <= data1.byteLength - data2.byteLength - data1Offset; ++i)
  8. {
  9. let j = 0;
  10. for (; j != data2.byteLength; ++j)
  11. {
  12. if(data1[i + j + data1Offset] != data2[j])
  13. {
  14. break;
  15. }
  16. }
  17. if(j >= data2.byteLength)
  18. {
  19. return i + data1Offset;
  20. }
  21. }
  22. return -1;
  23. }
  24. static memcmp(data1, data1Offset, data2)
  25. {
  26. for(let i = 0; i != data2.byteLength; ++i)
  27. {
  28. if(data1[i + data1Offset] != data2[i])
  29. {
  30. return -1;
  31. }
  32. }
  33. return 0;
  34. }
  35. static memcpy(data1, data1Offset, data2, data2Begin, data2End)
  36. {
  37. data1.set(data2.subarray(data2Begin, data2End), data1Offset);
  38. }
  39. static milliSecondTime()
  40. {
  41. return new Date().getTime();
  42. }
  43. static shortToFloatData(input)
  44. {
  45. let inputSamples = input.length;
  46. let output = new Float32Array(inputSamples);
  47. for(let i = 0; i != inputSamples; ++i)
  48. {
  49. output[i] = input[i] / 32768;
  50. }
  51. return output;
  52. }
  53. static floatToShortData(input)
  54. {
  55. let inputSamples = input.length;
  56. let output = new Int16Array(inputSamples);
  57. for(let i = 0; i != inputSamples; ++i)
  58. {
  59. output[i] = input[i] * 32768;
  60. }
  61. return output;
  62. }
  63. static downsampleBuffer(buffer, rate, sampleRate)
  64. {
  65. if(rate == sampleRate)
  66. {
  67. return buffer;
  68. }
  69. else if(rate > sampleRate)
  70. {
  71. throw "rate > sampleRate error !!";
  72. }
  73. let sampleRateRatio = sampleRate / rate;
  74. let newLength = Math.ceil(buffer.length / sampleRateRatio) & 0xFFFC;
  75. let result = new Float32Array(newLength);
  76. let offsetResult = 0;
  77. let offsetBuffer = 0;
  78. while (offsetResult != result.length)
  79. {
  80. let nextOffsetBuffer = offsetBuffer + sampleRateRatio;
  81. let accum = 0;
  82. let count = 0;
  83. let currentOffset = Math.ceil(offsetBuffer);
  84. let currentNextOffset = Math.ceil(nextOffsetBuffer);
  85. for (let i = currentOffset; i != currentNextOffset && i != buffer.length; ++i)
  86. {
  87. accum += buffer[i];
  88. ++count;
  89. }
  90. result[offsetResult] = accum / count;
  91. ++offsetResult;
  92. offsetBuffer = nextOffsetBuffer;
  93. }
  94. return result;
  95. }
  96. }
  97. class Result
  98. {
  99. constructor(data, type, time, errorCode, duration = 20)
  100. {
  101. this.data = data;
  102. this.type = type;
  103. this.time = time;
  104. this.duration = duration;
  105. this.errorCode = errorCode;
  106. }
  107. static makeErrorResult(errorCode)
  108. {
  109. return new Result(null, -1, -1, errorCode);
  110. }
  111. }
  112. Result.ErrorCode = class
  113. {
  114. constructor()
  115. {}
  116. }
  117. Result.ErrorCode.SUCCESS = 0;
  118. Result.ErrorCode.PARAM_ERROR = 1000;
  119. Result.ErrorCode.PARAM_CHANGE = 2000;
  120. Result.ErrorCode.FAIL = 3000;
  121. Result.ErrorCode.NO_INIT_ERROR = Result.ErrorCode.FAIL + 1;
  122. Result.ErrorCode.CACHE_MAX_ERROR = Result.ErrorCode.FAIL + 2;
  123. Result.Type = class
  124. {
  125. constructor()
  126. {}
  127. }
  128. Result.Type.H264_I_FRAME = 0;
  129. Result.Type.H264_P_FRAME = 1;
  130. Result.Type.H264_B_FRAME = 2;
  131. Result.Type.AUDIO = 3;
  132. Result.Type.TRANS_DATA = 4;
  133. Result.Type.FMP4_HEAD = 5;
  134. Result.Type.FMP4_BODY = 6;
  135. class AudioCoder
  136. {
  137. constructor(wasm, importObj)
  138. {
  139. if(importObj.memoryBase < 102400)
  140. {
  141. throw new Error("too small");
  142. }
  143. this._importObj = importObj;
  144. this._wasm = wasm;
  145. this._memory = new Uint8Array(this._importObj.env.memory.buffer);
  146. }
  147. _copyToMemory(data)
  148. {
  149. if(data.byteLength > (this._importObj.env.memoryBase >>> 6))
  150. {
  151. throw new Error("overflow");
  152. }
  153. this._memory.set(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));
  154. }
  155. }