agora-electron-sdk 4.5.1 → 4.5.2-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/js/Decoder/gpu-utils.js +74 -0
  3. package/js/Decoder/index.js +172 -0
  4. package/js/Private/AgoraBase.js +15 -3
  5. package/js/Private/extension/AgoraBaseExtension.js +1 -0
  6. package/js/Private/internal/IrisApiEngine.js +20 -7
  7. package/js/Private/internal/RtcEngineExInternal.js +31 -16
  8. package/js/Private/ipc/main.js +21 -0
  9. package/js/Private/ipc/renderer.js +21 -0
  10. package/js/Renderer/CapabilityManager.js +99 -0
  11. package/js/Renderer/IRenderer.js +40 -11
  12. package/js/Renderer/IRendererCache.js +75 -0
  13. package/js/Renderer/RendererCache.js +26 -63
  14. package/js/Renderer/RendererManager.js +259 -38
  15. package/js/Renderer/WebCodecsRenderer/index.js +109 -0
  16. package/js/Renderer/WebCodecsRendererCache.js +115 -0
  17. package/js/Renderer/WebGLRenderer/index.js +115 -67
  18. package/js/Renderer/YUVCanvasRenderer/index.js +5 -3
  19. package/js/Renderer/index.js +0 -1
  20. package/js/Types.js +51 -1
  21. package/js/Utils.js +47 -7
  22. package/package.json +28 -11
  23. package/scripts/checkElectron.js +4 -2
  24. package/scripts/download.js +102 -0
  25. package/scripts/downloadPrebuild.js +2 -1
  26. package/scripts/synclib.js +2 -2
  27. package/ts/Decoder/gpu-utils.ts +92 -0
  28. package/ts/Decoder/index.ts +206 -0
  29. package/ts/Private/AgoraBase.ts +18 -4
  30. package/ts/Private/IAgoraRtcEngine.ts +6 -7
  31. package/ts/Private/IAgoraRtcEngineEx.ts +2 -1
  32. package/ts/Private/extension/AgoraBaseExtension.ts +14 -1
  33. package/ts/Private/internal/IrisApiEngine.ts +21 -7
  34. package/ts/Private/internal/RtcEngineExInternal.ts +27 -8
  35. package/ts/Private/ipc/main.ts +22 -0
  36. package/ts/Private/ipc/renderer.ts +21 -0
  37. package/ts/Renderer/CapabilityManager.ts +126 -0
  38. package/ts/Renderer/IRenderer.ts +52 -17
  39. package/ts/Renderer/IRendererCache.ts +96 -0
  40. package/ts/Renderer/RendererCache.ts +42 -85
  41. package/ts/Renderer/RendererManager.ts +342 -52
  42. package/ts/Renderer/WebCodecsRenderer/index.ts +145 -0
  43. package/ts/Renderer/WebCodecsRendererCache.ts +137 -0
  44. package/ts/Renderer/WebGLRenderer/index.ts +153 -107
  45. package/ts/Renderer/YUVCanvasRenderer/index.ts +24 -22
  46. package/ts/Renderer/index.ts +0 -1
  47. package/ts/Types.ts +130 -7
  48. package/ts/Utils.ts +53 -7
  49. package/types/Decoder/gpu-utils.d.ts +21 -0
  50. package/types/Decoder/gpu-utils.d.ts.map +1 -0
  51. package/types/Decoder/index.d.ts +26 -0
  52. package/types/Decoder/index.d.ts.map +1 -0
  53. package/types/Private/AgoraBase.d.ts +18 -4
  54. package/types/Private/AgoraBase.d.ts.map +1 -1
  55. package/types/Private/IAgoraRtcEngine.d.ts +6 -7
  56. package/types/Private/IAgoraRtcEngine.d.ts.map +1 -1
  57. package/types/Private/IAgoraRtcEngineEx.d.ts +2 -1
  58. package/types/Private/IAgoraRtcEngineEx.d.ts.map +1 -1
  59. package/types/Private/extension/AgoraBaseExtension.d.ts +13 -1
  60. package/types/Private/extension/AgoraBaseExtension.d.ts.map +1 -1
  61. package/types/Private/internal/IrisApiEngine.d.ts +2 -0
  62. package/types/Private/internal/IrisApiEngine.d.ts.map +1 -1
  63. package/types/Private/internal/RtcEngineExInternal.d.ts +2 -0
  64. package/types/Private/internal/RtcEngineExInternal.d.ts.map +1 -1
  65. package/types/Private/ipc/main.d.ts +2 -0
  66. package/types/Private/ipc/main.d.ts.map +1 -0
  67. package/types/Private/ipc/renderer.d.ts +3 -0
  68. package/types/Private/ipc/renderer.d.ts.map +1 -0
  69. package/types/Renderer/CapabilityManager.d.ts +20 -0
  70. package/types/Renderer/CapabilityManager.d.ts.map +1 -0
  71. package/types/Renderer/IRenderer.d.ts +8 -7
  72. package/types/Renderer/IRenderer.d.ts.map +1 -1
  73. package/types/Renderer/IRendererCache.d.ts +26 -0
  74. package/types/Renderer/IRendererCache.d.ts.map +1 -0
  75. package/types/Renderer/RendererCache.d.ts +6 -18
  76. package/types/Renderer/RendererCache.d.ts.map +1 -1
  77. package/types/Renderer/RendererManager.d.ts +49 -15
  78. package/types/Renderer/RendererManager.d.ts.map +1 -1
  79. package/types/Renderer/WebCodecsRenderer/index.d.ts +14 -0
  80. package/types/Renderer/WebCodecsRenderer/index.d.ts.map +1 -0
  81. package/types/Renderer/WebCodecsRendererCache.d.ts +15 -0
  82. package/types/Renderer/WebCodecsRendererCache.d.ts.map +1 -0
  83. package/types/Renderer/WebGLRenderer/index.d.ts +5 -3
  84. package/types/Renderer/WebGLRenderer/index.d.ts.map +1 -1
  85. package/types/Renderer/YUVCanvasRenderer/index.d.ts +1 -1
  86. package/types/Renderer/YUVCanvasRenderer/index.d.ts.map +1 -1
  87. package/types/Renderer/index.d.ts +0 -1
  88. package/types/Renderer/index.d.ts.map +1 -1
  89. package/types/Types.d.ts +99 -8
  90. package/types/Types.d.ts.map +1 -1
  91. package/types/Utils.d.ts +4 -0
  92. package/types/Utils.d.ts.map +1 -1
  93. package/js/Renderer/IRendererManager.js +0 -229
  94. package/scripts/publishCN/common.sh +0 -19
  95. package/scripts/publishCN/rewrite-dep.sh +0 -22
  96. package/scripts/publishCN/rewrite-example.sh +0 -22
  97. package/ts/Renderer/IRendererManager.ts +0 -316
  98. package/types/Renderer/IRendererManager.d.ts +0 -56
  99. package/types/Renderer/IRendererManager.d.ts.map +0 -1
@@ -1,41 +1,51 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WebGLRenderer = void 0;
4
+ const Types_1 = require("../../Types");
4
5
  const Utils_1 = require("../../Utils");
5
6
  const IRenderer_1 = require("../IRenderer");
6
7
  const createProgramFromSources = require('./webgl-utils').createProgramFromSources;
7
- const vertexShaderSource = 'attribute vec2 a_position;' +
8
- 'attribute vec2 a_texCoord;' +
9
- 'uniform vec2 u_resolution;' +
10
- 'varying vec2 v_texCoord;' +
11
- 'void main() {' +
12
- 'vec2 zeroToOne = a_position / u_resolution;' +
13
- ' vec2 zeroToTwo = zeroToOne * 2.0;' +
14
- ' vec2 clipSpace = zeroToTwo - 1.0;' +
15
- ' gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' +
16
- 'v_texCoord = a_texCoord;' +
17
- '}';
18
- const yuvShaderSource = 'precision mediump float;' +
19
- 'uniform sampler2D Ytex;' +
20
- 'uniform sampler2D Utex;' +
21
- 'uniform sampler2D Vtex;' +
22
- 'varying vec2 v_texCoord;' +
23
- 'void main(void) {' +
24
- ' float nx,ny,r,g,b,y,u,v;' +
25
- ' mediump vec4 txl,ux,vx;' +
26
- ' nx=v_texCoord[0];' +
27
- ' ny=v_texCoord[1];' +
28
- ' y=texture2D(Ytex,vec2(nx,ny)).r;' +
29
- ' u=texture2D(Utex,vec2(nx,ny)).r;' +
30
- ' v=texture2D(Vtex,vec2(nx,ny)).r;' +
31
- ' y=1.1643*(y-0.0625);' +
32
- ' u=u-0.5;' +
33
- ' v=v-0.5;' +
34
- ' r=y+1.5958*v;' +
35
- ' g=y-0.39173*u-0.81290*v;' +
36
- ' b=y+2.017*u;' +
37
- ' gl_FragColor=vec4(r,g,b,1.0);' +
38
- '}';
8
+ const vertexShaderSource = `
9
+ attribute vec2 a_position;
10
+ attribute vec2 a_texCoord;
11
+ uniform vec2 u_resolution;
12
+ varying vec2 v_texCoord;
13
+ void main() {
14
+ vec2 zeroToOne = a_position / u_resolution;
15
+ vec2 zeroToTwo = zeroToOne * 2.0;
16
+ vec2 clipSpace = zeroToTwo - 1.0;
17
+ gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
18
+ v_texCoord = a_texCoord;
19
+ }`;
20
+ const yuvShaderSource = `
21
+ precision mediump float;
22
+ uniform sampler2D Ytex;
23
+ uniform sampler2D Utex;
24
+ uniform sampler2D Vtex;
25
+ uniform sampler2D Atex;
26
+ uniform bool hasAlpha;
27
+ varying vec2 v_texCoord;
28
+ void main(void) {
29
+ float nx,ny,r,g,b,y,u,v,a;
30
+ mediump vec4 txl,ux,vx;
31
+ nx=v_texCoord[0];
32
+ ny=v_texCoord[1];
33
+ y=texture2D(Ytex,vec2(nx,ny)).r;
34
+ u=texture2D(Utex,vec2(nx,ny)).r;
35
+ v=texture2D(Vtex,vec2(nx,ny)).r;
36
+ if (hasAlpha) {
37
+ a=texture2D(Atex,vec2(nx,ny)).r;
38
+ } else {
39
+ a=1.0;
40
+ }
41
+ y=1.1643*(y-0.0625);
42
+ u=u-0.5;
43
+ v=v-0.5;
44
+ r=y+1.5958*v;
45
+ g=y-0.39173*u-0.81290*v;
46
+ b=y+2.017*u;
47
+ gl_FragColor=vec4(r,g,b,a);
48
+ }`;
39
49
  class WebGLRenderer extends IRenderer_1.IRenderer {
40
50
  constructor(fallback) {
41
51
  super();
@@ -56,10 +66,14 @@ class WebGLRenderer extends IRenderer_1.IRenderer {
56
66
  this.gl?.useProgram(this.program);
57
67
  this.initTextures();
58
68
  };
59
- this.gl = undefined;
69
+ this.gl = null;
70
+ this.rendererType = Types_1.RendererType.WEBGL;
71
+ this.program = null;
60
72
  this.yTexture = null;
61
73
  this.uTexture = null;
62
74
  this.vTexture = null;
75
+ this.aTexture = null;
76
+ this.hasAlpha = null;
63
77
  this.texCoordBuffer = null;
64
78
  this.surfaceBuffer = null;
65
79
  this.fallback = fallback;
@@ -74,10 +88,10 @@ class WebGLRenderer extends IRenderer_1.IRenderer {
74
88
  const context = this.canvas?.getContext(contextName, {
75
89
  depth: true,
76
90
  stencil: true,
77
- alpha: false,
91
+ alpha: true,
78
92
  antialias: false,
79
93
  premultipliedAlpha: true,
80
- preserveDrawingBuffer: true,
94
+ preserveDrawingBuffer: !Utils_1.AgoraEnv.encodeAlpha,
81
95
  powerPreference: 'default',
82
96
  failIfMajorPerformanceCaveat: false,
83
97
  });
@@ -93,11 +107,15 @@ class WebGLRenderer extends IRenderer_1.IRenderer {
93
107
  return;
94
108
  }
95
109
  // Set clear color to black, fully opaque
96
- this.gl.clearColor(0.0, 0.0, 0.0, 1.0);
110
+ this.gl.clearColor(0.0, 0.0, 0.0, 0.0);
97
111
  // Enable depth testing
98
112
  this.gl.enable(this.gl.DEPTH_TEST);
99
113
  // Near things obscure far things
100
114
  this.gl.depthFunc(this.gl.LEQUAL);
115
+ // Enable blending
116
+ this.gl.enable(this.gl.BLEND);
117
+ // Set blending function
118
+ this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);
101
119
  // Clear the color as well as the depth buffer.
102
120
  this.gl.clear(this.gl.COLOR_BUFFER_BIT |
103
121
  this.gl.DEPTH_BUFFER_BIT |
@@ -114,10 +132,10 @@ class WebGLRenderer extends IRenderer_1.IRenderer {
114
132
  this.canvas?.removeEventListener('webglcontextlost', this.handleContextLost, false);
115
133
  this.canvas?.removeEventListener('webglcontextrestored', this.handleContextRestored, false);
116
134
  this.releaseTextures();
117
- this.gl = undefined;
135
+ this.gl = null;
118
136
  super.unbind();
119
137
  }
120
- drawFrame({ width, height, yStride, uStride, vStride, yBuffer, uBuffer, vBuffer, rotation, }) {
138
+ drawFrame({ width, height, yStride, uStride, vStride, yBuffer, uBuffer, vBuffer, rotation, alphaBuffer, }) {
121
139
  this.rotateCanvas({ width, height, rotation });
122
140
  this.updateRenderMode();
123
141
  if (!this.gl || !this.program)
@@ -143,23 +161,56 @@ class WebGLRenderer extends IRenderer_1.IRenderer {
143
161
  this.gl.enableVertexAttribArray(this.texCoordLocation);
144
162
  this.gl.vertexAttribPointer(this.texCoordLocation, 2, this.gl.FLOAT, false, 0, 0);
145
163
  this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, 1);
146
- this.gl.activeTexture(this.gl.TEXTURE0);
147
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.yTexture);
148
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.LUMINANCE,
149
- // Should use xWidth instead of width here (yStide)
150
- xWidth, height, 0, this.gl.LUMINANCE, this.gl.UNSIGNED_BYTE, yBuffer);
151
- this.gl.activeTexture(this.gl.TEXTURE1);
152
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.uTexture);
153
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.LUMINANCE, uStride, height / 2, 0, this.gl.LUMINANCE, this.gl.UNSIGNED_BYTE, uBuffer);
154
- this.gl.activeTexture(this.gl.TEXTURE2);
155
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.vTexture);
156
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.LUMINANCE, vStride, height / 2, 0, this.gl.LUMINANCE, this.gl.UNSIGNED_BYTE, vBuffer);
164
+ const activeTexture = (textureIndex, { texture, stride, height, pixels }) => {
165
+ if (!this.gl)
166
+ return;
167
+ this.gl.activeTexture(textureIndex);
168
+ this.gl.bindTexture(this.gl.TEXTURE_2D, texture);
169
+ this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.LUMINANCE, stride, height, 0, this.gl.LUMINANCE, this.gl.UNSIGNED_BYTE, pixels);
170
+ };
171
+ const textures = {
172
+ [this.gl.TEXTURE0]: {
173
+ texture: this.yTexture,
174
+ stride: yStride,
175
+ height: height,
176
+ pixels: yBuffer,
177
+ },
178
+ [this.gl.TEXTURE1]: {
179
+ texture: this.uTexture,
180
+ stride: uStride,
181
+ height: height / 2,
182
+ pixels: uBuffer,
183
+ },
184
+ [this.gl.TEXTURE2]: {
185
+ texture: this.vTexture,
186
+ stride: vStride,
187
+ height: height / 2,
188
+ pixels: vBuffer,
189
+ },
190
+ };
191
+ if (alphaBuffer) {
192
+ textures[this.gl.TEXTURE3] = {
193
+ texture: this.aTexture,
194
+ stride: width,
195
+ height: height,
196
+ pixels: alphaBuffer,
197
+ };
198
+ this.gl.uniform1i(this.hasAlpha, 1);
199
+ }
200
+ else {
201
+ this.gl.uniform1i(this.hasAlpha, 0);
202
+ }
203
+ for (const textureIndex in textures) {
204
+ if (textures.hasOwnProperty(textureIndex)) {
205
+ activeTexture(+textureIndex, textures[textureIndex]);
206
+ }
207
+ }
157
208
  this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);
158
209
  super.drawFrame();
159
210
  }
160
211
  rotateCanvas({ width, height, rotation }) {
161
212
  super.rotateCanvas({ width, height, rotation });
162
- if (!this.gl)
213
+ if (!this.gl || !this.program)
163
214
  return;
164
215
  this.gl.viewport(0, 0, width, height);
165
216
  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.surfaceBuffer);
@@ -216,39 +267,36 @@ class WebGLRenderer extends IRenderer_1.IRenderer {
216
267
  this.gl.uniform2f(resolutionLocation, width, height);
217
268
  }
218
269
  initTextures() {
219
- if (!this.gl)
270
+ if (!this.gl || !this.program)
220
271
  return;
221
272
  this.positionLocation = this.gl.getAttribLocation(this.program, 'a_position');
222
273
  this.texCoordLocation = this.gl.getAttribLocation(this.program, 'a_texCoord');
274
+ this.hasAlpha = this.gl.getUniformLocation(this.program, 'hasAlpha');
223
275
  this.surfaceBuffer = this.gl.createBuffer();
224
276
  this.texCoordBuffer = this.gl.createBuffer();
225
- const createTexture = (textureIndex) => {
226
- if (!this.gl)
277
+ const createTexture = (texture, textureIndex, textureName) => {
278
+ if (!this.gl || !this.program)
227
279
  return null;
228
280
  // Create a texture.
229
- this.gl.activeTexture(textureIndex);
230
- const texture = this.gl.createTexture();
231
- this.gl.bindTexture(this.gl.TEXTURE_2D, texture);
281
+ this.gl.activeTexture(texture);
282
+ const textureObj = this.gl.createTexture();
283
+ this.gl.bindTexture(this.gl.TEXTURE_2D, textureObj);
232
284
  // Set the parameters so we can render any size
233
285
  this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
234
286
  this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
235
287
  this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.NEAREST);
236
288
  this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.NEAREST);
237
- return texture;
289
+ this.gl.uniform1i(this.gl.getUniformLocation(this.program, textureName), textureIndex); /* Bind Ytex to texture unit index */
290
+ return textureObj;
238
291
  };
239
- this.yTexture = createTexture(this.gl.TEXTURE0);
240
- this.uTexture = createTexture(this.gl.TEXTURE1);
241
- this.vTexture = createTexture(this.gl.TEXTURE2);
242
- const y = this.gl.getUniformLocation(this.program, 'Ytex');
243
- this.gl.uniform1i(y, 0); /* Bind Ytex to texture unit 0 */
244
- const u = this.gl.getUniformLocation(this.program, 'Utex');
245
- this.gl.uniform1i(u, 1); /* Bind Utex to texture unit 1 */
246
- const v = this.gl.getUniformLocation(this.program, 'Vtex');
247
- this.gl.uniform1i(v, 2); /* Bind Vtex to texture unit 2 */
292
+ this.yTexture = createTexture(this.gl.TEXTURE0, 0, 'Ytex');
293
+ this.uTexture = createTexture(this.gl.TEXTURE1, 1, 'Utex');
294
+ this.vTexture = createTexture(this.gl.TEXTURE2, 2, 'Vtex');
295
+ this.aTexture = createTexture(this.gl.TEXTURE3, 3, 'Atex');
248
296
  }
249
297
  releaseTextures() {
250
298
  this.gl?.deleteProgram(this.program);
251
- this.program = undefined;
299
+ this.program = null;
252
300
  this.positionLocation = undefined;
253
301
  this.texCoordLocation = undefined;
254
302
  this.gl?.deleteTexture(this.yTexture);
@@ -11,12 +11,12 @@ class YUVCanvasRenderer extends IRenderer_1.IRenderer {
11
11
  webGL: false,
12
12
  });
13
13
  }
14
- drawFrame({ width, height, yStride, uStride, vStride, yBuffer, uBuffer, vBuffer, rotation, }) {
14
+ drawFrame({ width, height, yStride, uStride, vStride, yBuffer, uBuffer, vBuffer, rotation, alphaBuffer, }) {
15
15
  this.rotateCanvas({ width, height, rotation });
16
16
  this.updateRenderMode();
17
17
  if (!this.frameSink)
18
18
  return;
19
- this.frameSink.drawFrame(YUVBuffer.frame(YUVBuffer.format({
19
+ const frame = YUVBuffer.frame(YUVBuffer.format({
20
20
  width,
21
21
  height,
22
22
  chromaWidth: width / 2,
@@ -31,7 +31,9 @@ class YUVCanvasRenderer extends IRenderer_1.IRenderer {
31
31
  }, {
32
32
  bytes: vBuffer,
33
33
  stride: vStride,
34
- }));
34
+ });
35
+ frame.a = alphaBuffer;
36
+ this.frameSink.drawFrame(frame);
35
37
  super.drawFrame();
36
38
  }
37
39
  rotateCanvas({ width, height, rotation }) {
@@ -15,4 +15,3 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./IRenderer"), exports);
18
- __exportStar(require("./IRendererManager"), exports);
package/js/Types.js CHANGED
@@ -1,6 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RendererType = void 0;
3
+ exports.codecMapping = exports.IPCMessageType = exports.RendererType = exports.VideoFallbackStrategy = void 0;
4
+ const AgoraBase_1 = require("./Private/AgoraBase");
5
+ /**
6
+ * @ignore
7
+ */
8
+ var VideoFallbackStrategy;
9
+ (function (VideoFallbackStrategy) {
10
+ /**
11
+ * @ignore
12
+ */
13
+ VideoFallbackStrategy[VideoFallbackStrategy["PerformancePriority"] = 0] = "PerformancePriority";
14
+ /**
15
+ * @ignore
16
+ */
17
+ VideoFallbackStrategy[VideoFallbackStrategy["BandwidthPriority"] = 1] = "BandwidthPriority";
18
+ })(VideoFallbackStrategy = exports.VideoFallbackStrategy || (exports.VideoFallbackStrategy = {}));
4
19
  /**
5
20
  * @ignore
6
21
  */
@@ -14,4 +29,39 @@ var RendererType;
14
29
  * @ignore
15
30
  */
16
31
  RendererType[RendererType["SOFTWARE"] = 2] = "SOFTWARE";
32
+ /**
33
+ * @ignore
34
+ */
35
+ RendererType[RendererType["WEBCODECSRENDERER"] = 3] = "WEBCODECSRENDERER";
17
36
  })(RendererType = exports.RendererType || (exports.RendererType = {}));
37
+ /**
38
+ * @ignore
39
+ */
40
+ var IPCMessageType;
41
+ (function (IPCMessageType) {
42
+ /**
43
+ * @ignore
44
+ */
45
+ IPCMessageType["AGORA_IPC_GET_GPU_INFO"] = "AGORA_IPC_GET_GPU_INFO";
46
+ })(IPCMessageType = exports.IPCMessageType || (exports.IPCMessageType = {}));
47
+ /**
48
+ * @ignore
49
+ */
50
+ exports.codecMapping = [
51
+ {
52
+ codec: 'avc1.64e01f',
53
+ type: AgoraBase_1.VideoCodecType.VideoCodecH264,
54
+ profile: 'h264',
55
+ },
56
+ {
57
+ codec: 'hvc1.1.6.L5.90',
58
+ type: AgoraBase_1.VideoCodecType.VideoCodecH265,
59
+ profile: 'hevc',
60
+ },
61
+ { codec: 'vp8', type: AgoraBase_1.VideoCodecType.VideoCodecVp8, profile: 'vp8' },
62
+ {
63
+ codec: 'vp09.00.50.08',
64
+ type: AgoraBase_1.VideoCodecType.VideoCodecVp9,
65
+ profile: 'vp9',
66
+ },
67
+ ];
package/js/Utils.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AgoraEnv = exports.isSupportWebGL = exports.classMix = exports.objsKeysToLowerCase = exports.logDebug = exports.logInfo = exports.logError = exports.logWarn = exports.parseIntPtr2Number = exports.DEBUG_TAG = exports.TAG = void 0;
3
+ exports.AgoraEnv = exports.getContextByCanvas = exports.isSupportWebGL = exports.classMix = exports.objsKeysToLowerCase = exports.logDebug = exports.logInfo = exports.logError = exports.logWarn = exports.parseIntPtr2Number = exports.DEBUG_TAG = exports.TAG = void 0;
4
+ const Types_1 = require("./Types");
4
5
  /**
5
6
  * @ignore
6
7
  */
@@ -45,6 +46,17 @@ const logError = (msg, ...optParams) => {
45
46
  console.error(`${exports.TAG} ${msg}`, ...optParams);
46
47
  };
47
48
  exports.logError = logError;
49
+ const getCurrentTime = () => {
50
+ const date = new Date();
51
+ const year = date.getFullYear().toString().slice(-2);
52
+ const month = (date.getMonth() + 1).toString().padStart(2, '0');
53
+ const day = date.getDate().toString().padStart(2, '0');
54
+ const hours = date.getHours().toString().padStart(2, '0');
55
+ const minutes = date.getMinutes().toString().padStart(2, '0');
56
+ const seconds = date.getSeconds().toString().padStart(2, '0');
57
+ const milliseconds = date.getMilliseconds().toString().padStart(3, '0');
58
+ return `${month}/${day}/${year} ${hours}:${minutes}:${seconds}:${milliseconds}`;
59
+ };
48
60
  /**
49
61
  * @ignore
50
62
  */
@@ -52,7 +64,7 @@ const logInfo = (msg, ...optParams) => {
52
64
  if (!exports.AgoraEnv.enableLogging) {
53
65
  return;
54
66
  }
55
- console.info(`${exports.TAG} ${msg}`, ...optParams);
67
+ console.info(`[${getCurrentTime()}]${exports.TAG} ${msg}`, ...optParams);
56
68
  };
57
69
  exports.logInfo = logInfo;
58
70
  /**
@@ -86,13 +98,13 @@ function classMix(...mixins) {
86
98
  class MixClass {
87
99
  constructor() {
88
100
  for (let mixin of mixins) {
89
- copyProperties(this, new mixin()); // 拷贝实例属性
101
+ copyProperties(this, new mixin()); // Copy instance properties
90
102
  }
91
103
  }
92
104
  }
93
105
  for (let mixin of mixins) {
94
- copyProperties(MixClass, mixin); // 拷贝静态属性
95
- copyProperties(MixClass.prototype, mixin.prototype); // 拷贝原型属性
106
+ copyProperties(MixClass, mixin); // Copy static properties
107
+ copyProperties(MixClass.prototype, mixin.prototype); // Copy prototype properties
96
108
  }
97
109
  return MixClass;
98
110
  }
@@ -135,7 +147,32 @@ function isSupportWebGL() {
135
147
  return flag;
136
148
  }
137
149
  exports.isSupportWebGL = isSupportWebGL;
138
- const AgoraNode = require('../build/Release/agora_node_ext');
150
+ /**
151
+ * @ignore
152
+ */
153
+ function getContextByCanvas(
154
+ // eslint-disable-next-line auto-import/auto-import
155
+ canvas) {
156
+ const contextNames = ['webgl2', 'webgl', 'experimental-webgl'];
157
+ for (const contextName of contextNames) {
158
+ //@ts-ignore
159
+ const context = canvas.getContext(contextName, {
160
+ depth: true,
161
+ stencil: true,
162
+ alpha: false,
163
+ antialias: false,
164
+ premultipliedAlpha: true,
165
+ preserveDrawingBuffer: true,
166
+ powerPreference: 'default',
167
+ failIfMajorPerformanceCaveat: false,
168
+ });
169
+ if (context) {
170
+ return context;
171
+ }
172
+ }
173
+ return null;
174
+ }
175
+ exports.getContextByCanvas = getContextByCanvas;
139
176
  /**
140
177
  * @ignore
141
178
  */
@@ -143,5 +180,8 @@ exports.AgoraEnv = {
143
180
  enableLogging: true,
144
181
  enableDebugLogging: false,
145
182
  webEnvReady: true,
146
- AgoraElectronBridge: new AgoraNode.AgoraElectronBridge(),
183
+ enableWebCodecsDecoder: false,
184
+ encodeAlpha: false,
185
+ videoFallbackStrategy: Types_1.VideoFallbackStrategy.PerformancePriority,
186
+ maxDecodeRetryCount: 50,
147
187
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agora-electron-sdk",
3
- "version": "4.5.1",
3
+ "version": "4.5.2-dev.2",
4
4
  "description": "agora-electron-sdk",
5
5
  "main": "js/AgoraSdk",
6
6
  "types": "types/AgoraSdk.d.ts",
@@ -11,6 +11,8 @@
11
11
  "types",
12
12
  "scripts",
13
13
  "!scripts/terra",
14
+ "!scripts/publishCN",
15
+ "!scripts/internal",
14
16
  "gulpfile.js",
15
17
  "CHANGELOG.md",
16
18
  "!**/__tests__"
@@ -64,6 +66,8 @@
64
66
  "@commitlint/config-conventional": "^17.0.2",
65
67
  "@evilmartians/lefthook": "^1.2.2",
66
68
  "@release-it/conventional-changelog": "^5.0.0",
69
+ "@types/dom-webcodecs": "^0.1.11",
70
+ "@types/node": "^22.8.2",
67
71
  "@types/jest": "^28.1.2",
68
72
  "@types/json-bigint": "^1.0.1",
69
73
  "@types/lodash.isequal": "^4.5.6",
@@ -127,24 +131,37 @@
127
131
  "dependencies": {
128
132
  "buffer": "^6.0.3",
129
133
  "cross-env": "^7.0.3",
130
- "download": "^8.0.0",
134
+ "node-fetch": "^2.7.0",
135
+ "extract-zip": "^2.0.1",
131
136
  "eventemitter3": "^5.0.1",
132
137
  "fs-extra": "^11.1.1",
133
- "gulp": "^4.0.2",
138
+ "gulp": "^5.0.0",
134
139
  "json-bigint": "^1.0.0",
135
140
  "jsonfile": "^6.1.0",
136
141
  "lodash.isequal": "^4.5.0",
137
- "minimist": "^1.2.5",
138
- "shelljs": "^0.8.4",
142
+ "minimist": "^1.2.8",
143
+ "shelljs": "^0.8.5",
144
+ "semver": "^7.6.0",
139
145
  "ts-interface-checker": "^1.0.2",
140
- "winston": "^3.3.3",
146
+ "winston": "^3.11.0",
141
147
  "yuv-buffer": "1.0.0",
142
- "yuv-canvas": "1.2.6"
148
+ "yuv-canvas": "1.2.6",
149
+ "archive-type": "^4.0.0",
150
+ "content-disposition": "^0.5.2",
151
+ "decompress": "^4.2.1",
152
+ "ext-name": "^5.0.0",
153
+ "file-type": "^11.1.0",
154
+ "filenamify": "^3.0.0",
155
+ "get-stream": "^4.1.0",
156
+ "got": "^11.8.5",
157
+ "make-dir": "^4.0.0",
158
+ "p-event": "^2.1.0",
159
+ "pify": "^4.0.1"
143
160
  },
144
161
  "agora_electron": {
145
- "iris_sdk_win": "https://download.agora.io/sdk/release/iris_4.5.0-build.2_DCG_Windows_Video_Standalone_20241230_0238_587.zip",
146
- "iris_sdk_mac": "https://download.agora.io/sdk/release/iris_4.5.0-build.2_DCG_Mac_Video_Standalone_20241230_0238_546.zip",
147
- "native_sdk_win": "https://download.agora.io/sdk/release/Agora_Native_SDK_for_Windows_v4.5.0_FULL.zip",
148
- "native_sdk_mac": "https://download.agora.io/sdk/release/Agora_Native_SDK_for_Mac_v4.5.0_FULL.zip"
162
+ "iris_sdk_win": "https://download.agora.io/sdk/release/iris_4.5.1-build.1_DCG_Windows_Video_Standalone_20250305_1103_622.zip",
163
+ "iris_sdk_mac": "https://download.agora.io/sdk/release/iris_4.5.1-build.1_DCG_Mac_Video_Standalone_20250305_1105_590.zip",
164
+ "native_sdk_win": "https://download.agora.io/sdk/release/Agora_Native_SDK_for_Windows_v4.5.1_FULL.zip",
165
+ "native_sdk_mac": "https://download.agora.io/sdk/release/Agora_Native_SDK_for_Mac_v4.5.1_FULL.zip"
149
166
  }
150
167
  }
@@ -1,8 +1,8 @@
1
1
  const path = require('path');
2
2
 
3
- const download = require('download');
4
-
5
3
  const { cleanDir } = require('./clean');
4
+ const download = require('./download');
5
+
6
6
  const getConfig = require('./getConfig');
7
7
  const logger = require('./logger');
8
8
 
@@ -30,9 +30,11 @@ const checkElectron = async (cb) => {
30
30
  let downloadUrl = `https://download.agora.io/sdk/release/electron-v${electron_version}-${platform}-${arch}.zip`;
31
31
  logger.info(`Downloading:${downloadUrl}`);
32
32
  await cleanDir(tp);
33
+
33
34
  await download(downloadUrl, tp, {
34
35
  extract: true,
35
36
  });
37
+
36
38
  logger.info(`Finish download:${downloadUrl}`);
37
39
  logger.info(`sync electron success`);
38
40
  cb();
@@ -0,0 +1,102 @@
1
+ 'use strict';
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ const { URL } = require('url');
5
+
6
+ const archiveType = require('archive-type');
7
+ const contentDisposition = require('content-disposition');
8
+ const decompress = require('decompress');
9
+ const extName = require('ext-name');
10
+ const fileType = require('file-type');
11
+ const filenamify = require('filenamify');
12
+ const getStream = require('get-stream');
13
+ const got = require('got');
14
+ const makeDir = require('make-dir');
15
+ const pEvent = require('p-event');
16
+ const pify = require('pify');
17
+
18
+ const fsP = pify(fs);
19
+ const filenameFromPath = (res) =>
20
+ path.basename(new URL(res.requestUrl).pathname);
21
+
22
+ const getExtFromMime = (res) => {
23
+ const header = res.headers['content-type'];
24
+
25
+ if (!header) {
26
+ return null;
27
+ }
28
+
29
+ const exts = extName.mime(header);
30
+
31
+ if (exts.length !== 1) {
32
+ return null;
33
+ }
34
+
35
+ return exts[0].ext;
36
+ };
37
+
38
+ const getFilename = (res, data) => {
39
+ const header = res.headers['content-disposition'];
40
+
41
+ if (header) {
42
+ const parsed = contentDisposition.parse(header);
43
+
44
+ if (parsed.parameters && parsed.parameters.filename) {
45
+ return parsed.parameters.filename;
46
+ }
47
+ }
48
+
49
+ let filename = filenameFromPath(res);
50
+
51
+ if (!path.extname(filename)) {
52
+ const ext = (fileType(data) || {}).ext || getExtFromMime(res);
53
+
54
+ if (ext) {
55
+ filename = `${filename}.${ext}`;
56
+ }
57
+ }
58
+
59
+ return filename;
60
+ };
61
+
62
+ module.exports = (uri, output, opts) => {
63
+ opts = {
64
+ ...opts,
65
+ encoding: null,
66
+ responseType: 'buffer',
67
+ rejectUnauthorized: process.env.npm_config_strict_ssl !== 'false',
68
+ };
69
+
70
+ const stream = got.stream(uri);
71
+
72
+ const promise = pEvent(stream, 'response')
73
+ .then((res) => {
74
+ const encoding = opts.encoding === null ? 'buffer' : opts.encoding;
75
+ return Promise.all([getStream(stream, { encoding }), res]);
76
+ })
77
+ .then((result) => {
78
+ const [data, res] = result;
79
+
80
+ if (!output) {
81
+ return opts.extract && archiveType(data)
82
+ ? decompress(data, opts)
83
+ : data;
84
+ }
85
+
86
+ const filename = opts.filename || filenamify(getFilename(res, data));
87
+ const outputFilepath = path.join(output, filename);
88
+
89
+ if (opts.extract && archiveType(data)) {
90
+ return decompress(data, path.dirname(outputFilepath), opts);
91
+ }
92
+
93
+ return makeDir(path.dirname(outputFilepath))
94
+ .then(() => fsP.writeFile(outputFilepath, data))
95
+ .then(() => data);
96
+ });
97
+
98
+ stream.then = promise.then.bind(promise);
99
+ stream.catch = promise.catch.bind(promise);
100
+
101
+ return stream;
102
+ };
@@ -1,9 +1,10 @@
1
1
  const path = require('path');
2
2
 
3
- const download = require('download');
4
3
  const fs = require('fs-extra');
5
4
 
6
5
  const { cleanDir, buildDir } = require('./clean');
6
+ const download = require('./download');
7
+
7
8
  const getConfig = require('./getConfig');
8
9
  const logger = require('./logger');
9
10
  const { getOS } = require('./util');