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.
- package/CHANGELOG.md +23 -0
- package/js/Decoder/gpu-utils.js +74 -0
- package/js/Decoder/index.js +172 -0
- package/js/Private/AgoraBase.js +15 -3
- package/js/Private/extension/AgoraBaseExtension.js +1 -0
- package/js/Private/internal/IrisApiEngine.js +20 -7
- package/js/Private/internal/RtcEngineExInternal.js +31 -16
- package/js/Private/ipc/main.js +21 -0
- package/js/Private/ipc/renderer.js +21 -0
- package/js/Renderer/CapabilityManager.js +99 -0
- package/js/Renderer/IRenderer.js +40 -11
- package/js/Renderer/IRendererCache.js +75 -0
- package/js/Renderer/RendererCache.js +26 -63
- package/js/Renderer/RendererManager.js +259 -38
- package/js/Renderer/WebCodecsRenderer/index.js +109 -0
- package/js/Renderer/WebCodecsRendererCache.js +115 -0
- package/js/Renderer/WebGLRenderer/index.js +115 -67
- package/js/Renderer/YUVCanvasRenderer/index.js +5 -3
- package/js/Renderer/index.js +0 -1
- package/js/Types.js +51 -1
- package/js/Utils.js +47 -7
- package/package.json +28 -11
- package/scripts/checkElectron.js +4 -2
- package/scripts/download.js +102 -0
- package/scripts/downloadPrebuild.js +2 -1
- package/scripts/synclib.js +2 -2
- package/ts/Decoder/gpu-utils.ts +92 -0
- package/ts/Decoder/index.ts +206 -0
- package/ts/Private/AgoraBase.ts +18 -4
- package/ts/Private/IAgoraRtcEngine.ts +6 -7
- package/ts/Private/IAgoraRtcEngineEx.ts +2 -1
- package/ts/Private/extension/AgoraBaseExtension.ts +14 -1
- package/ts/Private/internal/IrisApiEngine.ts +21 -7
- package/ts/Private/internal/RtcEngineExInternal.ts +27 -8
- package/ts/Private/ipc/main.ts +22 -0
- package/ts/Private/ipc/renderer.ts +21 -0
- package/ts/Renderer/CapabilityManager.ts +126 -0
- package/ts/Renderer/IRenderer.ts +52 -17
- package/ts/Renderer/IRendererCache.ts +96 -0
- package/ts/Renderer/RendererCache.ts +42 -85
- package/ts/Renderer/RendererManager.ts +342 -52
- package/ts/Renderer/WebCodecsRenderer/index.ts +145 -0
- package/ts/Renderer/WebCodecsRendererCache.ts +137 -0
- package/ts/Renderer/WebGLRenderer/index.ts +153 -107
- package/ts/Renderer/YUVCanvasRenderer/index.ts +24 -22
- package/ts/Renderer/index.ts +0 -1
- package/ts/Types.ts +130 -7
- package/ts/Utils.ts +53 -7
- package/types/Decoder/gpu-utils.d.ts +21 -0
- package/types/Decoder/gpu-utils.d.ts.map +1 -0
- package/types/Decoder/index.d.ts +26 -0
- package/types/Decoder/index.d.ts.map +1 -0
- package/types/Private/AgoraBase.d.ts +18 -4
- package/types/Private/AgoraBase.d.ts.map +1 -1
- package/types/Private/IAgoraRtcEngine.d.ts +6 -7
- package/types/Private/IAgoraRtcEngine.d.ts.map +1 -1
- package/types/Private/IAgoraRtcEngineEx.d.ts +2 -1
- package/types/Private/IAgoraRtcEngineEx.d.ts.map +1 -1
- package/types/Private/extension/AgoraBaseExtension.d.ts +13 -1
- package/types/Private/extension/AgoraBaseExtension.d.ts.map +1 -1
- package/types/Private/internal/IrisApiEngine.d.ts +2 -0
- package/types/Private/internal/IrisApiEngine.d.ts.map +1 -1
- package/types/Private/internal/RtcEngineExInternal.d.ts +2 -0
- package/types/Private/internal/RtcEngineExInternal.d.ts.map +1 -1
- package/types/Private/ipc/main.d.ts +2 -0
- package/types/Private/ipc/main.d.ts.map +1 -0
- package/types/Private/ipc/renderer.d.ts +3 -0
- package/types/Private/ipc/renderer.d.ts.map +1 -0
- package/types/Renderer/CapabilityManager.d.ts +20 -0
- package/types/Renderer/CapabilityManager.d.ts.map +1 -0
- package/types/Renderer/IRenderer.d.ts +8 -7
- package/types/Renderer/IRenderer.d.ts.map +1 -1
- package/types/Renderer/IRendererCache.d.ts +26 -0
- package/types/Renderer/IRendererCache.d.ts.map +1 -0
- package/types/Renderer/RendererCache.d.ts +6 -18
- package/types/Renderer/RendererCache.d.ts.map +1 -1
- package/types/Renderer/RendererManager.d.ts +49 -15
- package/types/Renderer/RendererManager.d.ts.map +1 -1
- package/types/Renderer/WebCodecsRenderer/index.d.ts +14 -0
- package/types/Renderer/WebCodecsRenderer/index.d.ts.map +1 -0
- package/types/Renderer/WebCodecsRendererCache.d.ts +15 -0
- package/types/Renderer/WebCodecsRendererCache.d.ts.map +1 -0
- package/types/Renderer/WebGLRenderer/index.d.ts +5 -3
- package/types/Renderer/WebGLRenderer/index.d.ts.map +1 -1
- package/types/Renderer/YUVCanvasRenderer/index.d.ts +1 -1
- package/types/Renderer/YUVCanvasRenderer/index.d.ts.map +1 -1
- package/types/Renderer/index.d.ts +0 -1
- package/types/Renderer/index.d.ts.map +1 -1
- package/types/Types.d.ts +99 -8
- package/types/Types.d.ts.map +1 -1
- package/types/Utils.d.ts +4 -0
- package/types/Utils.d.ts.map +1 -1
- package/js/Renderer/IRendererManager.js +0 -229
- package/scripts/publishCN/common.sh +0 -19
- package/scripts/publishCN/rewrite-dep.sh +0 -22
- package/scripts/publishCN/rewrite-example.sh +0 -22
- package/ts/Renderer/IRendererManager.ts +0 -316
- package/types/Renderer/IRendererManager.d.ts +0 -56
- 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 =
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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 =
|
|
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:
|
|
91
|
+
alpha: true,
|
|
78
92
|
antialias: false,
|
|
79
93
|
premultipliedAlpha: true,
|
|
80
|
-
preserveDrawingBuffer:
|
|
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,
|
|
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 =
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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(
|
|
230
|
-
const
|
|
231
|
-
this.gl.bindTexture(this.gl.TEXTURE_2D,
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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 }) {
|
package/js/Renderer/index.js
CHANGED
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(
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
"
|
|
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": "^
|
|
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.
|
|
138
|
-
"shelljs": "^0.8.
|
|
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.
|
|
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.
|
|
146
|
-
"iris_sdk_mac": "https://download.agora.io/sdk/release/iris_4.5.
|
|
147
|
-
"native_sdk_win": "https://download.agora.io/sdk/release/Agora_Native_SDK_for_Windows_v4.5.
|
|
148
|
-
"native_sdk_mac": "https://download.agora.io/sdk/release/Agora_Native_SDK_for_Mac_v4.5.
|
|
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
|
}
|
package/scripts/checkElectron.js
CHANGED
|
@@ -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');
|