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
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CapabilityManager = void 0;
|
|
7
|
+
const semver_1 = __importDefault(require("semver"));
|
|
8
|
+
const AgoraSdk_1 = __importDefault(require("../AgoraSdk"));
|
|
9
|
+
const gpu_utils_1 = require("../Decoder/gpu-utils");
|
|
10
|
+
const AgoraBase_1 = require("../Private/AgoraBase");
|
|
11
|
+
const renderer_1 = require("../Private/ipc/renderer");
|
|
12
|
+
const Types_1 = require("../Types");
|
|
13
|
+
const Utils_1 = require("../Utils");
|
|
14
|
+
/**
|
|
15
|
+
* @ignore
|
|
16
|
+
*/
|
|
17
|
+
class CapabilityManager {
|
|
18
|
+
setWebCodecsDecoderEnabled(enabled) {
|
|
19
|
+
this.webCodecsDecoderEnabled = enabled;
|
|
20
|
+
}
|
|
21
|
+
constructor() {
|
|
22
|
+
this.gpuInfo = new gpu_utils_1.GpuInfo();
|
|
23
|
+
this.frameCodecMapping = {};
|
|
24
|
+
this.webCodecsDecoderEnabled = Utils_1.AgoraEnv.enableWebCodecsDecoder;
|
|
25
|
+
this._engine = (0, AgoraSdk_1.default)();
|
|
26
|
+
if (Utils_1.AgoraEnv.enableWebCodecsDecoder) {
|
|
27
|
+
this.getGpuInfo(() => {
|
|
28
|
+
if (Utils_1.AgoraEnv.videoFallbackStrategy ===
|
|
29
|
+
Types_1.VideoFallbackStrategy.PerformancePriority) {
|
|
30
|
+
if (!this.isSupportedH265()) {
|
|
31
|
+
if (this.isSupportedH264()) {
|
|
32
|
+
this._engine.setParameters(JSON.stringify({ 'che.video.h265_dec_enable': false }));
|
|
33
|
+
(0, Utils_1.logInfo)('the videoFallbackStrategy is PerformancePriority, H265 is not supported, fallback to H264');
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.webCodecsDecoderEnabled = false;
|
|
37
|
+
(0, Utils_1.logInfo)('the videoFallbackStrategy is PerformancePriority, H264 and H265 are not supported, fallback to native decoder');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (Utils_1.AgoraEnv.videoFallbackStrategy ===
|
|
42
|
+
Types_1.VideoFallbackStrategy.BandwidthPriority) {
|
|
43
|
+
if (!this.isSupportedH265()) {
|
|
44
|
+
this.webCodecsDecoderEnabled = false;
|
|
45
|
+
(0, Utils_1.logInfo)('the videoFallbackStrategy is BandwidthPriority, H265 is not supported, fallback to native decoder');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
getGpuInfo(callback) {
|
|
52
|
+
//getGpuInfo and videoDecoder is not supported in electron version < 22.0.0
|
|
53
|
+
//@ts-ignore
|
|
54
|
+
if (semver_1.default.lt(process.versions.electron, '22.0.0')) {
|
|
55
|
+
(0, Utils_1.logError)('WebCodecsDecoder is not supported in electron version < 22.0.0, please upgrade electron to 22.0.0 or later.');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
//@ts-ignore
|
|
59
|
+
if (process.type === 'renderer') {
|
|
60
|
+
(0, renderer_1.ipcSend)(Types_1.IPCMessageType.AGORA_IPC_GET_GPU_INFO)
|
|
61
|
+
.then((result) => {
|
|
62
|
+
this.gpuInfo.videoDecodeAcceleratorSupportedProfile = result;
|
|
63
|
+
this.webCodecsDecoderEnabled = (Utils_1.AgoraEnv.enableWebCodecsDecoder &&
|
|
64
|
+
this.gpuInfo.videoDecodeAcceleratorSupportedProfile.length > 0);
|
|
65
|
+
result.forEach((profile) => {
|
|
66
|
+
const match = Types_1.codecMapping.find((item) => profile.codec.includes(item.profile));
|
|
67
|
+
if (match) {
|
|
68
|
+
//Normally, the range of compatible widths and heights should be the same under the same codec.
|
|
69
|
+
//there is no need to differentiate between different profiles. This could be optimized in the future.
|
|
70
|
+
this.frameCodecMapping[match.type] = {
|
|
71
|
+
codec: match.codec,
|
|
72
|
+
minWidth: profile.minWidth,
|
|
73
|
+
minHeight: profile.minHeight,
|
|
74
|
+
maxWidth: profile.maxWidth,
|
|
75
|
+
maxHeight: profile.maxHeight,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
callback && callback();
|
|
80
|
+
})
|
|
81
|
+
.catch((error) => {
|
|
82
|
+
(0, Utils_1.logError)('Failed to get GPU info, please check if you are already import agora-electron-sdk in the main process.', error);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
(0, Utils_1.logError)('This function only works in renderer process');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
isSupportedH264() {
|
|
90
|
+
return this.frameCodecMapping[AgoraBase_1.VideoCodecType.VideoCodecH264] !== undefined;
|
|
91
|
+
}
|
|
92
|
+
isSupportedH265() {
|
|
93
|
+
return this.frameCodecMapping[AgoraBase_1.VideoCodecType.VideoCodecH265] !== undefined;
|
|
94
|
+
}
|
|
95
|
+
release() {
|
|
96
|
+
Utils_1.AgoraEnv.enableWebCodecsDecoder = false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.CapabilityManager = CapabilityManager;
|
package/js/Renderer/IRenderer.js
CHANGED
|
@@ -5,7 +5,9 @@ const AgoraBase_1 = require("../Private/AgoraBase");
|
|
|
5
5
|
const AgoraMediaBase_1 = require("../Private/AgoraMediaBase");
|
|
6
6
|
class IRenderer {
|
|
7
7
|
constructor() {
|
|
8
|
-
this.
|
|
8
|
+
this.context = {};
|
|
9
|
+
this._frameCount = 0;
|
|
10
|
+
this._startTime = null;
|
|
9
11
|
}
|
|
10
12
|
bind(element) {
|
|
11
13
|
this.parentElement = element;
|
|
@@ -35,25 +37,23 @@ class IRenderer {
|
|
|
35
37
|
this.container = undefined;
|
|
36
38
|
this.parentElement = undefined;
|
|
37
39
|
}
|
|
38
|
-
drawFrame(_videoFrame) {
|
|
40
|
+
drawFrame(_videoFrame, _codecConfig) {
|
|
39
41
|
if (!this.canvas)
|
|
40
42
|
return;
|
|
41
43
|
if (this.canvas.style.display !== '') {
|
|
42
44
|
this.canvas.style.display = '';
|
|
43
45
|
}
|
|
44
46
|
}
|
|
45
|
-
|
|
46
|
-
if (this.context.renderMode !== renderMode) {
|
|
47
|
-
this.context.renderMode = renderMode;
|
|
47
|
+
setContext(context) {
|
|
48
|
+
if (this.context.renderMode !== context.renderMode) {
|
|
49
|
+
this.context.renderMode = context.renderMode;
|
|
48
50
|
this.updateRenderMode();
|
|
49
51
|
}
|
|
50
|
-
if (this.context.mirrorMode !== mirrorMode) {
|
|
51
|
-
this.context.mirrorMode = mirrorMode;
|
|
52
|
+
if (this.context.mirrorMode !== context.mirrorMode) {
|
|
53
|
+
this.context.mirrorMode = context.mirrorMode;
|
|
52
54
|
this.updateMirrorMode();
|
|
53
55
|
}
|
|
54
|
-
|
|
55
|
-
get context() {
|
|
56
|
-
return this._context;
|
|
56
|
+
this.context = { ...this.context, ...context };
|
|
57
57
|
}
|
|
58
58
|
updateRenderMode() {
|
|
59
59
|
if (!this.canvas || !this.container)
|
|
@@ -64,7 +64,7 @@ class IRenderer {
|
|
|
64
64
|
const canvasAspectRatio = width / height;
|
|
65
65
|
const widthScale = clientWidth / width;
|
|
66
66
|
const heightScale = clientHeight / height;
|
|
67
|
-
const isHidden = this.context
|
|
67
|
+
const isHidden = this.context.renderMode === AgoraMediaBase_1.RenderModeType.RenderModeHidden;
|
|
68
68
|
let scale = 1;
|
|
69
69
|
// If container's aspect ratio is larger than canvas's aspect ratio
|
|
70
70
|
if (containerAspectRatio > canvasAspectRatio) {
|
|
@@ -103,5 +103,34 @@ class IRenderer {
|
|
|
103
103
|
throw new Error(`Invalid rotation: ${rotation}, only 0, 90, 180, 270 are supported`);
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
|
+
getFps() {
|
|
107
|
+
let fps = 0;
|
|
108
|
+
if (!this.context.enableFps || !this.container) {
|
|
109
|
+
return fps;
|
|
110
|
+
}
|
|
111
|
+
if (this._startTime == null) {
|
|
112
|
+
this._startTime = performance.now();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const elapsed = (performance.now() - this._startTime) / 1000;
|
|
116
|
+
fps = ++this._frameCount / elapsed;
|
|
117
|
+
}
|
|
118
|
+
let span = this.container.querySelector('span');
|
|
119
|
+
if (!span) {
|
|
120
|
+
span = document.createElement('span');
|
|
121
|
+
Object.assign(span.style, {
|
|
122
|
+
position: 'absolute',
|
|
123
|
+
bottom: '0',
|
|
124
|
+
left: '0',
|
|
125
|
+
zIndex: '10',
|
|
126
|
+
width: '55px',
|
|
127
|
+
background: '#fff',
|
|
128
|
+
});
|
|
129
|
+
this.container.style.position = 'relative';
|
|
130
|
+
this.container.appendChild(span);
|
|
131
|
+
}
|
|
132
|
+
span.innerText = `fps: ${fps.toFixed(0)}`;
|
|
133
|
+
return fps;
|
|
134
|
+
}
|
|
106
135
|
}
|
|
107
136
|
exports.IRenderer = IRenderer;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IRendererCache = exports.isUseConnection = exports.generateRendererCacheKey = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @ignore
|
|
6
|
+
*/
|
|
7
|
+
function generateRendererCacheKey({ channelId, uid, sourceType, }) {
|
|
8
|
+
return `${channelId}_${uid}_${sourceType}`;
|
|
9
|
+
}
|
|
10
|
+
exports.generateRendererCacheKey = generateRendererCacheKey;
|
|
11
|
+
/**
|
|
12
|
+
* @ignore
|
|
13
|
+
*/
|
|
14
|
+
function isUseConnection(context) {
|
|
15
|
+
// if RtcConnection is not undefined, then use connection
|
|
16
|
+
return !!context.channelId && context.localUid !== undefined;
|
|
17
|
+
}
|
|
18
|
+
exports.isUseConnection = isUseConnection;
|
|
19
|
+
class IRendererCache {
|
|
20
|
+
constructor({ channelId, uid, useWebCodecsDecoder, enableFps, sourceType, localUid, position, }) {
|
|
21
|
+
this.renderers = [];
|
|
22
|
+
this.cacheContext = {
|
|
23
|
+
channelId,
|
|
24
|
+
uid,
|
|
25
|
+
useWebCodecsDecoder,
|
|
26
|
+
enableFps,
|
|
27
|
+
sourceType,
|
|
28
|
+
localUid,
|
|
29
|
+
position,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
get key() {
|
|
33
|
+
return generateRendererCacheKey(this.cacheContext);
|
|
34
|
+
}
|
|
35
|
+
findRenderer(view) {
|
|
36
|
+
return this.renderers.find((renderer) => renderer.parentElement === view);
|
|
37
|
+
}
|
|
38
|
+
addRenderer(renderer) {
|
|
39
|
+
this.renderers.push(renderer);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Remove the specified renderer if it is specified, otherwise remove all renderers
|
|
43
|
+
*/
|
|
44
|
+
removeRenderer(renderer) {
|
|
45
|
+
let start = 0;
|
|
46
|
+
let deleteCount = this.renderers.length;
|
|
47
|
+
if (renderer) {
|
|
48
|
+
start = this.renderers.indexOf(renderer);
|
|
49
|
+
if (start < 0)
|
|
50
|
+
return;
|
|
51
|
+
deleteCount = 1;
|
|
52
|
+
}
|
|
53
|
+
this.renderers.splice(start, deleteCount).forEach((it) => it.unbind());
|
|
54
|
+
}
|
|
55
|
+
setRendererContext(context) {
|
|
56
|
+
if (context.view) {
|
|
57
|
+
const renderer = this.findRenderer(context.view);
|
|
58
|
+
if (renderer) {
|
|
59
|
+
renderer.setContext(context);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.renderers.forEach((it) => {
|
|
66
|
+
it.setContext(context);
|
|
67
|
+
});
|
|
68
|
+
return this.renderers.length > 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
release() {
|
|
72
|
+
this.removeRenderer();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.IRendererCache = IRendererCache;
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RendererCache =
|
|
3
|
+
exports.RendererCache = void 0;
|
|
4
|
+
const IrisApiEngine_1 = require("../Private/internal/IrisApiEngine");
|
|
4
5
|
const Utils_1 = require("../Utils");
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
constructor({ channelId, uid, sourceType, position }) {
|
|
11
|
-
this._renderers = [];
|
|
12
|
-
this._videoFrame = {
|
|
6
|
+
const IRendererCache_1 = require("./IRendererCache");
|
|
7
|
+
class RendererCache extends IRendererCache_1.IRendererCache {
|
|
8
|
+
constructor(context) {
|
|
9
|
+
super(context);
|
|
10
|
+
this.videoFrame = {
|
|
13
11
|
yBuffer: Buffer.alloc(0),
|
|
14
12
|
uBuffer: Buffer.alloc(0),
|
|
15
13
|
vBuffer: Buffer.alloc(0),
|
|
14
|
+
alphaBuffer: Utils_1.AgoraEnv.encodeAlpha ? Buffer.alloc(0) : undefined,
|
|
16
15
|
width: 0,
|
|
17
16
|
height: 0,
|
|
18
17
|
yStride: 0,
|
|
@@ -20,46 +19,24 @@ class RendererCache {
|
|
|
20
19
|
vStride: 0,
|
|
21
20
|
rotation: 0,
|
|
22
21
|
};
|
|
23
|
-
this._context = { channelId, uid, sourceType, position };
|
|
24
22
|
this._enabled = false;
|
|
25
23
|
}
|
|
26
|
-
get key() {
|
|
27
|
-
return generateRendererCacheKey(this._context);
|
|
28
|
-
}
|
|
29
|
-
get renderers() {
|
|
30
|
-
return this._renderers;
|
|
31
|
-
}
|
|
32
|
-
get videoFrame() {
|
|
33
|
-
return this._videoFrame;
|
|
34
|
-
}
|
|
35
|
-
get context() {
|
|
36
|
-
return this._context;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* @deprecated Use renderers instead
|
|
40
|
-
*/
|
|
41
|
-
get renders() {
|
|
42
|
-
return this.renderers;
|
|
43
|
-
}
|
|
44
24
|
/**
|
|
45
25
|
* @deprecated Use videoFrame instead
|
|
46
26
|
*/
|
|
47
27
|
get shareVideoFrame() {
|
|
48
28
|
return this.videoFrame;
|
|
49
29
|
}
|
|
50
|
-
get bridge() {
|
|
51
|
-
return Utils_1.AgoraEnv.AgoraElectronBridge;
|
|
52
|
-
}
|
|
53
30
|
enable() {
|
|
54
31
|
if (this._enabled)
|
|
55
32
|
return;
|
|
56
|
-
|
|
33
|
+
IrisApiEngine_1.AgoraElectronBridge.EnableVideoFrameCache(this.cacheContext);
|
|
57
34
|
this._enabled = true;
|
|
58
35
|
}
|
|
59
36
|
disable() {
|
|
60
37
|
if (!this._enabled)
|
|
61
38
|
return;
|
|
62
|
-
|
|
39
|
+
IrisApiEngine_1.AgoraElectronBridge.DisableVideoFrameCache(this.cacheContext);
|
|
63
40
|
this._enabled = false;
|
|
64
41
|
}
|
|
65
42
|
shouldEnable() {
|
|
@@ -71,7 +48,9 @@ class RendererCache {
|
|
|
71
48
|
}
|
|
72
49
|
}
|
|
73
50
|
draw() {
|
|
74
|
-
let { ret, isNewFrame } =
|
|
51
|
+
let { ret, isNewFrame } = IrisApiEngine_1.AgoraElectronBridge.GetVideoFrame(this.cacheContext, this.videoFrame, {
|
|
52
|
+
encodeAlpha: Utils_1.AgoraEnv.encodeAlpha,
|
|
53
|
+
});
|
|
75
54
|
switch (ret) {
|
|
76
55
|
case 0: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::OK = 0
|
|
77
56
|
//
|
|
@@ -81,7 +60,12 @@ class RendererCache {
|
|
|
81
60
|
this.videoFrame.yBuffer = Buffer.alloc(yStride * height);
|
|
82
61
|
this.videoFrame.uBuffer = Buffer.alloc(uStride * height);
|
|
83
62
|
this.videoFrame.vBuffer = Buffer.alloc(vStride * height);
|
|
84
|
-
|
|
63
|
+
if (Utils_1.AgoraEnv.encodeAlpha) {
|
|
64
|
+
this.videoFrame.alphaBuffer = Buffer.alloc(this.videoFrame.width * this.videoFrame.height);
|
|
65
|
+
}
|
|
66
|
+
const result = IrisApiEngine_1.AgoraElectronBridge.GetVideoFrame(this.cacheContext, this.videoFrame, {
|
|
67
|
+
encodeAlpha: Utils_1.AgoraEnv.encodeAlpha,
|
|
68
|
+
});
|
|
85
69
|
ret = result.ret;
|
|
86
70
|
isNewFrame = result.isNewFrame;
|
|
87
71
|
break;
|
|
@@ -89,49 +73,28 @@ class RendererCache {
|
|
|
89
73
|
(0, Utils_1.logDebug)('No renderer cache, please enable cache first');
|
|
90
74
|
return;
|
|
91
75
|
}
|
|
76
|
+
if (!Utils_1.AgoraEnv.encodeAlpha) {
|
|
77
|
+
this.videoFrame.alphaBuffer = undefined;
|
|
78
|
+
}
|
|
92
79
|
if (isNewFrame) {
|
|
93
80
|
this.renderers.forEach((renderer) => {
|
|
94
81
|
renderer.drawFrame(this.videoFrame);
|
|
95
82
|
});
|
|
96
83
|
}
|
|
97
84
|
}
|
|
98
|
-
findRenderer(view) {
|
|
99
|
-
return this._renderers.find((renderer) => renderer.parentElement === view);
|
|
100
|
-
}
|
|
101
85
|
addRenderer(renderer) {
|
|
102
|
-
|
|
86
|
+
super.addRenderer(renderer);
|
|
103
87
|
this.shouldEnable();
|
|
104
88
|
}
|
|
105
89
|
/**
|
|
106
90
|
* Remove the specified renderer if it is specified, otherwise remove all renderers
|
|
107
91
|
*/
|
|
108
92
|
removeRenderer(renderer) {
|
|
109
|
-
|
|
110
|
-
let deleteCount = this._renderers.length;
|
|
111
|
-
if (renderer) {
|
|
112
|
-
start = this._renderers.indexOf(renderer);
|
|
113
|
-
if (start < 0)
|
|
114
|
-
return;
|
|
115
|
-
deleteCount = 1;
|
|
116
|
-
}
|
|
117
|
-
this._renderers.splice(start, deleteCount).forEach((it) => it.unbind());
|
|
93
|
+
super.removeRenderer(renderer);
|
|
118
94
|
this.shouldEnable();
|
|
119
95
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const renderer = this.findRenderer(view);
|
|
123
|
-
if (renderer) {
|
|
124
|
-
renderer.context = { renderMode, mirrorMode };
|
|
125
|
-
return true;
|
|
126
|
-
}
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
this._renderers.forEach((it) => {
|
|
131
|
-
it.context = { renderMode, mirrorMode };
|
|
132
|
-
});
|
|
133
|
-
return this._renderers.length > 0;
|
|
134
|
-
}
|
|
96
|
+
release() {
|
|
97
|
+
super.release();
|
|
135
98
|
}
|
|
136
99
|
}
|
|
137
100
|
exports.RendererCache = RendererCache;
|