agora-electron-sdk 4.2.6 → 4.3.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.
Files changed (172) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/js/Private/AgoraBase.js +139 -174
  3. package/js/Private/AgoraMediaBase.js +49 -20
  4. package/js/Private/AgoraMediaPlayerTypes.js +32 -23
  5. package/js/Private/IAgoraH265Transcoder.js +39 -0
  6. package/js/Private/IAgoraMediaStreamingSource.js +32 -32
  7. package/js/Private/IAgoraMusicContentCenter.js +19 -19
  8. package/js/Private/IAgoraRhythmPlayer.js +9 -9
  9. package/js/Private/IAgoraRtcEngine.js +12 -12
  10. package/js/Private/IAgoraSpatialAudio.js +3 -31
  11. package/js/Private/extension/IAgoraH265TranscoderExtension.js +2 -0
  12. package/js/Private/impl/AgoraMediaBaseImpl.js +26 -2
  13. package/js/Private/impl/IAgoraH265TranscoderImpl.js +119 -0
  14. package/js/Private/impl/IAgoraMediaEngineImpl.js +13 -13
  15. package/js/Private/impl/IAgoraMediaPlayerImpl.js +92 -74
  16. package/js/Private/impl/IAgoraMediaPlayerSourceImpl.js +12 -2
  17. package/js/Private/impl/IAgoraMediaRecorderImpl.js +2 -2
  18. package/js/Private/impl/IAgoraMusicContentCenterImpl.js +20 -20
  19. package/js/Private/impl/IAgoraRtcEngineExImpl.js +66 -84
  20. package/js/Private/impl/IAgoraRtcEngineImpl.js +456 -440
  21. package/js/Private/impl/IAgoraSpatialAudioImpl.js +157 -181
  22. package/js/Private/impl/IAudioDeviceManagerImpl.js +22 -22
  23. package/js/Private/internal/AgoraH265TranscoderInternal.js +86 -0
  24. package/js/Private/internal/AgoraMediaBaseInternal.js +34 -0
  25. package/js/Private/internal/IrisApiEngine.js +35 -20
  26. package/js/Private/internal/LocalSpatialAudioEngineInternal.js +0 -39
  27. package/js/Private/internal/MediaPlayerInternal.js +22 -21
  28. package/js/Private/internal/MusicContentCenterInternal.js +1 -4
  29. package/js/Private/internal/RtcEngineExInternal.js +101 -134
  30. package/js/Private/ti/AgoraMediaBase-ti.js +1 -1
  31. package/js/Private/ti/IAgoraH265Transcoder-ti.js +40 -0
  32. package/js/Private/ti/IAgoraMediaPlayerSource-ti.js +4 -2
  33. package/js/Private/ti/IAgoraMusicContentCenter-ti.js +5 -5
  34. package/js/Private/ti/IAgoraRtcEngine-ti.js +12 -11
  35. package/js/Renderer/AgoraView.js +28 -14
  36. package/js/Renderer/IRenderer.js +65 -17
  37. package/js/Renderer/IRendererManager.js +230 -0
  38. package/js/Renderer/RendererCache.js +170 -0
  39. package/js/Renderer/RendererManager.js +49 -460
  40. package/js/Renderer/WebGLRenderer/index.js +82 -234
  41. package/js/Renderer/YUVCanvasRenderer/index.js +27 -147
  42. package/js/Types.js +6 -6
  43. package/js/Utils.js +37 -88
  44. package/package.json +4 -3
  45. package/scripts/clean.js +12 -0
  46. package/scripts/synclib.js +8 -2
  47. package/ts/Private/AgoraBase.ts +225 -201
  48. package/ts/Private/AgoraMediaBase.ts +63 -25
  49. package/ts/Private/AgoraMediaPlayerTypes.ts +67 -24
  50. package/ts/Private/IAgoraH265Transcoder.ts +73 -0
  51. package/ts/Private/IAgoraLog.ts +1 -0
  52. package/ts/Private/IAgoraMediaEngine.ts +12 -7
  53. package/ts/Private/IAgoraMediaPlayer.ts +47 -21
  54. package/ts/Private/IAgoraMediaPlayerSource.ts +27 -6
  55. package/ts/Private/IAgoraMediaStreamingSource.ts +38 -37
  56. package/ts/Private/IAgoraMusicContentCenter.ts +20 -20
  57. package/ts/Private/IAgoraRhythmPlayer.ts +7 -6
  58. package/ts/Private/IAgoraRtcEngine.ts +407 -364
  59. package/ts/Private/IAgoraRtcEngineEx.ts +25 -61
  60. package/ts/Private/IAgoraSpatialAudio.ts +80 -191
  61. package/ts/Private/IAudioDeviceManager.ts +27 -14
  62. package/ts/Private/extension/IAgoraH265TranscoderExtension.ts +39 -0
  63. package/ts/Private/impl/AgoraMediaBaseImpl.ts +25 -1
  64. package/ts/Private/impl/IAgoraH265TranscoderImpl.ts +152 -0
  65. package/ts/Private/impl/IAgoraMediaEngineImpl.ts +13 -13
  66. package/ts/Private/impl/IAgoraMediaPlayerImpl.ts +110 -81
  67. package/ts/Private/impl/IAgoraMediaPlayerSourceImpl.ts +17 -2
  68. package/ts/Private/impl/IAgoraMediaRecorderImpl.ts +2 -2
  69. package/ts/Private/impl/IAgoraMusicContentCenterImpl.ts +21 -21
  70. package/ts/Private/impl/IAgoraRtcEngineExImpl.ts +71 -106
  71. package/ts/Private/impl/IAgoraRtcEngineImpl.ts +589 -572
  72. package/ts/Private/impl/IAgoraSpatialAudioImpl.ts +211 -218
  73. package/ts/Private/impl/IAudioDeviceManagerImpl.ts +22 -22
  74. package/ts/Private/internal/AgoraH265TranscoderInternal.ts +97 -0
  75. package/ts/Private/internal/AgoraMediaBaseInternal.ts +15 -0
  76. package/ts/Private/internal/IrisApiEngine.ts +42 -27
  77. package/ts/Private/internal/LocalSpatialAudioEngineInternal.ts +1 -86
  78. package/ts/Private/internal/MediaPlayerInternal.ts +20 -29
  79. package/ts/Private/internal/MusicContentCenterInternal.ts +1 -5
  80. package/ts/Private/internal/RtcEngineExInternal.ts +91 -204
  81. package/ts/Private/ti/AgoraMediaBase-ti.ts +1 -1
  82. package/ts/Private/ti/IAgoraH265Transcoder-ti.ts +16 -0
  83. package/ts/Private/ti/IAgoraMediaPlayerSource-ti.ts +4 -2
  84. package/ts/Private/ti/IAgoraMusicContentCenter-ti.ts +5 -5
  85. package/ts/Private/ti/IAgoraRtcEngine-ti.ts +12 -11
  86. package/ts/Renderer/AgoraView.ts +29 -19
  87. package/ts/Renderer/IRenderer.ts +71 -22
  88. package/ts/Renderer/IRendererManager.ts +273 -19
  89. package/ts/Renderer/RendererCache.ts +167 -0
  90. package/ts/Renderer/RendererManager.ts +62 -607
  91. package/ts/Renderer/WebGLRenderer/index.ts +117 -295
  92. package/ts/Renderer/YUVCanvasRenderer/index.ts +45 -198
  93. package/ts/Types.ts +17 -194
  94. package/ts/Utils.ts +36 -100
  95. package/types/Private/AgoraBase.d.ts +219 -200
  96. package/types/Private/AgoraBase.d.ts.map +1 -1
  97. package/types/Private/AgoraMediaBase.d.ts +63 -27
  98. package/types/Private/AgoraMediaBase.d.ts.map +1 -1
  99. package/types/Private/AgoraMediaPlayerTypes.d.ts +65 -24
  100. package/types/Private/AgoraMediaPlayerTypes.d.ts.map +1 -1
  101. package/types/Private/IAgoraH265Transcoder.d.ts +28 -0
  102. package/types/Private/IAgoraH265Transcoder.d.ts.map +1 -0
  103. package/types/Private/IAgoraLog.d.ts.map +1 -1
  104. package/types/Private/IAgoraMediaEngine.d.ts +11 -6
  105. package/types/Private/IAgoraMediaEngine.d.ts.map +1 -1
  106. package/types/Private/IAgoraMediaPlayer.d.ts +42 -20
  107. package/types/Private/IAgoraMediaPlayer.d.ts.map +1 -1
  108. package/types/Private/IAgoraMediaPlayerSource.d.ts +23 -6
  109. package/types/Private/IAgoraMediaPlayerSource.d.ts.map +1 -1
  110. package/types/Private/IAgoraMediaStreamingSource.d.ts.map +1 -1
  111. package/types/Private/IAgoraMusicContentCenter.d.ts +19 -19
  112. package/types/Private/IAgoraMusicContentCenter.d.ts.map +1 -1
  113. package/types/Private/IAgoraRhythmPlayer.d.ts +6 -6
  114. package/types/Private/IAgoraRhythmPlayer.d.ts.map +1 -1
  115. package/types/Private/IAgoraRtcEngine.d.ts +329 -293
  116. package/types/Private/IAgoraRtcEngine.d.ts.map +1 -1
  117. package/types/Private/IAgoraRtcEngineEx.d.ts +21 -53
  118. package/types/Private/IAgoraRtcEngineEx.d.ts.map +1 -1
  119. package/types/Private/IAgoraSpatialAudio.d.ts +56 -167
  120. package/types/Private/IAgoraSpatialAudio.d.ts.map +1 -1
  121. package/types/Private/IAudioDeviceManager.d.ts +27 -14
  122. package/types/Private/IAudioDeviceManager.d.ts.map +1 -1
  123. package/types/Private/extension/IAgoraH265TranscoderExtension.d.ts +24 -0
  124. package/types/Private/extension/IAgoraH265TranscoderExtension.d.ts.map +1 -0
  125. package/types/Private/impl/AgoraMediaBaseImpl.d.ts +5 -1
  126. package/types/Private/impl/AgoraMediaBaseImpl.d.ts.map +1 -1
  127. package/types/Private/impl/IAgoraH265TranscoderImpl.d.ts +15 -0
  128. package/types/Private/impl/IAgoraH265TranscoderImpl.d.ts.map +1 -0
  129. package/types/Private/impl/IAgoraMediaPlayerImpl.d.ts +6 -4
  130. package/types/Private/impl/IAgoraMediaPlayerImpl.d.ts.map +1 -1
  131. package/types/Private/impl/IAgoraMediaPlayerSourceImpl.d.ts.map +1 -1
  132. package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts +2 -4
  133. package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts.map +1 -1
  134. package/types/Private/impl/IAgoraRtcEngineImpl.d.ts +30 -25
  135. package/types/Private/impl/IAgoraRtcEngineImpl.d.ts.map +1 -1
  136. package/types/Private/impl/IAgoraSpatialAudioImpl.d.ts +20 -22
  137. package/types/Private/impl/IAgoraSpatialAudioImpl.d.ts.map +1 -1
  138. package/types/Private/internal/AgoraH265TranscoderInternal.d.ts +14 -0
  139. package/types/Private/internal/AgoraH265TranscoderInternal.d.ts.map +1 -0
  140. package/types/Private/internal/AgoraMediaBaseInternal.d.ts +8 -0
  141. package/types/Private/internal/AgoraMediaBaseInternal.d.ts.map +1 -0
  142. package/types/Private/internal/IrisApiEngine.d.ts +5 -2
  143. package/types/Private/internal/IrisApiEngine.d.ts.map +1 -1
  144. package/types/Private/internal/LocalSpatialAudioEngineInternal.d.ts +0 -15
  145. package/types/Private/internal/LocalSpatialAudioEngineInternal.d.ts.map +1 -1
  146. package/types/Private/internal/MediaPlayerInternal.d.ts.map +1 -1
  147. package/types/Private/internal/MusicContentCenterInternal.d.ts +0 -1
  148. package/types/Private/internal/MusicContentCenterInternal.d.ts.map +1 -1
  149. package/types/Private/internal/RtcEngineExInternal.d.ts +7 -13
  150. package/types/Private/internal/RtcEngineExInternal.d.ts.map +1 -1
  151. package/types/Private/ti/IAgoraH265Transcoder-ti.d.ts +8 -0
  152. package/types/Private/ti/IAgoraH265Transcoder-ti.d.ts.map +1 -0
  153. package/types/Private/ti/IAgoraMediaPlayerSource-ti.d.ts.map +1 -1
  154. package/types/Private/ti/IAgoraRtcEngine-ti.d.ts.map +1 -1
  155. package/types/Renderer/AgoraView.d.ts +4 -4
  156. package/types/Renderer/AgoraView.d.ts.map +1 -1
  157. package/types/Renderer/IRenderer.d.ts +11 -9
  158. package/types/Renderer/IRenderer.d.ts.map +1 -1
  159. package/types/Renderer/IRendererManager.d.ts +50 -12
  160. package/types/Renderer/IRendererManager.d.ts.map +1 -1
  161. package/types/Renderer/RendererCache.d.ts +36 -0
  162. package/types/Renderer/RendererCache.d.ts.map +1 -0
  163. package/types/Renderer/RendererManager.d.ts +13 -139
  164. package/types/Renderer/RendererManager.d.ts.map +1 -1
  165. package/types/Renderer/WebGLRenderer/index.d.ts +3 -18
  166. package/types/Renderer/WebGLRenderer/index.d.ts.map +1 -1
  167. package/types/Renderer/YUVCanvasRenderer/index.d.ts +4 -10
  168. package/types/Renderer/YUVCanvasRenderer/index.d.ts.map +1 -1
  169. package/types/Types.d.ts +11 -187
  170. package/types/Types.d.ts.map +1 -1
  171. package/types/Utils.d.ts +3 -20
  172. package/types/Utils.d.ts.map +1 -1
@@ -15,6 +15,7 @@ var __extends = (this && this.__extends) || (function () {
15
15
  };
16
16
  })();
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
+ var AgoraBase_1 = require("../Private/AgoraBase");
18
19
  var AgoraMediaBase_1 = require("../Private/AgoraMediaBase");
19
20
  var Utils_1 = require("../Utils");
20
21
  var VIDEO_SOURCE_TYPE_STRING = 'video-source-type';
@@ -35,22 +36,29 @@ var AgoraView = /** @class */ (function (_super) {
35
36
  var _this = _super.call(this) || this;
36
37
  _this.isConnectedCallback = false;
37
38
  _this.initializeRender = function () {
38
- var _a, _b;
39
- (_a = Utils_1.AgoraEnv.AgoraRendererManager) === null || _a === void 0 ? void 0 : _a.destroyRendererByView(_this);
40
- (_b = Utils_1.AgoraEnv.AgoraRendererManager) === null || _b === void 0 ? void 0 : _b.setupVideo({
41
- videoSourceType: _this.videoSourceType,
39
+ var _a;
40
+ var _b = _this, channelId = _b.channelId, uid = _b.uid, sourceType = _b.sourceType, renderMode = _b.renderMode, renderMirror = _b.renderMirror;
41
+ (_a = Utils_1.AgoraEnv.AgoraRendererManager) === null || _a === void 0 ? void 0 : _a.addOrRemoveRenderer({
42
+ sourceType: sourceType,
42
43
  view: _this,
43
- uid: _this.uid,
44
- channelId: _this.channelId,
45
- rendererOptions: {
46
- mirror: _this.renderMirror,
47
- contentMode: _this.renderContentMode,
48
- },
44
+ uid: uid,
45
+ channelId: channelId,
46
+ renderMode: renderMode,
47
+ mirrorMode: renderMirror
48
+ ? AgoraBase_1.VideoMirrorModeType.VideoMirrorModeEnabled
49
+ : AgoraBase_1.VideoMirrorModeType.VideoMirrorModeDisabled,
50
+ setupMode: AgoraBase_1.VideoViewSetupMode.VideoViewSetupReplace,
49
51
  });
50
52
  };
51
53
  _this.destroyRender = function () {
52
54
  var _a;
53
- (_a = Utils_1.AgoraEnv.AgoraRendererManager) === null || _a === void 0 ? void 0 : _a.destroyRendererByView(_this);
55
+ var _b = _this, channelId = _b.channelId, uid = _b.uid, sourceType = _b.sourceType;
56
+ (_a = Utils_1.AgoraEnv.AgoraRendererManager) === null || _a === void 0 ? void 0 : _a.removeRendererFromCache({
57
+ channelId: channelId,
58
+ uid: uid,
59
+ sourceType: sourceType,
60
+ view: _this,
61
+ });
54
62
  };
55
63
  return _this;
56
64
  }
@@ -61,7 +69,7 @@ var AgoraView = /** @class */ (function (_super) {
61
69
  enumerable: false,
62
70
  configurable: true
63
71
  });
64
- Object.defineProperty(AgoraView.prototype, "videoSourceType", {
72
+ Object.defineProperty(AgoraView.prototype, "sourceType", {
65
73
  get: function () {
66
74
  var number = Number(this.getAttribute(VIDEO_SOURCE_TYPE_STRING));
67
75
  return isNaN(number) ? 0 : number;
@@ -108,7 +116,7 @@ var AgoraView = /** @class */ (function (_super) {
108
116
  enumerable: false,
109
117
  configurable: true
110
118
  });
111
- Object.defineProperty(AgoraView.prototype, "renderContentMode", {
119
+ Object.defineProperty(AgoraView.prototype, "renderMode", {
112
120
  get: function () {
113
121
  var number = Number(this.getAttribute(RENDERER_CONTENT_MODE_STRING) ||
114
122
  AgoraMediaBase_1.RenderModeType.RenderModeFit);
@@ -154,7 +162,13 @@ var AgoraView = /** @class */ (function (_super) {
154
162
  RENDERER_MIRROR_STRING,
155
163
  ].includes(attrName);
156
164
  if (isSetRenderOption) {
157
- (_a = Utils_1.AgoraEnv.AgoraRendererManager) === null || _a === void 0 ? void 0 : _a.setRenderOption(this, this.renderContentMode, this.renderMirror);
165
+ (_a = Utils_1.AgoraEnv.AgoraRendererManager) === null || _a === void 0 ? void 0 : _a.setRendererContext({
166
+ view: this,
167
+ renderMode: this.renderMode,
168
+ mirrorMode: this.renderMirror
169
+ ? AgoraBase_1.VideoMirrorModeType.VideoMirrorModeEnabled
170
+ : AgoraBase_1.VideoMirrorModeType.VideoMirrorModeDisabled,
171
+ });
158
172
  return;
159
173
  }
160
174
  var isNeedReInitialize = observedAttributes.includes(attrName);
@@ -1,18 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.IRenderer = void 0;
4
+ var AgoraBase_1 = require("../Private/AgoraBase");
4
5
  var AgoraMediaBase_1 = require("../Private/AgoraMediaBase");
5
6
  var IRenderer = /** @class */ (function () {
6
7
  function IRenderer() {
7
- this.contentMode = AgoraMediaBase_1.RenderModeType.RenderModeHidden;
8
+ this._context = {};
8
9
  }
9
- IRenderer.prototype.snapshot = function (fileType) {
10
- if (fileType === void 0) { fileType = 'image/png'; }
11
- if (this.canvas && this.canvas.toDataURL) {
12
- return this.canvas.toDataURL(fileType);
13
- }
14
- return null;
15
- };
16
10
  IRenderer.prototype.bind = function (element) {
17
11
  this.parentElement = element;
18
12
  this.container = document.createElement('div');
@@ -41,20 +35,74 @@ var IRenderer = /** @class */ (function () {
41
35
  this.container = undefined;
42
36
  this.parentElement = undefined;
43
37
  };
44
- IRenderer.prototype.equalsElement = function (element) {
45
- if (!this.parentElement) {
46
- console.error('parentElement is null');
38
+ Object.defineProperty(IRenderer.prototype, "context", {
39
+ get: function () {
40
+ return this._context;
41
+ },
42
+ set: function (_a) {
43
+ var renderMode = _a.renderMode, mirrorMode = _a.mirrorMode;
44
+ if (this.context.renderMode !== renderMode) {
45
+ this.context.renderMode = renderMode;
46
+ this.updateRenderMode();
47
+ }
48
+ if (this.context.mirrorMode !== mirrorMode) {
49
+ this.context.mirrorMode = mirrorMode;
50
+ this.updateMirrorMode();
51
+ }
52
+ },
53
+ enumerable: false,
54
+ configurable: true
55
+ });
56
+ IRenderer.prototype.updateRenderMode = function () {
57
+ var _a;
58
+ if (!this.canvas || !this.container)
59
+ return;
60
+ var _b = this.container, clientWidth = _b.clientWidth, clientHeight = _b.clientHeight;
61
+ var _c = this.canvas, width = _c.width, height = _c.height;
62
+ var containerAspectRatio = clientWidth / clientHeight;
63
+ var canvasAspectRatio = width / height;
64
+ var widthScale = clientWidth / width;
65
+ var heightScale = clientHeight / height;
66
+ var isHidden = ((_a = this.context) === null || _a === void 0 ? void 0 : _a.renderMode) === AgoraMediaBase_1.RenderModeType.RenderModeHidden;
67
+ var scale = 1;
68
+ // If container's aspect ratio is larger than canvas's aspect ratio
69
+ if (containerAspectRatio > canvasAspectRatio) {
70
+ // Scale canvas to fit container's width on hidden mode
71
+ // Scale canvas to fit container's height on fit mode
72
+ scale = isHidden ? widthScale : heightScale;
47
73
  }
48
- return element === this.parentElement;
74
+ else {
75
+ // Scale canvas to fit container's height on hidden mode
76
+ // Scale canvas to fit container's width on fit mode
77
+ scale = isHidden ? heightScale : widthScale;
78
+ }
79
+ this.canvas.style.transform = "scale(".concat(scale, ")");
49
80
  };
50
- IRenderer.prototype.setRenderOption = function (_a) {
51
- var contentMode = _a.contentMode, mirror = _a.mirror;
52
- this.contentMode = contentMode !== null && contentMode !== void 0 ? contentMode : AgoraMediaBase_1.RenderModeType.RenderModeFit;
53
- this.mirror = mirror;
81
+ IRenderer.prototype.updateMirrorMode = function () {
82
+ if (!this.parentElement)
83
+ return;
54
84
  Object.assign(this.parentElement.style, {
55
- transform: mirror ? 'rotateY(180deg)' : '',
85
+ transform: this.context.mirrorMode === AgoraBase_1.VideoMirrorModeType.VideoMirrorModeEnabled
86
+ ? 'rotateY(180deg)'
87
+ : '',
56
88
  });
57
89
  };
90
+ IRenderer.prototype.rotateCanvas = function (_a) {
91
+ var width = _a.width, height = _a.height, rotation = _a.rotation;
92
+ if (!this.canvas)
93
+ return;
94
+ if (rotation === 0 || rotation === 180) {
95
+ this.canvas.width = width;
96
+ this.canvas.height = height;
97
+ }
98
+ else if (rotation === 90 || rotation === 270) {
99
+ this.canvas.height = width;
100
+ this.canvas.width = height;
101
+ }
102
+ else {
103
+ throw new Error("Invalid rotation: ".concat(rotation, ", only 0, 90, 180, 270 are supported"));
104
+ }
105
+ };
58
106
  return IRenderer;
59
107
  }());
60
108
  exports.IRenderer = IRenderer;
@@ -1,12 +1,242 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  Object.defineProperty(exports, "__esModule", { value: true });
3
14
  exports.IRendererManager = void 0;
15
+ var AgoraBase_1 = require("../Private/AgoraBase");
16
+ var AgoraMediaBase_1 = require("../Private/AgoraMediaBase");
17
+ var Utils_1 = require("../Utils");
18
+ var RendererCache_1 = require("./RendererCache");
4
19
  /**
5
20
  * @ignore
6
21
  */
7
22
  var IRendererManager = /** @class */ (function () {
8
23
  function IRendererManager() {
24
+ this._renderingFps = 15;
25
+ this._currentFrameCount = 0;
26
+ this._previousFirstFrameTime = 0;
27
+ this._rendererCaches = [];
28
+ this._context = {
29
+ renderMode: AgoraMediaBase_1.RenderModeType.RenderModeHidden,
30
+ mirrorMode: AgoraBase_1.VideoMirrorModeType.VideoMirrorModeDisabled,
31
+ };
9
32
  }
33
+ Object.defineProperty(IRendererManager.prototype, "renderingFps", {
34
+ get: function () {
35
+ return this._renderingFps;
36
+ },
37
+ set: function (fps) {
38
+ if (this._renderingFps !== fps) {
39
+ this._renderingFps = fps;
40
+ if (this._renderingTimer) {
41
+ this.stopRendering();
42
+ this.startRendering();
43
+ }
44
+ }
45
+ },
46
+ enumerable: false,
47
+ configurable: true
48
+ });
49
+ Object.defineProperty(IRendererManager.prototype, "defaultChannelId", {
50
+ get: function () {
51
+ var _a;
52
+ return (_a = this._context.channelId) !== null && _a !== void 0 ? _a : '';
53
+ },
54
+ set: function (channelId) {
55
+ this._context.channelId = channelId;
56
+ },
57
+ enumerable: false,
58
+ configurable: true
59
+ });
60
+ Object.defineProperty(IRendererManager.prototype, "defaultRenderMode", {
61
+ get: function () {
62
+ return this._context.renderMode;
63
+ },
64
+ enumerable: false,
65
+ configurable: true
66
+ });
67
+ Object.defineProperty(IRendererManager.prototype, "defaultMirrorMode", {
68
+ get: function () {
69
+ return this._context.mirrorMode;
70
+ },
71
+ enumerable: false,
72
+ configurable: true
73
+ });
74
+ IRendererManager.prototype.release = function () {
75
+ this.stopRendering();
76
+ this.clearRendererCache();
77
+ };
78
+ IRendererManager.prototype.precheckRendererContext = function (context) {
79
+ var sourceType = context.sourceType, uid = context.uid, channelId = context.channelId, mediaPlayerId = context.mediaPlayerId, _a = context.renderMode, renderMode = _a === void 0 ? this.defaultRenderMode : _a, _b = context.mirrorMode, mirrorMode = _b === void 0 ? this.defaultMirrorMode : _b;
80
+ switch (sourceType) {
81
+ case AgoraMediaBase_1.VideoSourceType.VideoSourceRemote:
82
+ if (uid === undefined) {
83
+ throw new Error('uid is required');
84
+ }
85
+ channelId = channelId !== null && channelId !== void 0 ? channelId : this.defaultChannelId;
86
+ break;
87
+ case AgoraMediaBase_1.VideoSourceType.VideoSourceMediaPlayer:
88
+ if (mediaPlayerId === undefined) {
89
+ throw new Error('mediaPlayerId is required');
90
+ }
91
+ channelId = '';
92
+ uid = mediaPlayerId;
93
+ break;
94
+ case undefined:
95
+ if (uid) {
96
+ sourceType = AgoraMediaBase_1.VideoSourceType.VideoSourceRemote;
97
+ }
98
+ break;
99
+ default:
100
+ channelId = '';
101
+ uid = 0;
102
+ break;
103
+ }
104
+ return __assign(__assign({}, context), { sourceType: sourceType, uid: uid, channelId: channelId, renderMode: renderMode, mirrorMode: mirrorMode });
105
+ };
106
+ IRendererManager.prototype.addOrRemoveRenderer = function (context) {
107
+ // To be compatible with the old API
108
+ var _a = context.setupMode, setupMode = _a === void 0 ? AgoraBase_1.VideoViewSetupMode.VideoViewSetupAdd : _a;
109
+ if (!context.view)
110
+ setupMode = AgoraBase_1.VideoViewSetupMode.VideoViewSetupRemove;
111
+ switch (setupMode) {
112
+ case AgoraBase_1.VideoViewSetupMode.VideoViewSetupAdd:
113
+ return this.addRendererToCache(context);
114
+ case AgoraBase_1.VideoViewSetupMode.VideoViewSetupRemove:
115
+ this.removeRendererFromCache(context);
116
+ return undefined;
117
+ case AgoraBase_1.VideoViewSetupMode.VideoViewSetupReplace:
118
+ this.removeRendererFromCache(context);
119
+ return this.addRendererToCache(context);
120
+ }
121
+ };
122
+ IRendererManager.prototype.addRendererToCache = function (context) {
123
+ var checkedContext = this.precheckRendererContext(context);
124
+ if (!checkedContext.view)
125
+ return undefined;
126
+ if (this.findRenderer(checkedContext.view)) {
127
+ throw new Error('You have already added this view to the renderer');
128
+ }
129
+ var rendererCache = this.getRendererCache(checkedContext);
130
+ if (!rendererCache) {
131
+ rendererCache = new RendererCache_1.RendererCache(checkedContext);
132
+ this._rendererCaches.push(rendererCache);
133
+ }
134
+ rendererCache.addRenderer(this.createRenderer(checkedContext));
135
+ this.startRendering();
136
+ return rendererCache;
137
+ };
138
+ IRendererManager.prototype.removeRendererFromCache = function (context) {
139
+ var checkedContext = this.precheckRendererContext(context);
140
+ var rendererCache = this.getRendererCache(checkedContext);
141
+ if (!rendererCache)
142
+ return;
143
+ if (checkedContext.view) {
144
+ var renderer = rendererCache.findRenderer(checkedContext.view);
145
+ if (!renderer)
146
+ return;
147
+ rendererCache.removeRenderer(renderer);
148
+ }
149
+ else {
150
+ rendererCache.removeRenderer();
151
+ }
152
+ if (rendererCache.renderers.length === 0) {
153
+ this._rendererCaches.splice(this._rendererCaches.indexOf(rendererCache), 1);
154
+ }
155
+ };
156
+ IRendererManager.prototype.clearRendererCache = function () {
157
+ for (var _i = 0, _a = this._rendererCaches; _i < _a.length; _i++) {
158
+ var rendererCache = _a[_i];
159
+ rendererCache.removeRenderer();
160
+ }
161
+ this._rendererCaches.splice(0);
162
+ };
163
+ IRendererManager.prototype.getRendererCache = function (context) {
164
+ return this._rendererCaches.find(function (cache) { return cache.key === (0, RendererCache_1.generateRendererCacheKey)(context); });
165
+ };
166
+ IRendererManager.prototype.getRenderers = function (context) {
167
+ var _a;
168
+ return ((_a = this.getRendererCache(context)) === null || _a === void 0 ? void 0 : _a.renderers) || [];
169
+ };
170
+ IRendererManager.prototype.findRenderer = function (view) {
171
+ for (var _i = 0, _a = this._rendererCaches; _i < _a.length; _i++) {
172
+ var rendererCache = _a[_i];
173
+ var renderer = rendererCache.findRenderer(view);
174
+ if (renderer)
175
+ return renderer;
176
+ }
177
+ return undefined;
178
+ };
179
+ IRendererManager.prototype.startRendering = function () {
180
+ var _this = this;
181
+ if (this._renderingTimer)
182
+ return;
183
+ var renderingLooper = function () {
184
+ if (_this._previousFirstFrameTime === 0) {
185
+ // Get the current time as the time of the first frame of per second
186
+ _this._previousFirstFrameTime = performance.now();
187
+ // Reset the frame count
188
+ _this._currentFrameCount = 0;
189
+ }
190
+ // Increase the frame count
191
+ ++_this._currentFrameCount;
192
+ // Get the current time
193
+ var currentFrameTime = performance.now();
194
+ // Calculate the time difference between the current frame and the previous frame
195
+ var deltaTime = currentFrameTime - _this._previousFirstFrameTime;
196
+ // Calculate the expected time of the current frame
197
+ var expectedTime = (_this._currentFrameCount * 1000) / _this._renderingFps;
198
+ (0, Utils_1.logDebug)(new Date().toLocaleTimeString(), 'currentFrameCount', _this._currentFrameCount, 'expectedTime', expectedTime, 'deltaTime', deltaTime);
199
+ if (_this._rendererCaches.length === 0) {
200
+ // If there is no renderer, stop rendering
201
+ _this.stopRendering();
202
+ return;
203
+ }
204
+ // Render all renderers
205
+ for (var _i = 0, _a = _this._rendererCaches; _i < _a.length; _i++) {
206
+ var rendererCache = _a[_i];
207
+ _this.doRendering(rendererCache);
208
+ }
209
+ if (_this._currentFrameCount >= _this.renderingFps) {
210
+ _this._previousFirstFrameTime = 0;
211
+ }
212
+ if (deltaTime < expectedTime) {
213
+ // If the time difference between the current frame and the previous frame is less than the expected time, then wait for the difference
214
+ _this._renderingTimer = window.setTimeout(renderingLooper, expectedTime - deltaTime);
215
+ }
216
+ else {
217
+ // If the time difference between the current frame and the previous frame is greater than the expected time, then render immediately
218
+ renderingLooper();
219
+ }
220
+ };
221
+ renderingLooper();
222
+ };
223
+ IRendererManager.prototype.stopRendering = function () {
224
+ if (this._renderingTimer) {
225
+ window.clearTimeout(this._renderingTimer);
226
+ this._renderingTimer = undefined;
227
+ }
228
+ };
229
+ IRendererManager.prototype.setRendererContext = function (context) {
230
+ var checkedContext = this.precheckRendererContext(context);
231
+ for (var _i = 0, _a = this._rendererCaches; _i < _a.length; _i++) {
232
+ var rendererCache = _a[_i];
233
+ var result = rendererCache.setRendererContext(checkedContext);
234
+ if (result) {
235
+ return true;
236
+ }
237
+ }
238
+ return false;
239
+ };
10
240
  return IRendererManager;
11
241
  }());
12
242
  exports.IRendererManager = IRendererManager;
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RendererCache = exports.generateRendererCacheKey = void 0;
4
+ var Utils_1 = require("../Utils");
5
+ function generateRendererCacheKey(_a) {
6
+ var channelId = _a.channelId, uid = _a.uid, sourceType = _a.sourceType;
7
+ return "".concat(channelId, "_").concat(uid, "_").concat(sourceType);
8
+ }
9
+ exports.generateRendererCacheKey = generateRendererCacheKey;
10
+ var RendererCache = /** @class */ (function () {
11
+ function RendererCache(_a) {
12
+ var channelId = _a.channelId, uid = _a.uid, sourceType = _a.sourceType;
13
+ this._renderers = [];
14
+ this._videoFrame = {
15
+ yBuffer: Buffer.alloc(0),
16
+ uBuffer: Buffer.alloc(0),
17
+ vBuffer: Buffer.alloc(0),
18
+ width: 0,
19
+ height: 0,
20
+ yStride: 0,
21
+ uStride: 0,
22
+ vStride: 0,
23
+ rotation: 0,
24
+ };
25
+ this._context = { channelId: channelId, uid: uid, sourceType: sourceType };
26
+ this._enabled = false;
27
+ }
28
+ Object.defineProperty(RendererCache.prototype, "key", {
29
+ get: function () {
30
+ return generateRendererCacheKey(this._context);
31
+ },
32
+ enumerable: false,
33
+ configurable: true
34
+ });
35
+ Object.defineProperty(RendererCache.prototype, "renderers", {
36
+ get: function () {
37
+ return this._renderers;
38
+ },
39
+ enumerable: false,
40
+ configurable: true
41
+ });
42
+ Object.defineProperty(RendererCache.prototype, "videoFrame", {
43
+ get: function () {
44
+ return this._videoFrame;
45
+ },
46
+ enumerable: false,
47
+ configurable: true
48
+ });
49
+ Object.defineProperty(RendererCache.prototype, "context", {
50
+ get: function () {
51
+ return this._context;
52
+ },
53
+ enumerable: false,
54
+ configurable: true
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 () {
84
+ if (this._enabled)
85
+ return;
86
+ this.bridge.EnableVideoFrameCache(this._context);
87
+ this._enabled = true;
88
+ };
89
+ RendererCache.prototype.disable = function () {
90
+ if (!this._enabled)
91
+ return;
92
+ this.bridge.DisableVideoFrameCache(this._context);
93
+ this._enabled = false;
94
+ };
95
+ RendererCache.prototype.shouldEnable = function () {
96
+ if (this.renderers.length > 0) {
97
+ this.enable();
98
+ }
99
+ else {
100
+ this.disable();
101
+ }
102
+ };
103
+ RendererCache.prototype.draw = function () {
104
+ var _this = this;
105
+ var _a = this.bridge.GetVideoFrame(this.context, this.videoFrame), ret = _a.ret, isNewFrame = _a.isNewFrame;
106
+ switch (ret) {
107
+ case 0: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::OK = 0
108
+ //
109
+ break;
110
+ case 1: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::RESIZED = 1
111
+ var _b = this.videoFrame, yStride = _b.yStride, uStride = _b.uStride, vStride = _b.vStride, height = _b.height;
112
+ this.videoFrame.yBuffer = Buffer.alloc(yStride * height);
113
+ this.videoFrame.uBuffer = Buffer.alloc(uStride * height);
114
+ this.videoFrame.vBuffer = Buffer.alloc(vStride * height);
115
+ var result = this.bridge.GetVideoFrame(this.context, this.videoFrame);
116
+ ret = result.ret;
117
+ isNewFrame = result.isNewFrame;
118
+ break;
119
+ case 2: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::NO_CACHE = 2
120
+ (0, Utils_1.logDebug)('No renderer cache, please enable cache first');
121
+ return;
122
+ }
123
+ if (isNewFrame) {
124
+ this.renderers.forEach(function (renderer) {
125
+ renderer.drawFrame(_this.videoFrame);
126
+ });
127
+ }
128
+ };
129
+ RendererCache.prototype.findRenderer = function (view) {
130
+ return this._renderers.find(function (renderer) { return renderer.parentElement === view; });
131
+ };
132
+ RendererCache.prototype.addRenderer = function (renderer) {
133
+ this._renderers.push(renderer);
134
+ this.shouldEnable();
135
+ };
136
+ /**
137
+ * Remove the specified renderer if it is specified, otherwise remove all renderers
138
+ */
139
+ RendererCache.prototype.removeRenderer = function (renderer) {
140
+ var start = 0;
141
+ var deleteCount = this._renderers.length;
142
+ if (renderer) {
143
+ start = this._renderers.indexOf(renderer);
144
+ if (start < 0)
145
+ return;
146
+ deleteCount = 1;
147
+ }
148
+ this._renderers.splice(start, deleteCount).forEach(function (it) { return it.unbind(); });
149
+ this.shouldEnable();
150
+ };
151
+ RendererCache.prototype.setRendererContext = function (_a) {
152
+ var view = _a.view, renderMode = _a.renderMode, mirrorMode = _a.mirrorMode;
153
+ if (view) {
154
+ var renderer = this.findRenderer(view);
155
+ if (renderer) {
156
+ renderer.context = { renderMode: renderMode, mirrorMode: mirrorMode };
157
+ return true;
158
+ }
159
+ return false;
160
+ }
161
+ else {
162
+ this._renderers.forEach(function (it) {
163
+ it.context = { renderMode: renderMode, mirrorMode: mirrorMode };
164
+ });
165
+ return this._renderers.length > 0;
166
+ }
167
+ };
168
+ return RendererCache;
169
+ }());
170
+ exports.RendererCache = RendererCache;