agora-electron-sdk 4.5.1 → 4.5.2-dev.1
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 +21 -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 +105 -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,229 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.IRendererManager = void 0;
|
|
4
|
-
const AgoraBase_1 = require("../Private/AgoraBase");
|
|
5
|
-
const AgoraMediaBase_1 = require("../Private/AgoraMediaBase");
|
|
6
|
-
const Utils_1 = require("../Utils");
|
|
7
|
-
const RendererCache_1 = require("./RendererCache");
|
|
8
|
-
/**
|
|
9
|
-
* @ignore
|
|
10
|
-
*/
|
|
11
|
-
class IRendererManager {
|
|
12
|
-
constructor() {
|
|
13
|
-
this._renderingFps = 15;
|
|
14
|
-
this._currentFrameCount = 0;
|
|
15
|
-
this._previousFirstFrameTime = 0;
|
|
16
|
-
this._rendererCaches = [];
|
|
17
|
-
this._context = {
|
|
18
|
-
renderMode: AgoraMediaBase_1.RenderModeType.RenderModeHidden,
|
|
19
|
-
mirrorMode: AgoraBase_1.VideoMirrorModeType.VideoMirrorModeDisabled,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
set renderingFps(fps) {
|
|
23
|
-
if (this._renderingFps !== fps) {
|
|
24
|
-
this._renderingFps = fps;
|
|
25
|
-
if (this._renderingTimer) {
|
|
26
|
-
this.stopRendering();
|
|
27
|
-
this.startRendering();
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
get renderingFps() {
|
|
32
|
-
return this._renderingFps;
|
|
33
|
-
}
|
|
34
|
-
set defaultChannelId(channelId) {
|
|
35
|
-
this._context.channelId = channelId;
|
|
36
|
-
}
|
|
37
|
-
get defaultChannelId() {
|
|
38
|
-
return this._context.channelId ?? '';
|
|
39
|
-
}
|
|
40
|
-
get defaultRenderMode() {
|
|
41
|
-
return this._context.renderMode;
|
|
42
|
-
}
|
|
43
|
-
get defaultMirrorMode() {
|
|
44
|
-
return this._context.mirrorMode;
|
|
45
|
-
}
|
|
46
|
-
release() {
|
|
47
|
-
this.stopRendering();
|
|
48
|
-
this.clearRendererCache();
|
|
49
|
-
}
|
|
50
|
-
precheckRendererContext(context) {
|
|
51
|
-
let { sourceType, uid, channelId, position, mediaPlayerId, renderMode = this.defaultRenderMode, mirrorMode = this.defaultMirrorMode, } = context;
|
|
52
|
-
switch (sourceType) {
|
|
53
|
-
case AgoraMediaBase_1.VideoSourceType.VideoSourceRemote:
|
|
54
|
-
if (uid === undefined) {
|
|
55
|
-
throw new Error('uid is required');
|
|
56
|
-
}
|
|
57
|
-
channelId = channelId ?? this.defaultChannelId;
|
|
58
|
-
break;
|
|
59
|
-
case AgoraMediaBase_1.VideoSourceType.VideoSourceMediaPlayer:
|
|
60
|
-
if (mediaPlayerId === undefined) {
|
|
61
|
-
throw new Error('mediaPlayerId is required');
|
|
62
|
-
}
|
|
63
|
-
channelId = '';
|
|
64
|
-
uid = mediaPlayerId;
|
|
65
|
-
break;
|
|
66
|
-
case undefined:
|
|
67
|
-
if (uid) {
|
|
68
|
-
sourceType = AgoraMediaBase_1.VideoSourceType.VideoSourceRemote;
|
|
69
|
-
}
|
|
70
|
-
break;
|
|
71
|
-
default:
|
|
72
|
-
channelId = '';
|
|
73
|
-
uid = 0;
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
if (!position) {
|
|
77
|
-
position =
|
|
78
|
-
AgoraMediaBase_1.VideoModulePosition.PositionPreEncoder |
|
|
79
|
-
AgoraMediaBase_1.VideoModulePosition.PositionPreRenderer;
|
|
80
|
-
}
|
|
81
|
-
return {
|
|
82
|
-
...context,
|
|
83
|
-
position,
|
|
84
|
-
sourceType,
|
|
85
|
-
uid,
|
|
86
|
-
channelId,
|
|
87
|
-
renderMode,
|
|
88
|
-
mirrorMode,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
addOrRemoveRenderer(context) {
|
|
92
|
-
// To be compatible with the old API
|
|
93
|
-
let { setupMode = AgoraBase_1.VideoViewSetupMode.VideoViewSetupAdd } = context;
|
|
94
|
-
if (!context.view)
|
|
95
|
-
setupMode = AgoraBase_1.VideoViewSetupMode.VideoViewSetupRemove;
|
|
96
|
-
switch (setupMode) {
|
|
97
|
-
case AgoraBase_1.VideoViewSetupMode.VideoViewSetupAdd:
|
|
98
|
-
return this.addRendererToCache(context);
|
|
99
|
-
case AgoraBase_1.VideoViewSetupMode.VideoViewSetupRemove:
|
|
100
|
-
this.removeRendererFromCache(context);
|
|
101
|
-
return undefined;
|
|
102
|
-
case AgoraBase_1.VideoViewSetupMode.VideoViewSetupReplace:
|
|
103
|
-
this.removeRendererFromCache(context);
|
|
104
|
-
return this.addRendererToCache(context);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
addRendererToCache(context) {
|
|
108
|
-
const checkedContext = this.precheckRendererContext(context);
|
|
109
|
-
if (!checkedContext.view)
|
|
110
|
-
return undefined;
|
|
111
|
-
if (this.findRenderer(checkedContext.view)) {
|
|
112
|
-
throw new Error('You have already added this view to the renderer');
|
|
113
|
-
}
|
|
114
|
-
let rendererCache = this.getRendererCache(checkedContext);
|
|
115
|
-
if (!rendererCache) {
|
|
116
|
-
rendererCache = new RendererCache_1.RendererCache(checkedContext);
|
|
117
|
-
this._rendererCaches.push(rendererCache);
|
|
118
|
-
}
|
|
119
|
-
rendererCache.addRenderer(this.createRenderer(checkedContext));
|
|
120
|
-
this.startRendering();
|
|
121
|
-
return rendererCache;
|
|
122
|
-
}
|
|
123
|
-
removeRendererFromCache(context) {
|
|
124
|
-
const checkedContext = this.precheckRendererContext(context);
|
|
125
|
-
const rendererCache = this.getRendererCache(checkedContext);
|
|
126
|
-
if (rendererCache) {
|
|
127
|
-
if (checkedContext.view) {
|
|
128
|
-
const renderer = rendererCache.findRenderer(checkedContext.view);
|
|
129
|
-
if (!renderer)
|
|
130
|
-
return;
|
|
131
|
-
rendererCache.removeRenderer(renderer);
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
rendererCache.removeRenderer();
|
|
135
|
-
}
|
|
136
|
-
if (rendererCache.renderers.length === 0) {
|
|
137
|
-
this._rendererCaches.splice(this._rendererCaches.indexOf(rendererCache), 1);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
this._rendererCaches = this._rendererCaches.filter((_rendererCache) => {
|
|
142
|
-
const renderer = _rendererCache.findRenderer(checkedContext.view);
|
|
143
|
-
if (renderer) {
|
|
144
|
-
_rendererCache.removeRenderer(renderer);
|
|
145
|
-
}
|
|
146
|
-
return _rendererCache.renderers.length > 0;
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
clearRendererCache() {
|
|
151
|
-
for (const rendererCache of this._rendererCaches) {
|
|
152
|
-
rendererCache.removeRenderer();
|
|
153
|
-
}
|
|
154
|
-
this._rendererCaches.splice(0);
|
|
155
|
-
}
|
|
156
|
-
getRendererCache(context) {
|
|
157
|
-
return this._rendererCaches.find((cache) => cache.key === (0, RendererCache_1.generateRendererCacheKey)(context));
|
|
158
|
-
}
|
|
159
|
-
getRenderers(context) {
|
|
160
|
-
return this.getRendererCache(context)?.renderers || [];
|
|
161
|
-
}
|
|
162
|
-
findRenderer(view) {
|
|
163
|
-
for (const rendererCache of this._rendererCaches) {
|
|
164
|
-
const renderer = rendererCache.findRenderer(view);
|
|
165
|
-
if (renderer)
|
|
166
|
-
return renderer;
|
|
167
|
-
}
|
|
168
|
-
return undefined;
|
|
169
|
-
}
|
|
170
|
-
startRendering() {
|
|
171
|
-
if (this._renderingTimer)
|
|
172
|
-
return;
|
|
173
|
-
const renderingLooper = () => {
|
|
174
|
-
if (this._previousFirstFrameTime === 0) {
|
|
175
|
-
// Get the current time as the time of the first frame of per second
|
|
176
|
-
this._previousFirstFrameTime = performance.now();
|
|
177
|
-
// Reset the frame count
|
|
178
|
-
this._currentFrameCount = 0;
|
|
179
|
-
}
|
|
180
|
-
// Increase the frame count
|
|
181
|
-
++this._currentFrameCount;
|
|
182
|
-
// Get the current time
|
|
183
|
-
const currentFrameTime = performance.now();
|
|
184
|
-
// Calculate the time difference between the current frame and the previous frame
|
|
185
|
-
const deltaTime = currentFrameTime - this._previousFirstFrameTime;
|
|
186
|
-
// Calculate the expected time of the current frame
|
|
187
|
-
const expectedTime = (this._currentFrameCount * 1000) / this._renderingFps;
|
|
188
|
-
(0, Utils_1.logDebug)(new Date().toLocaleTimeString(), 'currentFrameCount', this._currentFrameCount, 'expectedTime', expectedTime, 'deltaTime', deltaTime);
|
|
189
|
-
if (this._rendererCaches.length === 0) {
|
|
190
|
-
// If there is no renderer, stop rendering
|
|
191
|
-
this.stopRendering();
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
// Render all renderers
|
|
195
|
-
for (const rendererCache of this._rendererCaches) {
|
|
196
|
-
this.doRendering(rendererCache);
|
|
197
|
-
}
|
|
198
|
-
if (this._currentFrameCount >= this.renderingFps) {
|
|
199
|
-
this._previousFirstFrameTime = 0;
|
|
200
|
-
}
|
|
201
|
-
if (deltaTime < expectedTime) {
|
|
202
|
-
// If the time difference between the current frame and the previous frame is less than the expected time, then wait for the difference
|
|
203
|
-
this._renderingTimer = window.setTimeout(renderingLooper, expectedTime - deltaTime);
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
// If the time difference between the current frame and the previous frame is greater than the expected time, then render immediately
|
|
207
|
-
renderingLooper();
|
|
208
|
-
}
|
|
209
|
-
};
|
|
210
|
-
renderingLooper();
|
|
211
|
-
}
|
|
212
|
-
stopRendering() {
|
|
213
|
-
if (this._renderingTimer) {
|
|
214
|
-
window.clearTimeout(this._renderingTimer);
|
|
215
|
-
this._renderingTimer = undefined;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
setRendererContext(context) {
|
|
219
|
-
const checkedContext = this.precheckRendererContext(context);
|
|
220
|
-
for (const rendererCache of this._rendererCaches) {
|
|
221
|
-
const result = rendererCache.setRendererContext(checkedContext);
|
|
222
|
-
if (result) {
|
|
223
|
-
return true;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
exports.IRendererManager = IRendererManager;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# common.sh
|
|
2
|
-
#!/bin/bash
|
|
3
|
-
|
|
4
|
-
old_package_name='agora-electron-sdk'
|
|
5
|
-
new_package_name='shengwang-electron-sdk'
|
|
6
|
-
|
|
7
|
-
#./package.json
|
|
8
|
-
old_name="\"name\": \"agora-electron-sdk\""
|
|
9
|
-
new_name="\"name\": \"shengwang-electron-sdk\""
|
|
10
|
-
|
|
11
|
-
old_description="\"description\": \"agora-electron-sdk\""
|
|
12
|
-
new_description="\"description\": \"shengwang-electron-sdk\""
|
|
13
|
-
|
|
14
|
-
old_yarn_link="yarn example link agora-electron-sdk"
|
|
15
|
-
new_yarn_link="yarn example link shengwang-electron-sdk"
|
|
16
|
-
|
|
17
|
-
# node_modules
|
|
18
|
-
old_node_modules="node_modules/agora-electron-sdk"
|
|
19
|
-
new_node_modules="node_modules/shengwang-electron-sdk"
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
set -e
|
|
3
|
-
MY_PATH=$(realpath $(dirname "$0"))
|
|
4
|
-
PROJECT_ROOT=$(realpath ${MY_PATH}/../..)
|
|
5
|
-
. ${PROJECT_ROOT}/scripts/publishCN/common.sh
|
|
6
|
-
|
|
7
|
-
change_file=${PROJECT_ROOT}/package.json
|
|
8
|
-
sed "s/${old_name}/${new_name}/g" ${change_file} >tmp && mv tmp ${change_file}
|
|
9
|
-
sed "s/${old_description}/${new_description}/g" ${change_file} >tmp && mv tmp ${change_file}
|
|
10
|
-
sed "s/${old_yarn_link}/${new_yarn_link}/g" ${change_file} >tmp && mv tmp ${change_file}
|
|
11
|
-
|
|
12
|
-
change_file=${PROJECT_ROOT}/tsconfig.json
|
|
13
|
-
sed "s/${old_package_name}/${new_package_name}/g" ${change_file} >tmp && mv tmp ${change_file}
|
|
14
|
-
|
|
15
|
-
change_file=${PROJECT_ROOT}/.github/workflows/publish.yml
|
|
16
|
-
sed "s/${old_package_name}/${new_package_name}/g" ${change_file} >tmp && mv tmp ${change_file}
|
|
17
|
-
|
|
18
|
-
change_file=${PROJECT_ROOT}/ci/packager-mac.sh
|
|
19
|
-
sed "s#${old_node_modules}#${new_node_modules}#g" ${change_file} >tmp && mv tmp ${change_file}
|
|
20
|
-
|
|
21
|
-
change_file=${PROJECT_ROOT}/ci/packager-win.ps1
|
|
22
|
-
sed "s#${old_node_modules}#${new_node_modules}#g" ${change_file} >tmp && mv tmp ${change_file}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
set -e
|
|
3
|
-
MY_PATH=$(realpath $(dirname "$0"))
|
|
4
|
-
PROJECT_ROOT=$(realpath ${MY_PATH}/../..)
|
|
5
|
-
. ${PROJECT_ROOT}/scripts/publishCN/common.sh
|
|
6
|
-
|
|
7
|
-
change_dir="${PROJECT_ROOT}/example/src"
|
|
8
|
-
|
|
9
|
-
find "$change_dir" -type f | while read -r file; do
|
|
10
|
-
sed -i.bak "s/${old_package_name}/${new_package_name}/g" "$file"
|
|
11
|
-
echo "Replaced in $file"
|
|
12
|
-
done
|
|
13
|
-
|
|
14
|
-
change_file=${PROJECT_ROOT}/example/package.json
|
|
15
|
-
sed "s/${old_package_name}/${new_package_name}/g" ${change_file} >tmp && mv tmp ${change_file}
|
|
16
|
-
|
|
17
|
-
change_file=${PROJECT_ROOT}/example/webpack.renderer.additions.js
|
|
18
|
-
sed "s/${old_package_name}/${new_package_name}/g" ${change_file} >tmp && mv tmp ${change_file}
|
|
19
|
-
|
|
20
|
-
find "$change_dir" -name "*.bak" -type f -delete
|
|
21
|
-
|
|
22
|
-
echo "All replacements completed successfully, and backup files have been deleted."
|
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
import { VideoMirrorModeType, VideoViewSetupMode } from '../Private/AgoraBase';
|
|
2
|
-
import {
|
|
3
|
-
RenderModeType,
|
|
4
|
-
VideoModulePosition,
|
|
5
|
-
VideoSourceType,
|
|
6
|
-
} from '../Private/AgoraMediaBase';
|
|
7
|
-
import { RendererContext, RendererType } from '../Types';
|
|
8
|
-
import { logDebug } from '../Utils';
|
|
9
|
-
|
|
10
|
-
import { IRenderer } from './IRenderer';
|
|
11
|
-
import { RendererCache, generateRendererCacheKey } from './RendererCache';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @ignore
|
|
15
|
-
*/
|
|
16
|
-
export abstract class IRendererManager {
|
|
17
|
-
/**
|
|
18
|
-
* @ignore
|
|
19
|
-
*/
|
|
20
|
-
private _renderingFps: number;
|
|
21
|
-
/**
|
|
22
|
-
* @ignore
|
|
23
|
-
*/
|
|
24
|
-
private _currentFrameCount: number;
|
|
25
|
-
/**
|
|
26
|
-
* @ignore
|
|
27
|
-
*/
|
|
28
|
-
private _previousFirstFrameTime: number;
|
|
29
|
-
/**
|
|
30
|
-
* @ignore
|
|
31
|
-
*/
|
|
32
|
-
private _renderingTimer?: number;
|
|
33
|
-
/**
|
|
34
|
-
* @ignore
|
|
35
|
-
*/
|
|
36
|
-
private _rendererCaches: RendererCache[];
|
|
37
|
-
/**
|
|
38
|
-
* @ignore
|
|
39
|
-
*/
|
|
40
|
-
private _context: RendererContext;
|
|
41
|
-
|
|
42
|
-
constructor() {
|
|
43
|
-
this._renderingFps = 15;
|
|
44
|
-
this._currentFrameCount = 0;
|
|
45
|
-
this._previousFirstFrameTime = 0;
|
|
46
|
-
this._rendererCaches = [];
|
|
47
|
-
this._context = {
|
|
48
|
-
renderMode: RenderModeType.RenderModeHidden,
|
|
49
|
-
mirrorMode: VideoMirrorModeType.VideoMirrorModeDisabled,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
public set renderingFps(fps: number) {
|
|
54
|
-
if (this._renderingFps !== fps) {
|
|
55
|
-
this._renderingFps = fps;
|
|
56
|
-
if (this._renderingTimer) {
|
|
57
|
-
this.stopRendering();
|
|
58
|
-
this.startRendering();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
public get renderingFps(): number {
|
|
64
|
-
return this._renderingFps;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
public set defaultChannelId(channelId: string) {
|
|
68
|
-
this._context.channelId = channelId;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
public get defaultChannelId(): string {
|
|
72
|
-
return this._context.channelId ?? '';
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
public get defaultRenderMode(): RenderModeType {
|
|
76
|
-
return this._context.renderMode!;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
public get defaultMirrorMode(): VideoMirrorModeType {
|
|
80
|
-
return this._context.mirrorMode!;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
public release(): void {
|
|
84
|
-
this.stopRendering();
|
|
85
|
-
this.clearRendererCache();
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
private precheckRendererContext(context: RendererContext): RendererContext {
|
|
89
|
-
let {
|
|
90
|
-
sourceType,
|
|
91
|
-
uid,
|
|
92
|
-
channelId,
|
|
93
|
-
position,
|
|
94
|
-
mediaPlayerId,
|
|
95
|
-
renderMode = this.defaultRenderMode,
|
|
96
|
-
mirrorMode = this.defaultMirrorMode,
|
|
97
|
-
} = context;
|
|
98
|
-
switch (sourceType) {
|
|
99
|
-
case VideoSourceType.VideoSourceRemote:
|
|
100
|
-
if (uid === undefined) {
|
|
101
|
-
throw new Error('uid is required');
|
|
102
|
-
}
|
|
103
|
-
channelId = channelId ?? this.defaultChannelId;
|
|
104
|
-
break;
|
|
105
|
-
case VideoSourceType.VideoSourceMediaPlayer:
|
|
106
|
-
if (mediaPlayerId === undefined) {
|
|
107
|
-
throw new Error('mediaPlayerId is required');
|
|
108
|
-
}
|
|
109
|
-
channelId = '';
|
|
110
|
-
uid = mediaPlayerId;
|
|
111
|
-
break;
|
|
112
|
-
case undefined:
|
|
113
|
-
if (uid) {
|
|
114
|
-
sourceType = VideoSourceType.VideoSourceRemote;
|
|
115
|
-
}
|
|
116
|
-
break;
|
|
117
|
-
default:
|
|
118
|
-
channelId = '';
|
|
119
|
-
uid = 0;
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
if (!position) {
|
|
123
|
-
position =
|
|
124
|
-
VideoModulePosition.PositionPreEncoder |
|
|
125
|
-
VideoModulePosition.PositionPreRenderer;
|
|
126
|
-
}
|
|
127
|
-
return {
|
|
128
|
-
...context,
|
|
129
|
-
position,
|
|
130
|
-
sourceType,
|
|
131
|
-
uid,
|
|
132
|
-
channelId,
|
|
133
|
-
renderMode,
|
|
134
|
-
mirrorMode,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
public addOrRemoveRenderer(
|
|
139
|
-
context: RendererContext
|
|
140
|
-
): RendererCache | undefined {
|
|
141
|
-
// To be compatible with the old API
|
|
142
|
-
let { setupMode = VideoViewSetupMode.VideoViewSetupAdd } = context;
|
|
143
|
-
if (!context.view) setupMode = VideoViewSetupMode.VideoViewSetupRemove;
|
|
144
|
-
switch (setupMode) {
|
|
145
|
-
case VideoViewSetupMode.VideoViewSetupAdd:
|
|
146
|
-
return this.addRendererToCache(context);
|
|
147
|
-
case VideoViewSetupMode.VideoViewSetupRemove:
|
|
148
|
-
this.removeRendererFromCache(context);
|
|
149
|
-
return undefined;
|
|
150
|
-
case VideoViewSetupMode.VideoViewSetupReplace:
|
|
151
|
-
this.removeRendererFromCache(context);
|
|
152
|
-
return this.addRendererToCache(context);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
private addRendererToCache(
|
|
157
|
-
context: RendererContext
|
|
158
|
-
): RendererCache | undefined {
|
|
159
|
-
const checkedContext = this.precheckRendererContext(context);
|
|
160
|
-
|
|
161
|
-
if (!checkedContext.view) return undefined;
|
|
162
|
-
|
|
163
|
-
if (this.findRenderer(checkedContext.view)) {
|
|
164
|
-
throw new Error('You have already added this view to the renderer');
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
let rendererCache = this.getRendererCache(checkedContext);
|
|
168
|
-
if (!rendererCache) {
|
|
169
|
-
rendererCache = new RendererCache(checkedContext);
|
|
170
|
-
this._rendererCaches.push(rendererCache);
|
|
171
|
-
}
|
|
172
|
-
rendererCache.addRenderer(this.createRenderer(checkedContext));
|
|
173
|
-
this.startRendering();
|
|
174
|
-
return rendererCache;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
public removeRendererFromCache(context: RendererContext): void {
|
|
178
|
-
const checkedContext = this.precheckRendererContext(context);
|
|
179
|
-
|
|
180
|
-
const rendererCache = this.getRendererCache(checkedContext);
|
|
181
|
-
if (rendererCache) {
|
|
182
|
-
if (checkedContext.view) {
|
|
183
|
-
const renderer = rendererCache.findRenderer(checkedContext.view);
|
|
184
|
-
if (!renderer) return;
|
|
185
|
-
rendererCache.removeRenderer(renderer);
|
|
186
|
-
} else {
|
|
187
|
-
rendererCache.removeRenderer();
|
|
188
|
-
}
|
|
189
|
-
if (rendererCache.renderers.length === 0) {
|
|
190
|
-
this._rendererCaches.splice(
|
|
191
|
-
this._rendererCaches.indexOf(rendererCache),
|
|
192
|
-
1
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
} else {
|
|
196
|
-
this._rendererCaches = this._rendererCaches.filter((_rendererCache) => {
|
|
197
|
-
const renderer = _rendererCache.findRenderer(checkedContext.view);
|
|
198
|
-
if (renderer) {
|
|
199
|
-
_rendererCache.removeRenderer(renderer);
|
|
200
|
-
}
|
|
201
|
-
return _rendererCache.renderers.length > 0;
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
public clearRendererCache(): void {
|
|
207
|
-
for (const rendererCache of this._rendererCaches) {
|
|
208
|
-
rendererCache.removeRenderer();
|
|
209
|
-
}
|
|
210
|
-
this._rendererCaches.splice(0);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
public getRendererCache(context: RendererContext): RendererCache | undefined {
|
|
214
|
-
return this._rendererCaches.find(
|
|
215
|
-
(cache) => cache.key === generateRendererCacheKey(context)
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
public getRenderers(context: RendererContext): IRenderer[] {
|
|
220
|
-
return this.getRendererCache(context)?.renderers || [];
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
public findRenderer(view: Element): IRenderer | undefined {
|
|
224
|
-
for (const rendererCache of this._rendererCaches) {
|
|
225
|
-
const renderer = rendererCache.findRenderer(view);
|
|
226
|
-
if (renderer) return renderer;
|
|
227
|
-
}
|
|
228
|
-
return undefined;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
protected abstract createRenderer(
|
|
232
|
-
context: RendererContext,
|
|
233
|
-
rendererType?: RendererType
|
|
234
|
-
): IRenderer;
|
|
235
|
-
|
|
236
|
-
public startRendering(): void {
|
|
237
|
-
if (this._renderingTimer) return;
|
|
238
|
-
|
|
239
|
-
const renderingLooper = () => {
|
|
240
|
-
if (this._previousFirstFrameTime === 0) {
|
|
241
|
-
// Get the current time as the time of the first frame of per second
|
|
242
|
-
this._previousFirstFrameTime = performance.now();
|
|
243
|
-
// Reset the frame count
|
|
244
|
-
this._currentFrameCount = 0;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Increase the frame count
|
|
248
|
-
++this._currentFrameCount;
|
|
249
|
-
|
|
250
|
-
// Get the current time
|
|
251
|
-
const currentFrameTime = performance.now();
|
|
252
|
-
// Calculate the time difference between the current frame and the previous frame
|
|
253
|
-
const deltaTime = currentFrameTime - this._previousFirstFrameTime;
|
|
254
|
-
// Calculate the expected time of the current frame
|
|
255
|
-
const expectedTime =
|
|
256
|
-
(this._currentFrameCount * 1000) / this._renderingFps;
|
|
257
|
-
logDebug(
|
|
258
|
-
new Date().toLocaleTimeString(),
|
|
259
|
-
'currentFrameCount',
|
|
260
|
-
this._currentFrameCount,
|
|
261
|
-
'expectedTime',
|
|
262
|
-
expectedTime,
|
|
263
|
-
'deltaTime',
|
|
264
|
-
deltaTime
|
|
265
|
-
);
|
|
266
|
-
|
|
267
|
-
if (this._rendererCaches.length === 0) {
|
|
268
|
-
// If there is no renderer, stop rendering
|
|
269
|
-
this.stopRendering();
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
// Render all renderers
|
|
274
|
-
for (const rendererCache of this._rendererCaches) {
|
|
275
|
-
this.doRendering(rendererCache);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
if (this._currentFrameCount >= this.renderingFps) {
|
|
279
|
-
this._previousFirstFrameTime = 0;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
if (deltaTime < expectedTime) {
|
|
283
|
-
// If the time difference between the current frame and the previous frame is less than the expected time, then wait for the difference
|
|
284
|
-
this._renderingTimer = window.setTimeout(
|
|
285
|
-
renderingLooper,
|
|
286
|
-
expectedTime - deltaTime
|
|
287
|
-
);
|
|
288
|
-
} else {
|
|
289
|
-
// If the time difference between the current frame and the previous frame is greater than the expected time, then render immediately
|
|
290
|
-
renderingLooper();
|
|
291
|
-
}
|
|
292
|
-
};
|
|
293
|
-
renderingLooper();
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
public abstract doRendering(rendererCache: RendererCache): void;
|
|
297
|
-
|
|
298
|
-
public stopRendering(): void {
|
|
299
|
-
if (this._renderingTimer) {
|
|
300
|
-
window.clearTimeout(this._renderingTimer);
|
|
301
|
-
this._renderingTimer = undefined;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
public setRendererContext(context: RendererContext): boolean {
|
|
306
|
-
const checkedContext = this.precheckRendererContext(context);
|
|
307
|
-
|
|
308
|
-
for (const rendererCache of this._rendererCaches) {
|
|
309
|
-
const result = rendererCache.setRendererContext(checkedContext);
|
|
310
|
-
if (result) {
|
|
311
|
-
return true;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
return false;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { VideoMirrorModeType } from '../Private/AgoraBase';
|
|
2
|
-
import { RenderModeType } from '../Private/AgoraMediaBase';
|
|
3
|
-
import { RendererContext, RendererType } from '../Types';
|
|
4
|
-
import { IRenderer } from './IRenderer';
|
|
5
|
-
import { RendererCache } from './RendererCache';
|
|
6
|
-
/**
|
|
7
|
-
* @ignore
|
|
8
|
-
*/
|
|
9
|
-
export declare abstract class IRendererManager {
|
|
10
|
-
/**
|
|
11
|
-
* @ignore
|
|
12
|
-
*/
|
|
13
|
-
private _renderingFps;
|
|
14
|
-
/**
|
|
15
|
-
* @ignore
|
|
16
|
-
*/
|
|
17
|
-
private _currentFrameCount;
|
|
18
|
-
/**
|
|
19
|
-
* @ignore
|
|
20
|
-
*/
|
|
21
|
-
private _previousFirstFrameTime;
|
|
22
|
-
/**
|
|
23
|
-
* @ignore
|
|
24
|
-
*/
|
|
25
|
-
private _renderingTimer?;
|
|
26
|
-
/**
|
|
27
|
-
* @ignore
|
|
28
|
-
*/
|
|
29
|
-
private _rendererCaches;
|
|
30
|
-
/**
|
|
31
|
-
* @ignore
|
|
32
|
-
*/
|
|
33
|
-
private _context;
|
|
34
|
-
constructor();
|
|
35
|
-
set renderingFps(fps: number);
|
|
36
|
-
get renderingFps(): number;
|
|
37
|
-
set defaultChannelId(channelId: string);
|
|
38
|
-
get defaultChannelId(): string;
|
|
39
|
-
get defaultRenderMode(): RenderModeType;
|
|
40
|
-
get defaultMirrorMode(): VideoMirrorModeType;
|
|
41
|
-
release(): void;
|
|
42
|
-
private precheckRendererContext;
|
|
43
|
-
addOrRemoveRenderer(context: RendererContext): RendererCache | undefined;
|
|
44
|
-
private addRendererToCache;
|
|
45
|
-
removeRendererFromCache(context: RendererContext): void;
|
|
46
|
-
clearRendererCache(): void;
|
|
47
|
-
getRendererCache(context: RendererContext): RendererCache | undefined;
|
|
48
|
-
getRenderers(context: RendererContext): IRenderer[];
|
|
49
|
-
findRenderer(view: Element): IRenderer | undefined;
|
|
50
|
-
protected abstract createRenderer(context: RendererContext, rendererType?: RendererType): IRenderer;
|
|
51
|
-
startRendering(): void;
|
|
52
|
-
abstract doRendering(rendererCache: RendererCache): void;
|
|
53
|
-
stopRendering(): void;
|
|
54
|
-
setRendererContext(context: RendererContext): boolean;
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=IRendererManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IRendererManager.d.ts","sourceRoot":"","sources":["../../ts/Renderer/IRendererManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,cAAc,EAGf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAA4B,MAAM,iBAAiB,CAAC;AAE1E;;GAEG;AACH,8BAAsB,gBAAgB;IACpC;;OAEG;IACH,OAAO,CAAC,aAAa,CAAS;IAC9B;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAS;IACnC;;OAEG;IACH,OAAO,CAAC,uBAAuB,CAAS;IACxC;;OAEG;IACH,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC;;OAEG;IACH,OAAO,CAAC,eAAe,CAAkB;IACzC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAkB;;IAalC,IAAW,YAAY,CAAC,GAAG,EAAE,MAAM,EAQlC;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAE5C;IAED,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,IAAW,iBAAiB,IAAI,cAAc,CAE7C;IAED,IAAW,iBAAiB,IAAI,mBAAmB,CAElD;IAEM,OAAO,IAAI,IAAI;IAKtB,OAAO,CAAC,uBAAuB;IAkDxB,mBAAmB,CACxB,OAAO,EAAE,eAAe,GACvB,aAAa,GAAG,SAAS;IAgB5B,OAAO,CAAC,kBAAkB;IAqBnB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IA6BvD,kBAAkB,IAAI,IAAI;IAO1B,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,GAAG,SAAS;IAMrE,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,EAAE;IAInD,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS;IAQzD,SAAS,CAAC,QAAQ,CAAC,cAAc,CAC/B,OAAO,EAAE,eAAe,EACxB,YAAY,CAAC,EAAE,YAAY,GAC1B,SAAS;IAEL,cAAc,IAAI,IAAI;aA4Db,WAAW,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAExD,aAAa,IAAI,IAAI;IAOrB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO;CAW7D"}
|