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
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
+
## [4.5.2-dev.2](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.5.2-dev.1...v4.5.2-dev.2) (2025-03-14)
|
|
4
|
+
|
|
5
|
+
## [4.5.2-dev.1](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v0.0.0-dev.1...v4.5.2-dev.1) (2025-03-12)
|
|
6
|
+
|
|
7
|
+
# [0.0.0-dev.1](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.5.2...v0.0.0-dev.1) (2025-03-12)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* downlaod.js ([7e49fa6](https://github.com/AgoraIO-Extensions/Electron-SDK/commit/7e49fa659c11f219e3d333112c9ae515651ee8f4))
|
|
13
|
+
* remove pwd ([37e5d44](https://github.com/AgoraIO-Extensions/Electron-SDK/commit/37e5d446542a42509f87e571142da93082751df2))
|
|
14
|
+
* roll back example ([b0e7948](https://github.com/AgoraIO-Extensions/Electron-SDK/commit/b0e79486d51629228465ad81c0e66ee65d3f3bdb))
|
|
15
|
+
* update dependencies ([33cf7f6](https://github.com/AgoraIO-Extensions/Electron-SDK/commit/33cf7f683e437484c67a0835222f37bf324f0f0e))
|
|
16
|
+
|
|
17
|
+
## [4.5.2](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.5.1...v4.5.2) (2025-03-11)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
* support native 4.5.2 ([#1265](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1265)) ([bb9ed89](https://github.com/AgoraIO-Extensions/Electron-SDK/commit/bb9ed89234a4c732998a67cb2022032afcbcd06b)), closes [#1257](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1257) [#1261](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1261) [#1262](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1262) [#1269](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1269) [#1270](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1270) [#1273](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1273) [#1274](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1274)
|
|
23
|
+
|
|
24
|
+
## [4.5.1-build.1-rc.1](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.5.1...v4.5.1-build.1-rc.1) (2025-01-15)
|
|
25
|
+
|
|
3
26
|
## [4.5.1](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.5.0...v4.5.1) (2025-01-03)
|
|
4
27
|
|
|
5
28
|
# [4.5.0](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.4.0...v4.5.0) (2024-12-10)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getGpuInfoInternal = exports.GpuInfo = void 0;
|
|
4
|
+
//@ts-ignore
|
|
5
|
+
const electron_1 = require("electron");
|
|
6
|
+
/**
|
|
7
|
+
* @ignore
|
|
8
|
+
*/
|
|
9
|
+
class GpuInfo {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.videoDecodeAcceleratorSupportedProfile = [];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.GpuInfo = GpuInfo;
|
|
15
|
+
/**
|
|
16
|
+
* @ignore
|
|
17
|
+
*/
|
|
18
|
+
const getGpuInfoInternal = (callback) => {
|
|
19
|
+
//@ts-ignore
|
|
20
|
+
if (process.type === 'renderer') {
|
|
21
|
+
console.error('getGpuInfoInternal should be called in main process');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const gpuPage = new electron_1.BrowserWindow({
|
|
25
|
+
show: false,
|
|
26
|
+
webPreferences: { offscreen: true },
|
|
27
|
+
});
|
|
28
|
+
gpuPage.loadURL('chrome://gpu');
|
|
29
|
+
let executeJavaScriptText = `` +
|
|
30
|
+
`let videoAccelerationInfo = [];` +
|
|
31
|
+
`let nodeList = document.querySelector('info-view')?.shadowRoot?.querySelector('#video-acceleration-info info-view-table')?.shadowRoot?.querySelectorAll('#info-view-table info-view-table-row') || [];` +
|
|
32
|
+
`for (node of nodeList) {` +
|
|
33
|
+
` videoAccelerationInfo.push({` +
|
|
34
|
+
` title: node.shadowRoot.querySelector('#title')?.innerText,` +
|
|
35
|
+
` value: node.shadowRoot.querySelector('#value')?.innerText,` +
|
|
36
|
+
` })` +
|
|
37
|
+
`}` +
|
|
38
|
+
`JSON.stringify(videoAccelerationInfo)`;
|
|
39
|
+
gpuPage.webContents
|
|
40
|
+
.executeJavaScript(executeJavaScriptText)
|
|
41
|
+
.then((result) => {
|
|
42
|
+
if (!result) {
|
|
43
|
+
console.error('Failed to get GPU info, chrome://gpu is not available in this environment.');
|
|
44
|
+
}
|
|
45
|
+
let filterResult = JSON.parse(result).filter((item) => {
|
|
46
|
+
return item.title.indexOf('Decode') !== -1;
|
|
47
|
+
});
|
|
48
|
+
let convertResult = [];
|
|
49
|
+
const resolutionPattern = /(\d+)x(\d+) to (\d+)x(\d+)/;
|
|
50
|
+
for (const profile of filterResult) {
|
|
51
|
+
const match = profile.value.match(resolutionPattern);
|
|
52
|
+
if (!match) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const [_resolution, minWidth, minHeight, maxWidth, maxHeight] = match;
|
|
56
|
+
convertResult.push({
|
|
57
|
+
codec: profile.title,
|
|
58
|
+
minWidth: minWidth ? Number(minWidth) : 0,
|
|
59
|
+
maxWidth: maxWidth ? Number(maxWidth) : 0,
|
|
60
|
+
minHeight: minHeight ? Number(minHeight) : 0,
|
|
61
|
+
maxHeight: maxHeight ? Number(maxHeight) : 0,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
typeof callback === 'function' && callback(convertResult);
|
|
65
|
+
})
|
|
66
|
+
.catch((error) => {
|
|
67
|
+
console.error('Failed to get GPU info, please import agora-electron-sdk in main process', error);
|
|
68
|
+
typeof callback === 'function' && callback(error);
|
|
69
|
+
})
|
|
70
|
+
.finally(() => {
|
|
71
|
+
gpuPage.close();
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
exports.getGpuInfoInternal = getGpuInfoInternal;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebCodecsDecoder = void 0;
|
|
4
|
+
const AgoraBase_1 = require("../Private/AgoraBase");
|
|
5
|
+
const Types_1 = require("../Types");
|
|
6
|
+
const Utils_1 = require("../Utils");
|
|
7
|
+
const frameTypeMapping = {
|
|
8
|
+
[AgoraBase_1.VideoFrameType.VideoFrameTypeDeltaFrame]: 'delta',
|
|
9
|
+
[AgoraBase_1.VideoFrameType.VideoFrameTypeKeyFrame]: 'key',
|
|
10
|
+
[AgoraBase_1.VideoFrameType.VideoFrameTypeDroppableFrame]: 'delta', // this is a workaround for the issue that the frameType is not correct
|
|
11
|
+
};
|
|
12
|
+
class WebCodecsDecoder {
|
|
13
|
+
constructor(renders, onError, context) {
|
|
14
|
+
this.renderers = [];
|
|
15
|
+
// eslint-disable-next-line auto-import/auto-import
|
|
16
|
+
this.pendingFrame = null;
|
|
17
|
+
this._currentCodecConfig = null;
|
|
18
|
+
this._base_ts = 0;
|
|
19
|
+
this._base_ts_ntp = 1;
|
|
20
|
+
this._last_ts_ntp = 1;
|
|
21
|
+
this._decode_retry_count = 0;
|
|
22
|
+
this.renderers = renders;
|
|
23
|
+
this._cacheContext = context;
|
|
24
|
+
this._decoder = new VideoDecoder({
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
output: this._output.bind(this),
|
|
27
|
+
error: (e) => {
|
|
28
|
+
onError(e);
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// eslint-disable-next-line auto-import/auto-import
|
|
33
|
+
_output(frame) {
|
|
34
|
+
// Schedule the frame to be rendered.
|
|
35
|
+
this._renderFrame(frame);
|
|
36
|
+
}
|
|
37
|
+
// eslint-disable-next-line auto-import/auto-import
|
|
38
|
+
_renderFrame(frame) {
|
|
39
|
+
if (!this.pendingFrame) {
|
|
40
|
+
// Schedule rendering in the next animation frame.
|
|
41
|
+
// eslint-disable-next-line auto-import/auto-import
|
|
42
|
+
requestAnimationFrame(this.renderAnimationFrame.bind(this));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Close the current pending frame before replacing it.
|
|
46
|
+
this.pendingFrame.close();
|
|
47
|
+
}
|
|
48
|
+
// Set or replace the pending frame.
|
|
49
|
+
this.pendingFrame = frame;
|
|
50
|
+
}
|
|
51
|
+
renderAnimationFrame() {
|
|
52
|
+
for (let renderer of this.renderers) {
|
|
53
|
+
if (renderer.rendererType !== Types_1.RendererType.WEBCODECSRENDERER) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
renderer.drawFrame(this.pendingFrame, this._currentCodecConfig);
|
|
57
|
+
this.pendingFrame = null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
decoderConfigure(frameInfo) {
|
|
61
|
+
this.pendingFrame = null;
|
|
62
|
+
// @ts-ignore
|
|
63
|
+
let codec = Utils_1.AgoraEnv.CapabilityManager?.frameCodecMapping[frameInfo.codecType]
|
|
64
|
+
?.codec;
|
|
65
|
+
if (!codec) {
|
|
66
|
+
Utils_1.AgoraEnv.AgoraRendererManager?.handleWebCodecsFallback(this._cacheContext);
|
|
67
|
+
throw new Error(`codec ${frameInfo.codecType} is not in frameCodecMapping,failed to configure decoder, fallback to native decoder`);
|
|
68
|
+
}
|
|
69
|
+
this._currentCodecConfig = {
|
|
70
|
+
codecType: frameInfo.codecType,
|
|
71
|
+
codedWidth: frameInfo.width,
|
|
72
|
+
codedHeight: frameInfo.height,
|
|
73
|
+
rotation: frameInfo.rotation,
|
|
74
|
+
};
|
|
75
|
+
this._decoder.configure({
|
|
76
|
+
codec: codec,
|
|
77
|
+
codedWidth: frameInfo.width,
|
|
78
|
+
codedHeight: frameInfo.height,
|
|
79
|
+
});
|
|
80
|
+
(0, Utils_1.logInfo)(`configure decoder: codedWidth: ${frameInfo.width}, codedHeight: ${frameInfo.height},codec: ${codec}`);
|
|
81
|
+
}
|
|
82
|
+
updateTimestamps(ts) {
|
|
83
|
+
if (this._base_ts !== 0) {
|
|
84
|
+
if (ts > this._base_ts) {
|
|
85
|
+
this._last_ts_ntp =
|
|
86
|
+
this._base_ts_ntp + Math.floor(((ts - this._base_ts) * 1000) / 90);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this._base_ts = ts;
|
|
90
|
+
this._last_ts_ntp++;
|
|
91
|
+
this._base_ts_ntp = this._last_ts_ntp;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this._base_ts = ts;
|
|
96
|
+
this._last_ts_ntp = 1;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
handleCodecIsChanged(frameInfo) {
|
|
100
|
+
if (this._currentCodecConfig?.codecType !== frameInfo.codecType ||
|
|
101
|
+
this._currentCodecConfig?.codedWidth !== frameInfo.width ||
|
|
102
|
+
this._currentCodecConfig?.codedHeight !== frameInfo.height ||
|
|
103
|
+
this._currentCodecConfig?.rotation !== frameInfo.rotation) {
|
|
104
|
+
(0, Utils_1.logInfo)('frameInfo has changed, reconfigure decoder');
|
|
105
|
+
this._decoder.reset();
|
|
106
|
+
this.decoderConfigure(frameInfo);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// @ts-ignore
|
|
110
|
+
decodeFrame(imageBuffer, frameInfo, ts) {
|
|
111
|
+
try {
|
|
112
|
+
this.handleCodecIsChanged(frameInfo);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
(0, Utils_1.logInfo)(error);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (!imageBuffer) {
|
|
119
|
+
(0, Utils_1.logDebug)('imageBuffer is empty, skip decode frame');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
let frameType;
|
|
123
|
+
if (frameInfo.frameType !== undefined) {
|
|
124
|
+
// @ts-ignore
|
|
125
|
+
frameType = frameTypeMapping[frameInfo.frameType];
|
|
126
|
+
}
|
|
127
|
+
if (!frameType) {
|
|
128
|
+
(0, Utils_1.logDebug)('frameType is not in frameTypeMapping, skip decode frame');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this.updateTimestamps(ts);
|
|
132
|
+
try {
|
|
133
|
+
this._decoder.decode(new EncodedVideoChunk({
|
|
134
|
+
data: imageBuffer,
|
|
135
|
+
timestamp: this._last_ts_ntp,
|
|
136
|
+
// @ts-ignore
|
|
137
|
+
type: frameType,
|
|
138
|
+
// @ts-ignore
|
|
139
|
+
transfer: [imageBuffer.buffer],
|
|
140
|
+
}));
|
|
141
|
+
this._decode_retry_count = 0;
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
/// There are some cases that the decoder failed to decode the frame, we will retry for a few times
|
|
145
|
+
/// If the decoder still failed to decode the frame, we will fallback to native decoder
|
|
146
|
+
/// The retry count is defined in AgoraEnv.maxDecodeRetryCount
|
|
147
|
+
/// The retry count will be reset to 0 when the decoder successfully decode a frame
|
|
148
|
+
if (this._decode_retry_count >= Utils_1.AgoraEnv.maxDecodeRetryCount) {
|
|
149
|
+
Utils_1.AgoraEnv.AgoraRendererManager?.handleWebCodecsFallback(this._cacheContext);
|
|
150
|
+
throw new Error(`failed to decode frame over ${this._decode_retry_count} times, fallback to native decoder`);
|
|
151
|
+
}
|
|
152
|
+
this._decode_retry_count++;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
reset() {
|
|
156
|
+
this._base_ts = 0;
|
|
157
|
+
this._base_ts_ntp = 1;
|
|
158
|
+
this._last_ts_ntp = 1;
|
|
159
|
+
this._decoder.reset();
|
|
160
|
+
}
|
|
161
|
+
release() {
|
|
162
|
+
try {
|
|
163
|
+
if (this.pendingFrame) {
|
|
164
|
+
this.pendingFrame.close();
|
|
165
|
+
}
|
|
166
|
+
this._decoder.close();
|
|
167
|
+
}
|
|
168
|
+
catch (e) { }
|
|
169
|
+
this.pendingFrame = null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.WebCodecsDecoder = WebCodecsDecoder;
|
package/js/Private/AgoraBase.js
CHANGED
|
@@ -148,6 +148,10 @@ var WarnCodeType;
|
|
|
148
148
|
* @ignore
|
|
149
149
|
*/
|
|
150
150
|
WarnCodeType[WarnCodeType["WarnAdmImproperSettings"] = 1053] = "WarnAdmImproperSettings";
|
|
151
|
+
/**
|
|
152
|
+
* @ignore
|
|
153
|
+
*/
|
|
154
|
+
WarnCodeType[WarnCodeType["WarnAdmPopState"] = 1055] = "WarnAdmPopState";
|
|
151
155
|
/**
|
|
152
156
|
* @ignore
|
|
153
157
|
*/
|
|
@@ -1559,7 +1563,7 @@ var AudioProfileType;
|
|
|
1559
1563
|
*/
|
|
1560
1564
|
AudioProfileType[AudioProfileType["AudioProfileMusicHighQualityStereo"] = 5] = "AudioProfileMusicHighQualityStereo";
|
|
1561
1565
|
/**
|
|
1562
|
-
* 6: A sample rate of 16 kHz, audio encoding, mono, and Acoustic Echo Cancellation (
|
|
1566
|
+
* 6: A sample rate of 16 kHz, audio encoding, mono, and Acoustic Echo Cancellation (AEC) enabled.
|
|
1563
1567
|
*/
|
|
1564
1568
|
AudioProfileType[AudioProfileType["AudioProfileIot"] = 6] = "AudioProfileIot";
|
|
1565
1569
|
/**
|
|
@@ -1592,10 +1596,18 @@ var AudioScenarioType;
|
|
|
1592
1596
|
* 8: Meeting scenario that mainly contains the human voice.
|
|
1593
1597
|
*/
|
|
1594
1598
|
AudioScenarioType[AudioScenarioType["AudioScenarioMeeting"] = 8] = "AudioScenarioMeeting";
|
|
1599
|
+
/**
|
|
1600
|
+
* @ignore
|
|
1601
|
+
*/
|
|
1602
|
+
AudioScenarioType[AudioScenarioType["AudioScenarioAiServer"] = 9] = "AudioScenarioAiServer";
|
|
1603
|
+
/**
|
|
1604
|
+
* 10: AI conversation scenario, which is only applicable to scenarios where the user interacts with the conversational AI agent created by.
|
|
1605
|
+
*/
|
|
1606
|
+
AudioScenarioType[AudioScenarioType["AudioScenarioAiClient"] = 10] = "AudioScenarioAiClient";
|
|
1595
1607
|
/**
|
|
1596
1608
|
* The number of enumerations.
|
|
1597
1609
|
*/
|
|
1598
|
-
AudioScenarioType[AudioScenarioType["AudioScenarioNum"] =
|
|
1610
|
+
AudioScenarioType[AudioScenarioType["AudioScenarioNum"] = 11] = "AudioScenarioNum";
|
|
1599
1611
|
})(AudioScenarioType = exports.AudioScenarioType || (exports.AudioScenarioType = {}));
|
|
1600
1612
|
/**
|
|
1601
1613
|
* The format of the video frame.
|
|
@@ -1959,7 +1971,7 @@ var LocalVideoStreamReason;
|
|
|
1959
1971
|
*/
|
|
1960
1972
|
LocalVideoStreamReason[LocalVideoStreamReason["LocalVideoStreamReasonScreenCaptureResumed"] = 29] = "LocalVideoStreamReasonScreenCaptureResumed";
|
|
1961
1973
|
/**
|
|
1962
|
-
* 30: The displayer used for screen capture is disconnected.
|
|
1974
|
+
* 30: The displayer used for screen capture is disconnected. The current screen sharing has been paused. Prompt the user to restart the screen sharing.
|
|
1963
1975
|
*/
|
|
1964
1976
|
LocalVideoStreamReason[LocalVideoStreamReason["LocalVideoStreamReasonScreenCaptureDisplayDisconnected"] = 30] = "LocalVideoStreamReasonScreenCaptureDisplayDisconnected";
|
|
1965
1977
|
})(LocalVideoStreamReason = exports.LocalVideoStreamReason || (exports.LocalVideoStreamReason = {}));
|
|
@@ -3,10 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.emitEvent = exports.callIrisApi = exports.EVENT_PROCESSORS = exports.EVENT_TYPE = exports.isDebuggable = exports.setDebuggable = exports.DeviceEventEmitter = void 0;
|
|
6
|
+
exports.emitEvent = exports.callIrisApi = exports.EVENT_PROCESSORS = exports.EVENT_TYPE = exports.isDebuggable = exports.setDebuggable = exports.AgoraElectronBridge = exports.DeviceEventEmitter = void 0;
|
|
7
7
|
const eventemitter3_1 = __importDefault(require("eventemitter3"));
|
|
8
8
|
const json_bigint_1 = __importDefault(require("json-bigint"));
|
|
9
9
|
const JSON = (0, json_bigint_1.default)({ storeAsString: true });
|
|
10
|
+
const AgoraSdk_1 = __importDefault(require("../../AgoraSdk"));
|
|
10
11
|
const Utils_1 = require("../../Utils");
|
|
11
12
|
const AgoraBaseImpl_1 = require("../impl/AgoraBaseImpl");
|
|
12
13
|
const AgoraMediaBaseImpl_1 = require("../impl/AgoraMediaBaseImpl");
|
|
@@ -24,8 +25,9 @@ const MusicContentCenterInternal_1 = require("./MusicContentCenterInternal");
|
|
|
24
25
|
const RtcEngineExInternal_1 = require("./RtcEngineExInternal");
|
|
25
26
|
// @ts-ignore
|
|
26
27
|
exports.DeviceEventEmitter = new eventemitter3_1.default();
|
|
27
|
-
const
|
|
28
|
-
|
|
28
|
+
const AgoraNode = require('../../../build/Release/agora_node_ext');
|
|
29
|
+
exports.AgoraElectronBridge = new AgoraNode.AgoraElectronBridge();
|
|
30
|
+
exports.AgoraElectronBridge.OnEvent('call_back_with_buffer', (...params) => {
|
|
29
31
|
try {
|
|
30
32
|
handleEvent(...params);
|
|
31
33
|
}
|
|
@@ -285,6 +287,7 @@ function handleEvent(...[event, data, buffers]) {
|
|
|
285
287
|
function callIrisApi(funcName, params) {
|
|
286
288
|
try {
|
|
287
289
|
const buffers = [];
|
|
290
|
+
const rtcEngine = (0, AgoraSdk_1.default)();
|
|
288
291
|
if (funcName.startsWith('MediaEngine_')) {
|
|
289
292
|
switch (funcName) {
|
|
290
293
|
case 'MediaEngine_pushAudioFrame_c71f4ab':
|
|
@@ -329,11 +332,11 @@ function callIrisApi(funcName, params) {
|
|
|
329
332
|
else if (funcName.startsWith('RtcEngine_')) {
|
|
330
333
|
switch (funcName) {
|
|
331
334
|
case 'RtcEngine_initialize_0320339':
|
|
332
|
-
|
|
335
|
+
exports.AgoraElectronBridge.InitializeEnv();
|
|
333
336
|
break;
|
|
334
337
|
case 'RtcEngine_release':
|
|
335
|
-
|
|
336
|
-
|
|
338
|
+
exports.AgoraElectronBridge.CallApi(funcName, JSON.stringify(params), buffers, buffers.length);
|
|
339
|
+
exports.AgoraElectronBridge.ReleaseEnv();
|
|
337
340
|
return;
|
|
338
341
|
case 'RtcEngine_sendMetaData':
|
|
339
342
|
// metadata.buffer
|
|
@@ -359,7 +362,17 @@ function callIrisApi(funcName, params) {
|
|
|
359
362
|
break;
|
|
360
363
|
}
|
|
361
364
|
}
|
|
362
|
-
|
|
365
|
+
if (funcName.indexOf('joinChannel') != -1) {
|
|
366
|
+
if (Utils_1.AgoraEnv.CapabilityManager?.webCodecsDecoderEnabled) {
|
|
367
|
+
rtcEngine.getMediaEngine().registerVideoEncodedFrameObserver({});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
else if (funcName.indexOf('leaveChannel') != -1) {
|
|
371
|
+
if (Utils_1.AgoraEnv.CapabilityManager?.webCodecsDecoderEnabled) {
|
|
372
|
+
rtcEngine.getMediaEngine().unregisterVideoEncodedFrameObserver({});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
let { callApiReturnCode, callApiResult } = exports.AgoraElectronBridge.CallApi(funcName, JSON.stringify(params), buffers, buffers.length);
|
|
363
376
|
let ret = callApiResult;
|
|
364
377
|
if (ret !== undefined && ret !== null && ret !== '' && ret !== 'null') {
|
|
365
378
|
const retObj = JSON.parse(ret);
|
|
@@ -5,13 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.RtcEngineExInternal = void 0;
|
|
7
7
|
const ts_interface_checker_1 = require("ts-interface-checker");
|
|
8
|
+
const IrisApiEngine_1 = require("../../Private/internal/IrisApiEngine");
|
|
8
9
|
const Utils_1 = require("../../Utils");
|
|
9
10
|
let RendererManager;
|
|
10
|
-
|
|
11
|
+
let CapabilityManager;
|
|
12
|
+
//@ts-ignore
|
|
13
|
+
if (process.type === 'renderer') {
|
|
11
14
|
RendererManager = require('../../Renderer/RendererManager').RendererManager;
|
|
15
|
+
CapabilityManager =
|
|
16
|
+
require('../../Renderer/CapabilityManager').CapabilityManager;
|
|
12
17
|
}
|
|
13
18
|
else {
|
|
14
19
|
RendererManager = undefined;
|
|
20
|
+
CapabilityManager = undefined;
|
|
15
21
|
}
|
|
16
22
|
const AgoraBase_1 = require("../AgoraBase");
|
|
17
23
|
const AgoraMediaBase_1 = require("../AgoraMediaBase");
|
|
@@ -22,7 +28,7 @@ const AgoraMediaBase_ti_1 = __importDefault(require("../ti/AgoraMediaBase-ti"));
|
|
|
22
28
|
const IAgoraRtcEngine_ti_1 = __importDefault(require("../ti/IAgoraRtcEngine-ti"));
|
|
23
29
|
const AgoraH265TranscoderInternal_1 = require("./AgoraH265TranscoderInternal");
|
|
24
30
|
const AudioDeviceManagerInternal_1 = require("./AudioDeviceManagerInternal");
|
|
25
|
-
const
|
|
31
|
+
const IrisApiEngine_2 = require("./IrisApiEngine");
|
|
26
32
|
const LocalSpatialAudioEngineInternal_1 = require("./LocalSpatialAudioEngineInternal");
|
|
27
33
|
const MediaEngineInternal_1 = require("./MediaEngineInternal");
|
|
28
34
|
const MediaPlayerInternal_1 = require("./MediaPlayerInternal");
|
|
@@ -40,21 +46,24 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
|
|
|
40
46
|
this._h265_transcoder = new AgoraH265TranscoderInternal_1.H265TranscoderInternal();
|
|
41
47
|
}
|
|
42
48
|
initialize(context) {
|
|
49
|
+
const ret = super.initialize(context);
|
|
50
|
+
IrisApiEngine_2.callIrisApi.call(this, 'RtcEngine_setAppType', {
|
|
51
|
+
appType: 3,
|
|
52
|
+
});
|
|
43
53
|
if (Utils_1.AgoraEnv.webEnvReady) {
|
|
44
54
|
// @ts-ignore
|
|
45
55
|
window.AgoraEnv = Utils_1.AgoraEnv;
|
|
46
56
|
if (Utils_1.AgoraEnv.AgoraRendererManager === undefined && RendererManager) {
|
|
47
57
|
Utils_1.AgoraEnv.AgoraRendererManager = new RendererManager();
|
|
48
58
|
}
|
|
59
|
+
if (Utils_1.AgoraEnv.CapabilityManager === undefined && CapabilityManager) {
|
|
60
|
+
Utils_1.AgoraEnv.CapabilityManager = new CapabilityManager();
|
|
61
|
+
}
|
|
49
62
|
}
|
|
50
|
-
const ret = super.initialize(context);
|
|
51
|
-
IrisApiEngine_1.callIrisApi.call(this, 'RtcEngine_setAppType', {
|
|
52
|
-
appType: 3,
|
|
53
|
-
});
|
|
54
63
|
return ret;
|
|
55
64
|
}
|
|
56
65
|
release(sync = false) {
|
|
57
|
-
|
|
66
|
+
IrisApiEngine_1.AgoraElectronBridge.ReleaseRenderer();
|
|
58
67
|
Utils_1.AgoraEnv.AgoraRendererManager?.release();
|
|
59
68
|
Utils_1.AgoraEnv.AgoraRendererManager = undefined;
|
|
60
69
|
this._media_engine.release();
|
|
@@ -74,6 +83,8 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
|
|
|
74
83
|
MediaRecorderInternal_1.MediaRecorderInternal._observers.clear();
|
|
75
84
|
this._h265_transcoder.release();
|
|
76
85
|
this.removeAllListeners();
|
|
86
|
+
Utils_1.AgoraEnv.CapabilityManager?.release();
|
|
87
|
+
Utils_1.AgoraEnv.CapabilityManager = undefined;
|
|
77
88
|
super.release(sync);
|
|
78
89
|
}
|
|
79
90
|
_addListenerPreCheck(eventType) {
|
|
@@ -118,7 +129,7 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
|
|
|
118
129
|
addListener(eventType, listener) {
|
|
119
130
|
this._addListenerPreCheck(eventType);
|
|
120
131
|
const callback = (eventProcessor, data) => {
|
|
121
|
-
if (eventProcessor.type(data) !==
|
|
132
|
+
if (eventProcessor.type(data) !== IrisApiEngine_2.EVENT_TYPE.IRtcEngine) {
|
|
122
133
|
return;
|
|
123
134
|
}
|
|
124
135
|
eventProcessor.func.map((it) => {
|
|
@@ -127,20 +138,20 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
|
|
|
127
138
|
};
|
|
128
139
|
// @ts-ignore
|
|
129
140
|
listener.agoraCallback = callback;
|
|
130
|
-
|
|
141
|
+
IrisApiEngine_2.DeviceEventEmitter.addListener(eventType, callback);
|
|
131
142
|
}
|
|
132
143
|
removeListener(eventType, listener) {
|
|
133
|
-
|
|
144
|
+
IrisApiEngine_2.DeviceEventEmitter.removeListener(eventType,
|
|
134
145
|
// @ts-ignore
|
|
135
146
|
listener?.agoraCallback ?? listener);
|
|
136
147
|
}
|
|
137
148
|
removeAllListeners(eventType) {
|
|
138
|
-
|
|
149
|
+
IrisApiEngine_2.DeviceEventEmitter.removeAllListeners(eventType);
|
|
139
150
|
}
|
|
140
151
|
getVersion() {
|
|
141
152
|
const apiType = 'RtcEngine_getVersion_915cb25';
|
|
142
153
|
const jsonParams = {};
|
|
143
|
-
const jsonResults =
|
|
154
|
+
const jsonResults = IrisApiEngine_2.callIrisApi.call(this, apiType, jsonParams);
|
|
144
155
|
return {
|
|
145
156
|
build: jsonResults.build,
|
|
146
157
|
version: jsonResults.result,
|
|
@@ -198,6 +209,10 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
|
|
|
198
209
|
RtcEngineExInternal._metadata_observer.filter((value) => value !== observer);
|
|
199
210
|
return super.unregisterMediaMetadataObserver(observer, type);
|
|
200
211
|
}
|
|
212
|
+
setVideoEncoderConfiguration(config) {
|
|
213
|
+
Utils_1.AgoraEnv.encodeAlpha = config?.advanceOptions?.encodeAlpha ?? false;
|
|
214
|
+
return super.setVideoEncoderConfiguration(config);
|
|
215
|
+
}
|
|
201
216
|
getApiTypeFromJoinChannel(token, channelId, uid, options) {
|
|
202
217
|
if (Utils_1.AgoraEnv.AgoraRendererManager) {
|
|
203
218
|
Utils_1.AgoraEnv.AgoraRendererManager.defaultChannelId = channelId;
|
|
@@ -297,24 +312,24 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
|
|
|
297
312
|
};
|
|
298
313
|
},
|
|
299
314
|
};
|
|
300
|
-
const { result, sources } =
|
|
315
|
+
const { result, sources } = IrisApiEngine_2.callIrisApi.call(this, apiType, jsonParams);
|
|
301
316
|
const screenCaptureSources = result.map((value) => {
|
|
302
317
|
if (!value.thumbImage?.buffer || !value.thumbImage?.length) {
|
|
303
318
|
value.thumbImage.buffer = undefined;
|
|
304
319
|
}
|
|
305
320
|
else {
|
|
306
|
-
value.thumbImage.buffer =
|
|
321
|
+
value.thumbImage.buffer = IrisApiEngine_1.AgoraElectronBridge.GetBuffer(value.thumbImage.buffer, value.thumbImage.length);
|
|
307
322
|
}
|
|
308
323
|
if (!value.iconImage?.buffer || !value.iconImage?.length) {
|
|
309
324
|
value.iconImage.buffer = undefined;
|
|
310
325
|
}
|
|
311
326
|
else {
|
|
312
|
-
value.iconImage.buffer =
|
|
327
|
+
value.iconImage.buffer = IrisApiEngine_1.AgoraElectronBridge.GetBuffer(value.iconImage.buffer, value.iconImage.length);
|
|
313
328
|
}
|
|
314
329
|
value.sourceDisplayId = (0, Utils_1.parseIntPtr2Number)(value.sourceDisplayId);
|
|
315
330
|
return value;
|
|
316
331
|
});
|
|
317
|
-
|
|
332
|
+
IrisApiEngine_2.callIrisApi.call(this, 'RtcEngine_releaseScreenCaptureSources', {
|
|
318
333
|
sources,
|
|
319
334
|
});
|
|
320
335
|
return screenCaptureSources;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//@ts-ignore
|
|
4
|
+
const electron_1 = require("electron");
|
|
5
|
+
const gpu_utils_1 = require("../../Decoder/gpu-utils");
|
|
6
|
+
const Types_1 = require("../../Types");
|
|
7
|
+
//@ts-ignore
|
|
8
|
+
if (process.type !== 'renderer') {
|
|
9
|
+
electron_1.ipcMain.handle(Types_1.IPCMessageType.AGORA_IPC_GET_GPU_INFO, () => {
|
|
10
|
+
return new Promise((resolve) => {
|
|
11
|
+
(0, gpu_utils_1.getGpuInfoInternal)((result) => {
|
|
12
|
+
resolve(result);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
console.log('[agora-electron] main process AgoraIPCMain handler registered');
|
|
17
|
+
electron_1.app.on('quit', () => {
|
|
18
|
+
electron_1.ipcMain.removeHandler(Types_1.IPCMessageType.AGORA_IPC_GET_GPU_INFO);
|
|
19
|
+
console.log('[agora-electron] main process AgoraIPCMain handler removed');
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ipcSend = void 0;
|
|
4
|
+
//@ts-ignore
|
|
5
|
+
const electron_1 = require("electron");
|
|
6
|
+
const Types_1 = require("../../Types");
|
|
7
|
+
const Utils_1 = require("../../Utils");
|
|
8
|
+
async function ipcSend(channel, ...args) {
|
|
9
|
+
if (!Object.values(Types_1.IPCMessageType).includes(channel)) {
|
|
10
|
+
(0, Utils_1.logError)('Invalid IPCMessageType');
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
//@ts-ignore
|
|
14
|
+
if (process.type === 'renderer') {
|
|
15
|
+
return await electron_1.ipcRenderer.invoke(channel, ...args);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
(0, Utils_1.logError)('Not in renderer process, cannot send ipc message');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.ipcSend = ipcSend;
|