agora-electron-sdk 4.3.2 → 4.4.0-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/gulpfile.js +3 -1
- package/js/AgoraSdk.js +4 -4
- package/js/Private/AgoraBase.js +367 -326
- package/js/Private/AgoraMediaBase.js +265 -76
- package/js/Private/AgoraMediaPlayerTypes.js +12 -30
- package/js/Private/IAgoraH265Transcoder.js +2 -5
- package/js/Private/IAgoraLog.js +2 -5
- package/js/Private/IAgoraMediaEngine.js +2 -5
- package/js/Private/IAgoraMediaPlayer.js +4 -10
- package/js/Private/IAgoraMediaRecorder.js +2 -5
- package/js/Private/IAgoraMediaStreamingSource.js +2 -5
- package/js/Private/IAgoraMusicContentCenter.js +21 -68
- package/js/Private/IAgoraRhythmPlayer.js +2 -5
- package/js/Private/IAgoraRtcEngine.js +76 -130
- package/js/Private/IAgoraRtcEngineEx.js +5 -28
- package/js/Private/IAgoraSpatialAudio.js +6 -15
- package/js/Private/IAudioDeviceManager.js +2 -5
- package/js/Private/impl/AgoraMediaBaseImpl.js +11 -14
- package/js/Private/impl/IAgoraH265TranscoderImpl.js +43 -46
- package/js/Private/impl/IAgoraMediaEngineImpl.js +155 -172
- package/js/Private/impl/IAgoraMediaPlayerImpl.js +534 -546
- package/js/Private/impl/IAgoraMediaRecorderImpl.js +26 -29
- package/js/Private/impl/IAgoraMusicContentCenterImpl.js +218 -251
- package/js/Private/impl/IAgoraRtcEngineExImpl.js +434 -436
- package/js/Private/impl/IAgoraRtcEngineImpl.js +2445 -2423
- package/js/Private/impl/IAgoraSpatialAudioImpl.js +167 -170
- package/js/Private/impl/IAudioDeviceManagerImpl.js +232 -235
- package/js/Private/internal/AgoraH265TranscoderInternal.js +33 -57
- package/js/Private/internal/AgoraMediaBaseInternal.js +9 -28
- package/js/Private/internal/AudioDeviceManagerInternal.js +24 -44
- package/js/Private/internal/IrisApiEngine.js +94 -145
- package/js/Private/internal/LocalSpatialAudioEngineInternal.js +3 -23
- package/js/Private/internal/MediaEngineInternal.js +69 -94
- package/js/Private/internal/MediaPlayerInternal.js +105 -125
- package/js/Private/internal/MediaRecorderInternal.js +37 -64
- package/js/Private/internal/MusicContentCenterInternal.js +92 -129
- package/js/Private/internal/RtcEngineExInternal.js +213 -243
- package/js/Private/ti/AgoraBase-ti.js +2 -2
- package/js/Private/ti/AgoraMediaBase-ti.js +2 -2
- package/js/Private/ti/AgoraMediaPlayerTypes-ti.js +1 -1
- package/js/Private/ti/IAgoraH265Transcoder-ti.js +2 -2
- package/js/Private/ti/IAgoraLog-ti.js +1 -1
- package/js/Private/ti/IAgoraMediaEngine-ti.js +1 -1
- package/js/Private/ti/IAgoraMediaPlayer-ti.js +2 -2
- package/js/Private/ti/IAgoraMediaPlayerSource-ti.js +2 -2
- package/js/Private/ti/IAgoraMediaRecorder-ti.js +1 -1
- package/js/Private/ti/IAgoraMediaStreamingSource-ti.js +1 -1
- package/js/Private/ti/IAgoraMusicContentCenter-ti.js +2 -2
- package/js/Private/ti/IAgoraRhythmPlayer-ti.js +1 -1
- package/js/Private/ti/IAgoraRtcEngine-ti.js +7 -7
- package/js/Private/ti/IAgoraRtcEngineEx-ti.js +1 -1
- package/js/Private/ti/IAgoraSpatialAudio-ti.js +1 -1
- package/js/Private/ti/IAudioDeviceManager-ti.js +1 -1
- package/js/Renderer/AgoraView.js +100 -145
- package/js/Renderer/IRenderer.js +43 -53
- package/js/Renderer/IRendererManager.js +106 -132
- package/js/Renderer/RendererCache.js +63 -96
- package/js/Renderer/RendererManager.js +35 -69
- package/js/Renderer/WebGLRenderer/index.js +77 -106
- package/js/Renderer/YUVCanvasRenderer/index.js +18 -40
- package/js/Utils.js +45 -64
- package/package.json +9 -7
- package/scripts/checkElectron.js +41 -0
- package/scripts/downloadPrebuild.js +56 -24
- package/scripts/synclib.js +6 -6
- package/ts/Private/AgoraBase.ts +269 -4
- package/ts/Private/AgoraMediaBase.ts +343 -1
- package/ts/Private/IAgoraMediaEngine.ts +3 -3
- package/ts/Private/IAgoraRtcEngine.ts +130 -119
- package/ts/Private/IAgoraRtcEngineEx.ts +14 -9
- package/ts/Private/impl/IAgoraRtcEngineExImpl.ts +30 -0
- package/ts/Private/impl/IAgoraRtcEngineImpl.ts +181 -61
- package/ts/Private/internal/IrisApiEngine.ts +3 -7
- package/ts/Private/internal/MediaEngineInternal.ts +0 -1
- package/ts/Private/internal/RtcEngineExInternal.ts +8 -4
- package/ts/Private/ti/IAgoraRtcEngine-ti.ts +5 -5
- package/ts/Renderer/IRenderer.ts +1 -2
- package/ts/Renderer/IRendererManager.ts +21 -12
- package/ts/Utils.ts +15 -0
- package/types/Private/AgoraBase.d.ts +264 -8
- package/types/Private/AgoraBase.d.ts.map +1 -1
- package/types/Private/AgoraMediaBase.d.ts +336 -1
- package/types/Private/AgoraMediaBase.d.ts.map +1 -1
- package/types/Private/IAgoraMediaEngine.d.ts +3 -3
- package/types/Private/IAgoraRtcEngine.d.ts +106 -116
- package/types/Private/IAgoraRtcEngine.d.ts.map +1 -1
- package/types/Private/IAgoraRtcEngineEx.d.ts +10 -10
- package/types/Private/IAgoraRtcEngineEx.d.ts.map +1 -1
- package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts +3 -1
- package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts.map +1 -1
- package/types/Private/impl/IAgoraRtcEngineImpl.d.ts +13 -5
- package/types/Private/impl/IAgoraRtcEngineImpl.d.ts.map +1 -1
- package/types/Private/internal/IrisApiEngine.d.ts.map +1 -1
- package/types/Private/internal/MediaEngineInternal.d.ts.map +1 -1
- package/types/Private/internal/RtcEngineExInternal.d.ts +1 -0
- package/types/Private/internal/RtcEngineExInternal.d.ts.map +1 -1
- package/types/Renderer/IRenderer.d.ts.map +1 -1
- package/types/Renderer/IRendererManager.d.ts.map +1 -1
- package/types/Utils.d.ts +4 -0
- package/types/Utils.d.ts.map +1 -1
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RendererCache = exports.generateRendererCacheKey = void 0;
|
|
4
|
-
|
|
5
|
-
function generateRendererCacheKey(
|
|
6
|
-
|
|
7
|
-
return "".concat(channelId, "_").concat(uid, "_").concat(sourceType);
|
|
4
|
+
const Utils_1 = require("../Utils");
|
|
5
|
+
function generateRendererCacheKey({ channelId, uid, sourceType, }) {
|
|
6
|
+
return `${channelId}_${uid}_${sourceType}`;
|
|
8
7
|
}
|
|
9
8
|
exports.generateRendererCacheKey = generateRendererCacheKey;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var channelId = _a.channelId, uid = _a.uid, sourceType = _a.sourceType;
|
|
9
|
+
class RendererCache {
|
|
10
|
+
constructor({ channelId, uid, sourceType }) {
|
|
13
11
|
this._renderers = [];
|
|
14
12
|
this._videoFrame = {
|
|
15
13
|
yBuffer: Buffer.alloc(0),
|
|
@@ -22,97 +20,68 @@ var RendererCache = /** @class */ (function () {
|
|
|
22
20
|
vStride: 0,
|
|
23
21
|
rotation: 0,
|
|
24
22
|
};
|
|
25
|
-
this._context = { channelId
|
|
23
|
+
this._context = { channelId, uid, sourceType };
|
|
26
24
|
this._enabled = false;
|
|
27
25
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
Object.defineProperty(RendererCache.prototype, "renders", {
|
|
57
|
-
/**
|
|
58
|
-
* @deprecated Use renderers instead
|
|
59
|
-
*/
|
|
60
|
-
get: function () {
|
|
61
|
-
return this.renderers;
|
|
62
|
-
},
|
|
63
|
-
enumerable: false,
|
|
64
|
-
configurable: true
|
|
65
|
-
});
|
|
66
|
-
Object.defineProperty(RendererCache.prototype, "shareVideoFrame", {
|
|
67
|
-
/**
|
|
68
|
-
* @deprecated Use videoFrame instead
|
|
69
|
-
*/
|
|
70
|
-
get: function () {
|
|
71
|
-
return this.videoFrame;
|
|
72
|
-
},
|
|
73
|
-
enumerable: false,
|
|
74
|
-
configurable: true
|
|
75
|
-
});
|
|
76
|
-
Object.defineProperty(RendererCache.prototype, "bridge", {
|
|
77
|
-
get: function () {
|
|
78
|
-
return Utils_1.AgoraEnv.AgoraElectronBridge;
|
|
79
|
-
},
|
|
80
|
-
enumerable: false,
|
|
81
|
-
configurable: true
|
|
82
|
-
});
|
|
83
|
-
RendererCache.prototype.enable = function () {
|
|
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
|
+
/**
|
|
45
|
+
* @deprecated Use videoFrame instead
|
|
46
|
+
*/
|
|
47
|
+
get shareVideoFrame() {
|
|
48
|
+
return this.videoFrame;
|
|
49
|
+
}
|
|
50
|
+
get bridge() {
|
|
51
|
+
return Utils_1.AgoraEnv.AgoraElectronBridge;
|
|
52
|
+
}
|
|
53
|
+
enable() {
|
|
84
54
|
if (this._enabled)
|
|
85
55
|
return;
|
|
86
56
|
this.bridge.EnableVideoFrameCache(this._context);
|
|
87
57
|
this._enabled = true;
|
|
88
|
-
}
|
|
89
|
-
|
|
58
|
+
}
|
|
59
|
+
disable() {
|
|
90
60
|
if (!this._enabled)
|
|
91
61
|
return;
|
|
92
62
|
this.bridge.DisableVideoFrameCache(this._context);
|
|
93
63
|
this._enabled = false;
|
|
94
|
-
}
|
|
95
|
-
|
|
64
|
+
}
|
|
65
|
+
shouldEnable() {
|
|
96
66
|
if (this.renderers.length > 0) {
|
|
97
67
|
this.enable();
|
|
98
68
|
}
|
|
99
69
|
else {
|
|
100
70
|
this.disable();
|
|
101
71
|
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
var _a = this.bridge.GetVideoFrame(this.context, this.videoFrame), ret = _a.ret, isNewFrame = _a.isNewFrame;
|
|
72
|
+
}
|
|
73
|
+
draw() {
|
|
74
|
+
let { ret, isNewFrame } = this.bridge.GetVideoFrame(this.context, this.videoFrame);
|
|
106
75
|
switch (ret) {
|
|
107
76
|
case 0: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::OK = 0
|
|
108
77
|
//
|
|
109
78
|
break;
|
|
110
79
|
case 1: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::RESIZED = 1
|
|
111
|
-
|
|
80
|
+
const { yStride, uStride, vStride, height } = this.videoFrame;
|
|
112
81
|
this.videoFrame.yBuffer = Buffer.alloc(yStride * height);
|
|
113
82
|
this.videoFrame.uBuffer = Buffer.alloc(uStride * height);
|
|
114
83
|
this.videoFrame.vBuffer = Buffer.alloc(vStride * height);
|
|
115
|
-
|
|
84
|
+
const result = this.bridge.GetVideoFrame(this.context, this.videoFrame);
|
|
116
85
|
ret = result.ret;
|
|
117
86
|
isNewFrame = result.isNewFrame;
|
|
118
87
|
break;
|
|
@@ -121,50 +90,48 @@ var RendererCache = /** @class */ (function () {
|
|
|
121
90
|
return;
|
|
122
91
|
}
|
|
123
92
|
if (isNewFrame) {
|
|
124
|
-
this.renderers.forEach(
|
|
125
|
-
renderer.drawFrame(
|
|
93
|
+
this.renderers.forEach((renderer) => {
|
|
94
|
+
renderer.drawFrame(this.videoFrame);
|
|
126
95
|
});
|
|
127
96
|
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return this._renderers.find(
|
|
131
|
-
}
|
|
132
|
-
|
|
97
|
+
}
|
|
98
|
+
findRenderer(view) {
|
|
99
|
+
return this._renderers.find((renderer) => renderer.parentElement === view);
|
|
100
|
+
}
|
|
101
|
+
addRenderer(renderer) {
|
|
133
102
|
this._renderers.push(renderer);
|
|
134
103
|
this.shouldEnable();
|
|
135
|
-
}
|
|
104
|
+
}
|
|
136
105
|
/**
|
|
137
106
|
* Remove the specified renderer if it is specified, otherwise remove all renderers
|
|
138
107
|
*/
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
108
|
+
removeRenderer(renderer) {
|
|
109
|
+
let start = 0;
|
|
110
|
+
let deleteCount = this._renderers.length;
|
|
142
111
|
if (renderer) {
|
|
143
112
|
start = this._renderers.indexOf(renderer);
|
|
144
113
|
if (start < 0)
|
|
145
114
|
return;
|
|
146
115
|
deleteCount = 1;
|
|
147
116
|
}
|
|
148
|
-
this._renderers.splice(start, deleteCount).forEach(
|
|
117
|
+
this._renderers.splice(start, deleteCount).forEach((it) => it.unbind());
|
|
149
118
|
this.shouldEnable();
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
var view = _a.view, renderMode = _a.renderMode, mirrorMode = _a.mirrorMode;
|
|
119
|
+
}
|
|
120
|
+
setRendererContext({ view, renderMode, mirrorMode, }) {
|
|
153
121
|
if (view) {
|
|
154
|
-
|
|
122
|
+
const renderer = this.findRenderer(view);
|
|
155
123
|
if (renderer) {
|
|
156
|
-
renderer.context = { renderMode
|
|
124
|
+
renderer.context = { renderMode, mirrorMode };
|
|
157
125
|
return true;
|
|
158
126
|
}
|
|
159
127
|
return false;
|
|
160
128
|
}
|
|
161
129
|
else {
|
|
162
|
-
this._renderers.forEach(
|
|
163
|
-
it.context = { renderMode
|
|
130
|
+
this._renderers.forEach((it) => {
|
|
131
|
+
it.context = { renderMode, mirrorMode };
|
|
164
132
|
});
|
|
165
133
|
return this._renderers.length > 0;
|
|
166
134
|
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
}());
|
|
135
|
+
}
|
|
136
|
+
}
|
|
170
137
|
exports.RendererCache = RendererCache;
|
|
@@ -1,84 +1,52 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __assign = (this && this.__assign) || function () {
|
|
18
|
-
__assign = Object.assign || function(t) {
|
|
19
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
20
|
-
s = arguments[i];
|
|
21
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
22
|
-
t[p] = s[p];
|
|
23
|
-
}
|
|
24
|
-
return t;
|
|
25
|
-
};
|
|
26
|
-
return __assign.apply(this, arguments);
|
|
27
|
-
};
|
|
28
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
3
|
exports.RendererManager = void 0;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
4
|
+
const Types_1 = require("../Types");
|
|
5
|
+
const Utils_1 = require("../Utils");
|
|
6
|
+
const IRendererManager_1 = require("./IRendererManager");
|
|
7
|
+
const WebGLRenderer_1 = require("./WebGLRenderer");
|
|
8
|
+
const YUVCanvasRenderer_1 = require("./YUVCanvasRenderer");
|
|
35
9
|
/**
|
|
36
10
|
* @ignore
|
|
37
11
|
*/
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
12
|
+
class RendererManager extends IRendererManager_1.IRendererManager {
|
|
13
|
+
set rendererType(rendererType) {
|
|
14
|
+
if (this._rendererType !== rendererType) {
|
|
15
|
+
this._rendererType = rendererType;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
get rendererType() {
|
|
19
|
+
return this._rendererType;
|
|
20
|
+
}
|
|
21
|
+
constructor() {
|
|
22
|
+
super();
|
|
23
|
+
this._rendererType = (0, Utils_1.isSupportWebGL)()
|
|
43
24
|
? Types_1.RendererType.WEBGL
|
|
44
25
|
: Types_1.RendererType.SOFTWARE;
|
|
45
|
-
return _this;
|
|
46
26
|
}
|
|
47
|
-
Object.defineProperty(RendererManager.prototype, "rendererType", {
|
|
48
|
-
get: function () {
|
|
49
|
-
return this._rendererType;
|
|
50
|
-
},
|
|
51
|
-
set: function (rendererType) {
|
|
52
|
-
if (this._rendererType !== rendererType) {
|
|
53
|
-
this._rendererType = rendererType;
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
enumerable: false,
|
|
57
|
-
configurable: true
|
|
58
|
-
});
|
|
59
27
|
/**
|
|
60
28
|
* @deprecated Use rendererType instead
|
|
61
29
|
*/
|
|
62
|
-
|
|
30
|
+
setRenderMode(mode) {
|
|
63
31
|
this.rendererType = mode;
|
|
64
|
-
}
|
|
32
|
+
}
|
|
65
33
|
/**
|
|
66
34
|
* @deprecated Use renderingFps instead
|
|
67
35
|
*/
|
|
68
|
-
|
|
36
|
+
setFPS(fps) {
|
|
69
37
|
this.renderingFps = fps;
|
|
70
|
-
}
|
|
38
|
+
}
|
|
71
39
|
/**
|
|
72
40
|
* @deprecated Use getRendererCache instead
|
|
73
41
|
*/
|
|
74
|
-
|
|
42
|
+
getRender(context) {
|
|
75
43
|
return this.getRendererCache(context);
|
|
76
|
-
}
|
|
77
|
-
|
|
44
|
+
}
|
|
45
|
+
createRenderer(context, rendererType) {
|
|
78
46
|
if (rendererType === undefined) {
|
|
79
47
|
rendererType = this.rendererType;
|
|
80
48
|
}
|
|
81
|
-
|
|
49
|
+
let renderer;
|
|
82
50
|
switch (rendererType) {
|
|
83
51
|
case Types_1.RendererType.WEBGL:
|
|
84
52
|
renderer = new WebGLRenderer_1.WebGLRenderer(this.handleWebGLFallback(context).bind(this));
|
|
@@ -95,20 +63,18 @@ var RendererManager = /** @class */ (function (_super) {
|
|
|
95
63
|
mirrorMode: context.mirrorMode,
|
|
96
64
|
};
|
|
97
65
|
return renderer;
|
|
98
|
-
}
|
|
99
|
-
|
|
66
|
+
}
|
|
67
|
+
doRendering(rendererCache) {
|
|
100
68
|
rendererCache.draw();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
var renderers = _this.getRenderers(context);
|
|
69
|
+
}
|
|
70
|
+
handleWebGLFallback(context) {
|
|
71
|
+
return (renderer) => {
|
|
72
|
+
const { context: { renderMode, mirrorMode }, } = renderer;
|
|
73
|
+
const renderers = this.getRenderers(context);
|
|
107
74
|
renderer.unbind();
|
|
108
|
-
|
|
75
|
+
const newRenderer = this.createRenderer({ ...context, renderMode, mirrorMode }, Types_1.RendererType.SOFTWARE);
|
|
109
76
|
renderers.splice(renderers.indexOf(renderer), 1, newRenderer);
|
|
110
77
|
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
}(IRendererManager_1.IRendererManager));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
114
80
|
exports.RendererManager = RendererManager;
|
|
@@ -1,25 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
3
|
exports.WebGLRenderer = void 0;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
4
|
+
const Utils_1 = require("../../Utils");
|
|
5
|
+
const IRenderer_1 = require("../IRenderer");
|
|
6
|
+
const createProgramFromSources = require('./webgl-utils').createProgramFromSources;
|
|
7
|
+
const vertexShaderSource = 'attribute vec2 a_position;' +
|
|
23
8
|
'attribute vec2 a_texCoord;' +
|
|
24
9
|
'uniform vec2 u_resolution;' +
|
|
25
10
|
'varying vec2 v_texCoord;' +
|
|
@@ -30,7 +15,7 @@ var vertexShaderSource = 'attribute vec2 a_position;' +
|
|
|
30
15
|
' gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' +
|
|
31
16
|
'v_texCoord = a_texCoord;' +
|
|
32
17
|
'}';
|
|
33
|
-
|
|
18
|
+
const yuvShaderSource = 'precision mediump float;' +
|
|
34
19
|
'uniform sampler2D Ytex;' +
|
|
35
20
|
'uniform sampler2D Utex;' +
|
|
36
21
|
'uniform sampler2D Vtex;' +
|
|
@@ -51,50 +36,42 @@ var yuvShaderSource = 'precision mediump float;' +
|
|
|
51
36
|
' b=y+2.017*u;' +
|
|
52
37
|
' gl_FragColor=vec4(r,g,b,1.0);' +
|
|
53
38
|
'}';
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
_this.handleContextLost = function (event) {
|
|
59
|
-
var _a;
|
|
39
|
+
class WebGLRenderer extends IRenderer_1.IRenderer {
|
|
40
|
+
constructor(fallback) {
|
|
41
|
+
super();
|
|
42
|
+
this.handleContextLost = (event) => {
|
|
60
43
|
event.preventDefault();
|
|
61
44
|
(0, Utils_1.logWarn)('webglcontextlost', event);
|
|
62
|
-
|
|
63
|
-
|
|
45
|
+
this.releaseTextures();
|
|
46
|
+
this.fallback?.call(null, this, new Error('Browser not support! No WebGL detected.'));
|
|
64
47
|
};
|
|
65
|
-
|
|
66
|
-
var _a;
|
|
48
|
+
this.handleContextRestored = (event) => {
|
|
67
49
|
event.preventDefault();
|
|
68
50
|
(0, Utils_1.logWarn)('webglcontextrestored', event);
|
|
69
51
|
// Setup GLSL program
|
|
70
|
-
|
|
52
|
+
this.program = createProgramFromSources(this.gl, [
|
|
71
53
|
vertexShaderSource,
|
|
72
54
|
yuvShaderSource,
|
|
73
55
|
]);
|
|
74
|
-
|
|
75
|
-
|
|
56
|
+
this.gl?.useProgram(this.program);
|
|
57
|
+
this.initTextures();
|
|
76
58
|
};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return _this;
|
|
59
|
+
this.gl = undefined;
|
|
60
|
+
this.yTexture = null;
|
|
61
|
+
this.uTexture = null;
|
|
62
|
+
this.vTexture = null;
|
|
63
|
+
this.texCoordBuffer = null;
|
|
64
|
+
this.surfaceBuffer = null;
|
|
65
|
+
this.fallback = fallback;
|
|
85
66
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if (contextNames === void 0) { contextNames = ['webgl2', 'webgl', 'experimental-webgl']; }
|
|
95
|
-
for (var i = 0; i < contextNames.length; i++) {
|
|
96
|
-
var contextName = contextNames[i];
|
|
97
|
-
var context = (_a = _this.canvas) === null || _a === void 0 ? void 0 : _a.getContext(contextName, {
|
|
67
|
+
bind(view) {
|
|
68
|
+
super.bind(view);
|
|
69
|
+
this.canvas?.addEventListener('webglcontextlost', this.handleContextLost, false);
|
|
70
|
+
this.canvas?.addEventListener('webglcontextrestored', this.handleContextRestored, false);
|
|
71
|
+
const getContext = (contextNames = ['webgl2', 'webgl', 'experimental-webgl']) => {
|
|
72
|
+
for (let i = 0; i < contextNames.length; i++) {
|
|
73
|
+
const contextName = contextNames[i];
|
|
74
|
+
const context = this.canvas?.getContext(contextName, {
|
|
98
75
|
depth: true,
|
|
99
76
|
stencil: true,
|
|
100
77
|
alpha: false,
|
|
@@ -110,9 +87,9 @@ var WebGLRenderer = /** @class */ (function (_super) {
|
|
|
110
87
|
}
|
|
111
88
|
return null;
|
|
112
89
|
};
|
|
113
|
-
|
|
90
|
+
this.gl ?? (this.gl = getContext());
|
|
114
91
|
if (!this.gl) {
|
|
115
|
-
|
|
92
|
+
this.fallback?.call(null, this, new Error('Browser not support! No WebGL detected.'));
|
|
116
93
|
return;
|
|
117
94
|
}
|
|
118
95
|
// Set clear color to black, fully opaque
|
|
@@ -132,25 +109,23 @@ var WebGLRenderer = /** @class */ (function (_super) {
|
|
|
132
109
|
]);
|
|
133
110
|
this.gl.useProgram(this.program);
|
|
134
111
|
this.initTextures();
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
(_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener('webglcontextrestored', this.handleContextRestored, false);
|
|
112
|
+
}
|
|
113
|
+
unbind() {
|
|
114
|
+
this.canvas?.removeEventListener('webglcontextlost', this.handleContextLost, false);
|
|
115
|
+
this.canvas?.removeEventListener('webglcontextrestored', this.handleContextRestored, false);
|
|
140
116
|
this.releaseTextures();
|
|
141
117
|
this.gl = undefined;
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
this.rotateCanvas({ width: width, height: height, rotation: rotation });
|
|
118
|
+
super.unbind();
|
|
119
|
+
}
|
|
120
|
+
drawFrame({ width, height, yStride, uStride, vStride, yBuffer, uBuffer, vBuffer, rotation, }) {
|
|
121
|
+
this.rotateCanvas({ width, height, rotation });
|
|
147
122
|
this.updateRenderMode();
|
|
148
123
|
if (!this.gl || !this.program)
|
|
149
124
|
return;
|
|
150
|
-
|
|
125
|
+
const left = 0, top = 0, right = yStride - width, bottom = 0;
|
|
151
126
|
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.texCoordBuffer);
|
|
152
|
-
|
|
153
|
-
|
|
127
|
+
const xWidth = width + left + right;
|
|
128
|
+
const xHeight = height + top + bottom;
|
|
154
129
|
this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([
|
|
155
130
|
left / xWidth,
|
|
156
131
|
bottom / xHeight,
|
|
@@ -180,11 +155,10 @@ var WebGLRenderer = /** @class */ (function (_super) {
|
|
|
180
155
|
this.gl.bindTexture(this.gl.TEXTURE_2D, this.vTexture);
|
|
181
156
|
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.LUMINANCE, vStride, height / 2, 0, this.gl.LUMINANCE, this.gl.UNSIGNED_BYTE, vBuffer);
|
|
182
157
|
this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
_super.prototype.rotateCanvas.call(this, { width: width, height: height, rotation: rotation });
|
|
158
|
+
super.drawFrame();
|
|
159
|
+
}
|
|
160
|
+
rotateCanvas({ width, height, rotation }) {
|
|
161
|
+
super.rotateCanvas({ width, height, rotation });
|
|
188
162
|
if (!this.gl)
|
|
189
163
|
return;
|
|
190
164
|
this.gl.viewport(0, 0, width, height);
|
|
@@ -196,11 +170,11 @@ var WebGLRenderer = /** @class */ (function (_super) {
|
|
|
196
170
|
// 90: 2,3,1/1,3,4
|
|
197
171
|
// 180: 3,4,2/2,4,1
|
|
198
172
|
// 270: 4,1,3/3,1,2
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
173
|
+
const p1 = { x: 0, y: 0 };
|
|
174
|
+
const p2 = { x: width, y: 0 };
|
|
175
|
+
const p3 = { x: width, y: height };
|
|
176
|
+
const p4 = { x: 0, y: height };
|
|
177
|
+
let pp1 = p1, pp2 = p2, pp3 = p3, pp4 = p4;
|
|
204
178
|
switch (rotation) {
|
|
205
179
|
case 0:
|
|
206
180
|
break;
|
|
@@ -238,58 +212,55 @@ var WebGLRenderer = /** @class */ (function (_super) {
|
|
|
238
212
|
pp3.x,
|
|
239
213
|
pp3.y,
|
|
240
214
|
]), this.gl.STATIC_DRAW);
|
|
241
|
-
|
|
215
|
+
const resolutionLocation = this.gl.getUniformLocation(this.program, 'u_resolution');
|
|
242
216
|
this.gl.uniform2f(resolutionLocation, width, height);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
var _this = this;
|
|
217
|
+
}
|
|
218
|
+
initTextures() {
|
|
246
219
|
if (!this.gl)
|
|
247
220
|
return;
|
|
248
221
|
this.positionLocation = this.gl.getAttribLocation(this.program, 'a_position');
|
|
249
222
|
this.texCoordLocation = this.gl.getAttribLocation(this.program, 'a_texCoord');
|
|
250
223
|
this.surfaceBuffer = this.gl.createBuffer();
|
|
251
224
|
this.texCoordBuffer = this.gl.createBuffer();
|
|
252
|
-
|
|
253
|
-
if (!
|
|
225
|
+
const createTexture = (textureIndex) => {
|
|
226
|
+
if (!this.gl)
|
|
254
227
|
return null;
|
|
255
228
|
// Create a texture.
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
229
|
+
this.gl.activeTexture(textureIndex);
|
|
230
|
+
const texture = this.gl.createTexture();
|
|
231
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, texture);
|
|
259
232
|
// Set the parameters so we can render any size
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
233
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
|
|
234
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
|
|
235
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.NEAREST);
|
|
236
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.NEAREST);
|
|
264
237
|
return texture;
|
|
265
238
|
};
|
|
266
239
|
this.yTexture = createTexture(this.gl.TEXTURE0);
|
|
267
240
|
this.uTexture = createTexture(this.gl.TEXTURE1);
|
|
268
241
|
this.vTexture = createTexture(this.gl.TEXTURE2);
|
|
269
|
-
|
|
242
|
+
const y = this.gl.getUniformLocation(this.program, 'Ytex');
|
|
270
243
|
this.gl.uniform1i(y, 0); /* Bind Ytex to texture unit 0 */
|
|
271
|
-
|
|
244
|
+
const u = this.gl.getUniformLocation(this.program, 'Utex');
|
|
272
245
|
this.gl.uniform1i(u, 1); /* Bind Utex to texture unit 1 */
|
|
273
|
-
|
|
246
|
+
const v = this.gl.getUniformLocation(this.program, 'Vtex');
|
|
274
247
|
this.gl.uniform1i(v, 2); /* Bind Vtex to texture unit 2 */
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
(_a = this.gl) === null || _a === void 0 ? void 0 : _a.deleteProgram(this.program);
|
|
248
|
+
}
|
|
249
|
+
releaseTextures() {
|
|
250
|
+
this.gl?.deleteProgram(this.program);
|
|
279
251
|
this.program = undefined;
|
|
280
252
|
this.positionLocation = undefined;
|
|
281
253
|
this.texCoordLocation = undefined;
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
254
|
+
this.gl?.deleteTexture(this.yTexture);
|
|
255
|
+
this.gl?.deleteTexture(this.uTexture);
|
|
256
|
+
this.gl?.deleteTexture(this.vTexture);
|
|
285
257
|
this.yTexture = null;
|
|
286
258
|
this.uTexture = null;
|
|
287
259
|
this.vTexture = null;
|
|
288
|
-
|
|
289
|
-
|
|
260
|
+
this.gl?.deleteBuffer(this.texCoordBuffer);
|
|
261
|
+
this.gl?.deleteBuffer(this.surfaceBuffer);
|
|
290
262
|
this.texCoordBuffer = null;
|
|
291
263
|
this.surfaceBuffer = null;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
}(IRenderer_1.IRenderer));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
295
266
|
exports.WebGLRenderer = WebGLRenderer;
|