agora-electron-sdk 0.0.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 (369) hide show
  1. package/CHANGELOG.md +315 -0
  2. package/LICENSE +21 -0
  3. package/README.md +143 -0
  4. package/gulpfile.js +52 -0
  5. package/js/AgoraSdk.js +64 -0
  6. package/js/Decoder/gpu-utils.js +74 -0
  7. package/js/Decoder/index.js +172 -0
  8. package/js/Private/AgoraBase.js +3985 -0
  9. package/js/Private/AgoraMediaBase.js +1014 -0
  10. package/js/Private/AgoraMediaPlayerTypes.js +316 -0
  11. package/js/Private/IAgoraH265Transcoder.js +36 -0
  12. package/js/Private/IAgoraLog.js +78 -0
  13. package/js/Private/IAgoraMediaEngine.js +32 -0
  14. package/js/Private/IAgoraMediaPlayer.js +16 -0
  15. package/js/Private/IAgoraMediaPlayerSource.js +3 -0
  16. package/js/Private/IAgoraMediaRecorder.js +10 -0
  17. package/js/Private/IAgoraMediaStreamingSource.js +74 -0
  18. package/js/Private/IAgoraMusicContentCenter.js +157 -0
  19. package/js/Private/IAgoraRhythmPlayer.js +62 -0
  20. package/js/Private/IAgoraRtcEngine.js +982 -0
  21. package/js/Private/IAgoraRtcEngineEx.js +19 -0
  22. package/js/Private/IAgoraSpatialAudio.js +24 -0
  23. package/js/Private/IAudioDeviceManager.js +20 -0
  24. package/js/Private/extension/AgoraBaseExtension.js +3 -0
  25. package/js/Private/extension/AgoraMediaBaseExtension.js +2 -0
  26. package/js/Private/extension/AgoraMediaPlayerTypesExtension.js +2 -0
  27. package/js/Private/extension/IAgoraH265TranscoderExtension.js +2 -0
  28. package/js/Private/extension/IAgoraLogExtension.js +2 -0
  29. package/js/Private/extension/IAgoraMediaEngineExtension.js +2 -0
  30. package/js/Private/extension/IAgoraMediaPlayerExtension.js +2 -0
  31. package/js/Private/extension/IAgoraMediaPlayerSourceExtension.js +2 -0
  32. package/js/Private/extension/IAgoraMediaRecorderExtension.js +2 -0
  33. package/js/Private/extension/IAgoraMusicContentCenterExtension.js +2 -0
  34. package/js/Private/extension/IAgoraRhythmPlayerExtension.js +2 -0
  35. package/js/Private/extension/IAgoraRtcEngineExExtension.js +2 -0
  36. package/js/Private/extension/IAgoraRtcEngineExtension.js +2 -0
  37. package/js/Private/extension/IAgoraSpatialAudioExtension.js +2 -0
  38. package/js/Private/extension/IAudioDeviceManagerExtension.js +2 -0
  39. package/js/Private/impl/AgoraBaseImpl.js +23 -0
  40. package/js/Private/impl/AgoraMediaBaseImpl.js +149 -0
  41. package/js/Private/impl/IAgoraH265TranscoderImpl.js +116 -0
  42. package/js/Private/impl/IAgoraMediaEngineImpl.js +337 -0
  43. package/js/Private/impl/IAgoraMediaPlayerImpl.js +950 -0
  44. package/js/Private/impl/IAgoraMediaPlayerSourceImpl.js +73 -0
  45. package/js/Private/impl/IAgoraMediaRecorderImpl.js +47 -0
  46. package/js/Private/impl/IAgoraMusicContentCenterImpl.js +422 -0
  47. package/js/Private/impl/IAgoraRtcEngineExImpl.js +1042 -0
  48. package/js/Private/impl/IAgoraRtcEngineImpl.js +5167 -0
  49. package/js/Private/impl/IAgoraSpatialAudioImpl.js +358 -0
  50. package/js/Private/impl/IAudioDeviceManagerImpl.js +375 -0
  51. package/js/Private/internal/AgoraH265TranscoderInternal.js +62 -0
  52. package/js/Private/internal/AgoraMediaBaseInternal.js +15 -0
  53. package/js/Private/internal/AudioDeviceManagerInternal.js +44 -0
  54. package/js/Private/internal/IrisApiEngine.js +424 -0
  55. package/js/Private/internal/LocalSpatialAudioEngineInternal.js +7 -0
  56. package/js/Private/internal/MediaEngineInternal.js +122 -0
  57. package/js/Private/internal/MediaPlayerInternal.js +194 -0
  58. package/js/Private/internal/MediaRecorderInternal.js +70 -0
  59. package/js/Private/internal/MusicContentCenterInternal.js +139 -0
  60. package/js/Private/internal/RtcEngineExInternal.js +430 -0
  61. package/js/Private/ipc/main.js +21 -0
  62. package/js/Private/ipc/renderer.js +21 -0
  63. package/js/Private/ti/AgoraBase-ti.js +40 -0
  64. package/js/Private/ti/AgoraMediaBase-ti.js +75 -0
  65. package/js/Private/ti/AgoraMediaPlayerTypes-ti.js +5 -0
  66. package/js/Private/ti/IAgoraH265Transcoder-ti.js +40 -0
  67. package/js/Private/ti/IAgoraLog-ti.js +5 -0
  68. package/js/Private/ti/IAgoraMediaEngine-ti.js +5 -0
  69. package/js/Private/ti/IAgoraMediaPlayer-ti.js +38 -0
  70. package/js/Private/ti/IAgoraMediaPlayerSource-ti.js +50 -0
  71. package/js/Private/ti/IAgoraMediaRecorder-ti.js +5 -0
  72. package/js/Private/ti/IAgoraMediaStreamingSource-ti.js +5 -0
  73. package/js/Private/ti/IAgoraMusicContentCenter-ti.js +42 -0
  74. package/js/Private/ti/IAgoraRhythmPlayer-ti.js +5 -0
  75. package/js/Private/ti/IAgoraRtcEngine-ti.js +141 -0
  76. package/js/Private/ti/IAgoraRtcEngineEx-ti.js +5 -0
  77. package/js/Private/ti/IAgoraSpatialAudio-ti.js +5 -0
  78. package/js/Private/ti/IAudioDeviceManager-ti.js +5 -0
  79. package/js/Renderer/AgoraView.js +161 -0
  80. package/js/Renderer/CapabilityManager.js +99 -0
  81. package/js/Renderer/IRenderer.js +136 -0
  82. package/js/Renderer/IRendererCache.js +75 -0
  83. package/js/Renderer/RendererCache.js +100 -0
  84. package/js/Renderer/RendererManager.js +301 -0
  85. package/js/Renderer/WebCodecsRenderer/index.js +109 -0
  86. package/js/Renderer/WebCodecsRendererCache.js +115 -0
  87. package/js/Renderer/WebGLRenderer/index.js +314 -0
  88. package/js/Renderer/WebGLRenderer/webgl-utils.js +1337 -0
  89. package/js/Renderer/YUVCanvasRenderer/index.js +46 -0
  90. package/js/Renderer/index.js +17 -0
  91. package/js/Types.js +67 -0
  92. package/js/Utils.js +187 -0
  93. package/package.json +167 -0
  94. package/scripts/bootstrap.js +29 -0
  95. package/scripts/build.js +37 -0
  96. package/scripts/buildJS.js +14 -0
  97. package/scripts/checkElectron.js +43 -0
  98. package/scripts/clean.js +16 -0
  99. package/scripts/download.js +105 -0
  100. package/scripts/downloadPrebuild.js +199 -0
  101. package/scripts/getConfig.js +73 -0
  102. package/scripts/logger.js +32 -0
  103. package/scripts/synclib.js +69 -0
  104. package/scripts/util.js +47 -0
  105. package/scripts/zipBuild.js +40 -0
  106. package/ts/AgoraSdk.ts +54 -0
  107. package/ts/Decoder/gpu-utils.ts +92 -0
  108. package/ts/Decoder/index.ts +206 -0
  109. package/ts/Private/AgoraBase.ts +5511 -0
  110. package/ts/Private/AgoraMediaBase.ts +1764 -0
  111. package/ts/Private/AgoraMediaPlayerTypes.ts +464 -0
  112. package/ts/Private/IAgoraH265Transcoder.ts +73 -0
  113. package/ts/Private/IAgoraLog.ts +91 -0
  114. package/ts/Private/IAgoraMediaEngine.ts +316 -0
  115. package/ts/Private/IAgoraMediaPlayer.ts +744 -0
  116. package/ts/Private/IAgoraMediaPlayerSource.ts +137 -0
  117. package/ts/Private/IAgoraMediaRecorder.ts +25 -0
  118. package/ts/Private/IAgoraMediaStreamingSource.ts +81 -0
  119. package/ts/Private/IAgoraMusicContentCenter.ts +455 -0
  120. package/ts/Private/IAgoraRhythmPlayer.ts +67 -0
  121. package/ts/Private/IAgoraRtcEngine.ts +7306 -0
  122. package/ts/Private/IAgoraRtcEngineEx.ts +992 -0
  123. package/ts/Private/IAgoraSpatialAudio.ts +250 -0
  124. package/ts/Private/IAudioDeviceManager.ts +342 -0
  125. package/ts/Private/extension/AgoraBaseExtension.ts +14 -0
  126. package/ts/Private/extension/AgoraMediaBaseExtension.ts +1 -0
  127. package/ts/Private/extension/AgoraMediaPlayerTypesExtension.ts +1 -0
  128. package/ts/Private/extension/IAgoraH265TranscoderExtension.ts +39 -0
  129. package/ts/Private/extension/IAgoraLogExtension.ts +1 -0
  130. package/ts/Private/extension/IAgoraMediaEngineExtension.ts +62 -0
  131. package/ts/Private/extension/IAgoraMediaPlayerExtension.ts +64 -0
  132. package/ts/Private/extension/IAgoraMediaPlayerSourceExtension.ts +1 -0
  133. package/ts/Private/extension/IAgoraMediaRecorderExtension.ts +59 -0
  134. package/ts/Private/extension/IAgoraMusicContentCenterExtension.ts +34 -0
  135. package/ts/Private/extension/IAgoraRhythmPlayerExtension.ts +1 -0
  136. package/ts/Private/extension/IAgoraRtcEngineExExtension.ts +1 -0
  137. package/ts/Private/extension/IAgoraRtcEngineExtension.ts +64 -0
  138. package/ts/Private/extension/IAgoraSpatialAudioExtension.ts +1 -0
  139. package/ts/Private/extension/IAudioDeviceManagerExtension.ts +1 -0
  140. package/ts/Private/impl/AgoraBaseImpl.ts +39 -0
  141. package/ts/Private/impl/AgoraMediaBaseImpl.ts +237 -0
  142. package/ts/Private/impl/IAgoraH265TranscoderImpl.ts +152 -0
  143. package/ts/Private/impl/IAgoraMediaEngineImpl.ts +491 -0
  144. package/ts/Private/impl/IAgoraMediaPlayerImpl.ts +1169 -0
  145. package/ts/Private/impl/IAgoraMediaPlayerSourceImpl.ts +94 -0
  146. package/ts/Private/impl/IAgoraMediaRecorderImpl.ts +59 -0
  147. package/ts/Private/impl/IAgoraMusicContentCenterImpl.ts +562 -0
  148. package/ts/Private/impl/IAgoraRtcEngineExImpl.ts +1672 -0
  149. package/ts/Private/impl/IAgoraRtcEngineImpl.ts +7352 -0
  150. package/ts/Private/impl/IAgoraSpatialAudioImpl.ts +495 -0
  151. package/ts/Private/impl/IAudioDeviceManagerImpl.ts +443 -0
  152. package/ts/Private/internal/AgoraH265TranscoderInternal.ts +97 -0
  153. package/ts/Private/internal/AgoraMediaBaseInternal.ts +15 -0
  154. package/ts/Private/internal/AudioDeviceManagerInternal.ts +46 -0
  155. package/ts/Private/internal/IrisApiEngine.ts +598 -0
  156. package/ts/Private/internal/LocalSpatialAudioEngineInternal.ts +3 -0
  157. package/ts/Private/internal/MediaEngineInternal.ts +190 -0
  158. package/ts/Private/internal/MediaPlayerInternal.ts +311 -0
  159. package/ts/Private/internal/MediaRecorderInternal.ts +100 -0
  160. package/ts/Private/internal/MusicContentCenterInternal.ts +208 -0
  161. package/ts/Private/internal/RtcEngineExInternal.ts +647 -0
  162. package/ts/Private/ipc/main.ts +22 -0
  163. package/ts/Private/ipc/renderer.ts +21 -0
  164. package/ts/Private/ti/AgoraBase-ti.ts +16 -0
  165. package/ts/Private/ti/AgoraMediaBase-ti.ts +58 -0
  166. package/ts/Private/ti/AgoraMediaPlayerTypes-ti.ts +11 -0
  167. package/ts/Private/ti/IAgoraH265Transcoder-ti.ts +16 -0
  168. package/ts/Private/ti/IAgoraLog-ti.ts +11 -0
  169. package/ts/Private/ti/IAgoraMediaEngine-ti.ts +11 -0
  170. package/ts/Private/ti/IAgoraMediaPlayer-ti.ts +14 -0
  171. package/ts/Private/ti/IAgoraMediaPlayerSource-ti.ts +26 -0
  172. package/ts/Private/ti/IAgoraMediaRecorder-ti.ts +11 -0
  173. package/ts/Private/ti/IAgoraMediaStreamingSource-ti.ts +11 -0
  174. package/ts/Private/ti/IAgoraMusicContentCenter-ti.ts +18 -0
  175. package/ts/Private/ti/IAgoraRhythmPlayer-ti.ts +11 -0
  176. package/ts/Private/ti/IAgoraRtcEngine-ti.ts +119 -0
  177. package/ts/Private/ti/IAgoraRtcEngineEx-ti.ts +11 -0
  178. package/ts/Private/ti/IAgoraSpatialAudio-ti.ts +11 -0
  179. package/ts/Private/ti/IAudioDeviceManager-ti.ts +11 -0
  180. package/ts/Renderer/AgoraView.ts +235 -0
  181. package/ts/Renderer/CapabilityManager.ts +126 -0
  182. package/ts/Renderer/IRenderer.ts +158 -0
  183. package/ts/Renderer/IRendererCache.ts +96 -0
  184. package/ts/Renderer/RendererCache.ts +124 -0
  185. package/ts/Renderer/RendererManager.ts +400 -0
  186. package/ts/Renderer/WebCodecsRenderer/index.ts +145 -0
  187. package/ts/Renderer/WebCodecsRendererCache.ts +137 -0
  188. package/ts/Renderer/WebGLRenderer/index.ts +489 -0
  189. package/ts/Renderer/WebGLRenderer/webgl-utils.js +1510 -0
  190. package/ts/Renderer/YUVCanvasRenderer/index.ts +67 -0
  191. package/ts/Renderer/index.ts +1 -0
  192. package/ts/Types.ts +249 -0
  193. package/ts/Utils.ts +197 -0
  194. package/types/AgoraSdk.d.ts +40 -0
  195. package/types/AgoraSdk.d.ts.map +1 -0
  196. package/types/Decoder/gpu-utils.d.ts +21 -0
  197. package/types/Decoder/gpu-utils.d.ts.map +1 -0
  198. package/types/Decoder/index.d.ts +26 -0
  199. package/types/Decoder/index.d.ts.map +1 -0
  200. package/types/Private/AgoraBase.d.ts +5310 -0
  201. package/types/Private/AgoraBase.d.ts.map +1 -0
  202. package/types/Private/AgoraMediaBase.d.ts +1668 -0
  203. package/types/Private/AgoraMediaBase.d.ts.map +1 -0
  204. package/types/Private/AgoraMediaPlayerTypes.d.ts +453 -0
  205. package/types/Private/AgoraMediaPlayerTypes.d.ts.map +1 -0
  206. package/types/Private/IAgoraH265Transcoder.d.ts +28 -0
  207. package/types/Private/IAgoraH265Transcoder.d.ts.map +1 -0
  208. package/types/Private/IAgoraLog.d.ts +89 -0
  209. package/types/Private/IAgoraLog.d.ts.map +1 -0
  210. package/types/Private/IAgoraMediaEngine.d.ts +250 -0
  211. package/types/Private/IAgoraMediaEngine.d.ts.map +1 -0
  212. package/types/Private/IAgoraMediaPlayer.d.ts +648 -0
  213. package/types/Private/IAgoraMediaPlayer.d.ts.map +1 -0
  214. package/types/Private/IAgoraMediaPlayerSource.d.ts +109 -0
  215. package/types/Private/IAgoraMediaPlayerSource.d.ts.map +1 -0
  216. package/types/Private/IAgoraMediaRecorder.d.ts +20 -0
  217. package/types/Private/IAgoraMediaRecorder.d.ts.map +1 -0
  218. package/types/Private/IAgoraMediaStreamingSource.d.ts +42 -0
  219. package/types/Private/IAgoraMediaStreamingSource.d.ts.map +1 -0
  220. package/types/Private/IAgoraMusicContentCenter.d.ts +381 -0
  221. package/types/Private/IAgoraMusicContentCenter.d.ts.map +1 -0
  222. package/types/Private/IAgoraRhythmPlayer.d.ts +65 -0
  223. package/types/Private/IAgoraRhythmPlayer.d.ts.map +1 -0
  224. package/types/Private/IAgoraRtcEngine.d.ts +6103 -0
  225. package/types/Private/IAgoraRtcEngine.d.ts.map +1 -0
  226. package/types/Private/IAgoraRtcEngineEx.d.ts +741 -0
  227. package/types/Private/IAgoraRtcEngineEx.d.ts.map +1 -0
  228. package/types/Private/IAgoraSpatialAudio.d.ts +196 -0
  229. package/types/Private/IAgoraSpatialAudio.d.ts.map +1 -0
  230. package/types/Private/IAudioDeviceManager.d.ts +312 -0
  231. package/types/Private/IAudioDeviceManager.d.ts.map +1 -0
  232. package/types/Private/extension/AgoraBaseExtension.d.ts +14 -0
  233. package/types/Private/extension/AgoraBaseExtension.d.ts.map +1 -0
  234. package/types/Private/extension/AgoraMediaBaseExtension.d.ts +2 -0
  235. package/types/Private/extension/AgoraMediaBaseExtension.d.ts.map +1 -0
  236. package/types/Private/extension/AgoraMediaPlayerTypesExtension.d.ts +2 -0
  237. package/types/Private/extension/AgoraMediaPlayerTypesExtension.d.ts.map +1 -0
  238. package/types/Private/extension/IAgoraH265TranscoderExtension.d.ts +24 -0
  239. package/types/Private/extension/IAgoraH265TranscoderExtension.d.ts.map +1 -0
  240. package/types/Private/extension/IAgoraLogExtension.d.ts +2 -0
  241. package/types/Private/extension/IAgoraLogExtension.d.ts.map +1 -0
  242. package/types/Private/extension/IAgoraMediaEngineExtension.d.ts +40 -0
  243. package/types/Private/extension/IAgoraMediaEngineExtension.d.ts.map +1 -0
  244. package/types/Private/extension/IAgoraMediaPlayerExtension.d.ts +46 -0
  245. package/types/Private/extension/IAgoraMediaPlayerExtension.d.ts.map +1 -0
  246. package/types/Private/extension/IAgoraMediaPlayerSourceExtension.d.ts +2 -0
  247. package/types/Private/extension/IAgoraMediaPlayerSourceExtension.d.ts.map +1 -0
  248. package/types/Private/extension/IAgoraMediaRecorderExtension.d.ts +44 -0
  249. package/types/Private/extension/IAgoraMediaRecorderExtension.d.ts.map +1 -0
  250. package/types/Private/extension/IAgoraMusicContentCenterExtension.d.ts +20 -0
  251. package/types/Private/extension/IAgoraMusicContentCenterExtension.d.ts.map +1 -0
  252. package/types/Private/extension/IAgoraRhythmPlayerExtension.d.ts +2 -0
  253. package/types/Private/extension/IAgoraRhythmPlayerExtension.d.ts.map +1 -0
  254. package/types/Private/extension/IAgoraRtcEngineExExtension.d.ts +2 -0
  255. package/types/Private/extension/IAgoraRtcEngineExExtension.d.ts.map +1 -0
  256. package/types/Private/extension/IAgoraRtcEngineExtension.d.ts +42 -0
  257. package/types/Private/extension/IAgoraRtcEngineExtension.d.ts.map +1 -0
  258. package/types/Private/extension/IAgoraSpatialAudioExtension.d.ts +2 -0
  259. package/types/Private/extension/IAgoraSpatialAudioExtension.d.ts.map +1 -0
  260. package/types/Private/extension/IAudioDeviceManagerExtension.d.ts +2 -0
  261. package/types/Private/extension/IAudioDeviceManagerExtension.d.ts.map +1 -0
  262. package/types/Private/impl/AgoraBaseImpl.d.ts +3 -0
  263. package/types/Private/impl/AgoraBaseImpl.d.ts.map +1 -0
  264. package/types/Private/impl/AgoraMediaBaseImpl.d.ts +14 -0
  265. package/types/Private/impl/AgoraMediaBaseImpl.d.ts.map +1 -0
  266. package/types/Private/impl/IAgoraH265TranscoderImpl.d.ts +15 -0
  267. package/types/Private/impl/IAgoraH265TranscoderImpl.d.ts.map +1 -0
  268. package/types/Private/impl/IAgoraMediaEngineImpl.d.ts +46 -0
  269. package/types/Private/impl/IAgoraMediaEngineImpl.d.ts.map +1 -0
  270. package/types/Private/impl/IAgoraMediaPlayerImpl.d.ts +143 -0
  271. package/types/Private/impl/IAgoraMediaPlayerImpl.d.ts.map +1 -0
  272. package/types/Private/impl/IAgoraMediaPlayerSourceImpl.d.ts +3 -0
  273. package/types/Private/impl/IAgoraMediaPlayerSourceImpl.d.ts.map +1 -0
  274. package/types/Private/impl/IAgoraMediaRecorderImpl.d.ts +11 -0
  275. package/types/Private/impl/IAgoraMediaRecorderImpl.d.ts.map +1 -0
  276. package/types/Private/impl/IAgoraMusicContentCenterImpl.d.ts +67 -0
  277. package/types/Private/impl/IAgoraMusicContentCenterImpl.d.ts.map +1 -0
  278. package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts +116 -0
  279. package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts.map +1 -0
  280. package/types/Private/impl/IAgoraRtcEngineImpl.d.ts +628 -0
  281. package/types/Private/impl/IAgoraRtcEngineImpl.d.ts.map +1 -0
  282. package/types/Private/impl/IAgoraSpatialAudioImpl.d.ts +47 -0
  283. package/types/Private/impl/IAgoraSpatialAudioImpl.d.ts.map +1 -0
  284. package/types/Private/impl/IAudioDeviceManagerImpl.d.ts +65 -0
  285. package/types/Private/impl/IAudioDeviceManagerImpl.d.ts.map +1 -0
  286. package/types/Private/internal/AgoraH265TranscoderInternal.d.ts +14 -0
  287. package/types/Private/internal/AgoraH265TranscoderInternal.d.ts.map +1 -0
  288. package/types/Private/internal/AgoraMediaBaseInternal.d.ts +8 -0
  289. package/types/Private/internal/AgoraMediaBaseInternal.d.ts.map +1 -0
  290. package/types/Private/internal/AudioDeviceManagerInternal.d.ts +9 -0
  291. package/types/Private/internal/AudioDeviceManagerInternal.d.ts.map +1 -0
  292. package/types/Private/internal/IrisApiEngine.d.ts +69 -0
  293. package/types/Private/internal/IrisApiEngine.d.ts.map +1 -0
  294. package/types/Private/internal/LocalSpatialAudioEngineInternal.d.ts +4 -0
  295. package/types/Private/internal/LocalSpatialAudioEngineInternal.d.ts.map +1 -0
  296. package/types/Private/internal/MediaEngineInternal.d.ts +23 -0
  297. package/types/Private/internal/MediaEngineInternal.d.ts.map +1 -0
  298. package/types/Private/internal/MediaPlayerInternal.d.ts +30 -0
  299. package/types/Private/internal/MediaPlayerInternal.d.ts.map +1 -0
  300. package/types/Private/internal/MediaRecorderInternal.d.ts +16 -0
  301. package/types/Private/internal/MediaRecorderInternal.d.ts.map +1 -0
  302. package/types/Private/internal/MusicContentCenterInternal.d.ts +31 -0
  303. package/types/Private/internal/MusicContentCenterInternal.d.ts.map +1 -0
  304. package/types/Private/internal/RtcEngineExInternal.d.ts +73 -0
  305. package/types/Private/internal/RtcEngineExInternal.d.ts.map +1 -0
  306. package/types/Private/ipc/main.d.ts +2 -0
  307. package/types/Private/ipc/main.d.ts.map +1 -0
  308. package/types/Private/ipc/renderer.d.ts +3 -0
  309. package/types/Private/ipc/renderer.d.ts.map +1 -0
  310. package/types/Private/ti/AgoraBase-ti.d.ts +8 -0
  311. package/types/Private/ti/AgoraBase-ti.d.ts.map +1 -0
  312. package/types/Private/ti/AgoraMediaBase-ti.d.ts +15 -0
  313. package/types/Private/ti/AgoraMediaBase-ti.d.ts.map +1 -0
  314. package/types/Private/ti/AgoraMediaPlayerTypes-ti.d.ts +7 -0
  315. package/types/Private/ti/AgoraMediaPlayerTypes-ti.d.ts.map +1 -0
  316. package/types/Private/ti/IAgoraH265Transcoder-ti.d.ts +8 -0
  317. package/types/Private/ti/IAgoraH265Transcoder-ti.d.ts.map +1 -0
  318. package/types/Private/ti/IAgoraLog-ti.d.ts +7 -0
  319. package/types/Private/ti/IAgoraLog-ti.d.ts.map +1 -0
  320. package/types/Private/ti/IAgoraMediaEngine-ti.d.ts +7 -0
  321. package/types/Private/ti/IAgoraMediaEngine-ti.d.ts.map +1 -0
  322. package/types/Private/ti/IAgoraMediaPlayer-ti.d.ts +8 -0
  323. package/types/Private/ti/IAgoraMediaPlayer-ti.d.ts.map +1 -0
  324. package/types/Private/ti/IAgoraMediaPlayerSource-ti.d.ts +8 -0
  325. package/types/Private/ti/IAgoraMediaPlayerSource-ti.d.ts.map +1 -0
  326. package/types/Private/ti/IAgoraMediaRecorder-ti.d.ts +7 -0
  327. package/types/Private/ti/IAgoraMediaRecorder-ti.d.ts.map +1 -0
  328. package/types/Private/ti/IAgoraMediaStreamingSource-ti.d.ts +7 -0
  329. package/types/Private/ti/IAgoraMediaStreamingSource-ti.d.ts.map +1 -0
  330. package/types/Private/ti/IAgoraMusicContentCenter-ti.d.ts +8 -0
  331. package/types/Private/ti/IAgoraMusicContentCenter-ti.d.ts.map +1 -0
  332. package/types/Private/ti/IAgoraRhythmPlayer-ti.d.ts +7 -0
  333. package/types/Private/ti/IAgoraRhythmPlayer-ti.d.ts.map +1 -0
  334. package/types/Private/ti/IAgoraRtcEngine-ti.d.ts +10 -0
  335. package/types/Private/ti/IAgoraRtcEngine-ti.d.ts.map +1 -0
  336. package/types/Private/ti/IAgoraRtcEngineEx-ti.d.ts +7 -0
  337. package/types/Private/ti/IAgoraRtcEngineEx-ti.d.ts.map +1 -0
  338. package/types/Private/ti/IAgoraSpatialAudio-ti.d.ts +7 -0
  339. package/types/Private/ti/IAgoraSpatialAudio-ti.d.ts.map +1 -0
  340. package/types/Private/ti/IAudioDeviceManager-ti.d.ts +7 -0
  341. package/types/Private/ti/IAudioDeviceManager-ti.d.ts.map +1 -0
  342. package/types/Renderer/AgoraView.d.ts +76 -0
  343. package/types/Renderer/AgoraView.d.ts.map +1 -0
  344. package/types/Renderer/CapabilityManager.d.ts +20 -0
  345. package/types/Renderer/CapabilityManager.d.ts.map +1 -0
  346. package/types/Renderer/IRenderer.d.ts +20 -0
  347. package/types/Renderer/IRenderer.d.ts.map +1 -0
  348. package/types/Renderer/IRendererCache.d.ts +26 -0
  349. package/types/Renderer/IRendererCache.d.ts.map +1 -0
  350. package/types/Renderer/RendererCache.d.ts +24 -0
  351. package/types/Renderer/RendererCache.d.ts.map +1 -0
  352. package/types/Renderer/RendererManager.d.ts +66 -0
  353. package/types/Renderer/RendererManager.d.ts.map +1 -0
  354. package/types/Renderer/WebCodecsRenderer/index.d.ts +14 -0
  355. package/types/Renderer/WebCodecsRenderer/index.d.ts.map +1 -0
  356. package/types/Renderer/WebCodecsRendererCache.d.ts +15 -0
  357. package/types/Renderer/WebCodecsRendererCache.d.ts.map +1 -0
  358. package/types/Renderer/WebGLRenderer/index.d.ts +27 -0
  359. package/types/Renderer/WebGLRenderer/index.d.ts.map +1 -0
  360. package/types/Renderer/WebGLRenderer/webgl-utils.d.ts +1 -0
  361. package/types/Renderer/WebGLRenderer/webgl-utils.d.ts.map +1 -0
  362. package/types/Renderer/YUVCanvasRenderer/index.d.ts +9 -0
  363. package/types/Renderer/YUVCanvasRenderer/index.d.ts.map +1 -0
  364. package/types/Renderer/index.d.ts +2 -0
  365. package/types/Renderer/index.d.ts.map +1 -0
  366. package/types/Types.d.ts +177 -0
  367. package/types/Types.d.ts.map +1 -0
  368. package/types/Utils.d.ts +50 -0
  369. package/types/Utils.d.ts.map +1 -0
@@ -0,0 +1,400 @@
1
+ import createAgoraRtcEngine from '../AgoraSdk';
2
+ import {
3
+ VideoMirrorModeType,
4
+ VideoStreamType,
5
+ VideoViewSetupMode,
6
+ } from '../Private/AgoraBase';
7
+ import {
8
+ RenderModeType,
9
+ VideoModulePosition,
10
+ VideoSourceType,
11
+ } from '../Private/AgoraMediaBase';
12
+ import {
13
+ RendererCacheContext,
14
+ RendererCacheType,
15
+ RendererContext,
16
+ RendererType,
17
+ } from '../Types';
18
+ import { AgoraEnv, isSupportWebGL, logDebug } from '../Utils';
19
+
20
+ import { IRenderer } from './IRenderer';
21
+ import { generateRendererCacheKey, isUseConnection } from './IRendererCache';
22
+ import { RendererCache } from './RendererCache';
23
+ import { WebCodecsRenderer } from './WebCodecsRenderer';
24
+ import { WebCodecsRendererCache } from './WebCodecsRendererCache';
25
+ import { WebGLFallback, WebGLRenderer } from './WebGLRenderer';
26
+ import { YUVCanvasRenderer } from './YUVCanvasRenderer';
27
+
28
+ /**
29
+ * @ignore
30
+ */
31
+ export class RendererManager {
32
+ /**
33
+ * @ignore
34
+ */
35
+ private renderingFps: number;
36
+ /**
37
+ * @ignore
38
+ */
39
+ private _currentFrameCount: number;
40
+ /**
41
+ * @ignore
42
+ */
43
+ private _previousFirstFrameTime: number;
44
+ /**
45
+ * @ignore
46
+ */
47
+ private _renderingTimer?: number;
48
+ /**
49
+ * @ignore
50
+ */
51
+ private _rendererCaches: RendererCacheType[];
52
+ /**
53
+ * @ignore
54
+ */
55
+ private _context: RendererContext;
56
+
57
+ /**
58
+ * @ignore
59
+ */
60
+ private rendererType: RendererType;
61
+
62
+ /**
63
+ * Currently, the remote video frame is observed in the pre-renderer position and you can not change it.
64
+ * the local video frame is observed in the pre-encoder position by default, and you can change it.
65
+ * @ignore
66
+ */
67
+ private defaultObservedFramePosition: number =
68
+ VideoModulePosition.PositionPreRenderer |
69
+ VideoModulePosition.PositionPreEncoder;
70
+
71
+ constructor() {
72
+ this.renderingFps = 15;
73
+ this._currentFrameCount = 0;
74
+ this._previousFirstFrameTime = 0;
75
+ this._rendererCaches = [];
76
+ this._context = {
77
+ renderMode: RenderModeType.RenderModeHidden,
78
+ mirrorMode: VideoMirrorModeType.VideoMirrorModeDisabled,
79
+ };
80
+ this.rendererType = isSupportWebGL()
81
+ ? RendererType.WEBGL
82
+ : RendererType.SOFTWARE;
83
+ }
84
+
85
+ public setRenderingFps(fps: number) {
86
+ this.renderingFps = fps;
87
+ if (this._renderingTimer) {
88
+ this.stopRendering();
89
+ this.startRendering();
90
+ }
91
+ }
92
+
93
+ public set defaultChannelId(channelId: string) {
94
+ this._context.channelId = channelId;
95
+ }
96
+
97
+ public get defaultChannelId(): string {
98
+ return this._context.channelId ?? '';
99
+ }
100
+
101
+ public get defaultRenderMode(): RenderModeType {
102
+ return this._context.renderMode!;
103
+ }
104
+
105
+ public get defaultMirrorMode(): VideoMirrorModeType {
106
+ return this._context.mirrorMode!;
107
+ }
108
+
109
+ public release(): void {
110
+ this.stopRendering();
111
+ this.clearRendererCache();
112
+ }
113
+
114
+ private presetRendererContext(context: RendererContext): RendererContext {
115
+ //this is for preset default value
116
+ context.renderMode = context.renderMode || this.defaultRenderMode;
117
+ context.mirrorMode = context.mirrorMode || this.defaultMirrorMode;
118
+ context.useWebCodecsDecoder = context.useWebCodecsDecoder || false;
119
+ context.enableFps = context.enableFps || false;
120
+ context.position = context.position || this.defaultObservedFramePosition;
121
+
122
+ if (!AgoraEnv.CapabilityManager?.webCodecsDecoderEnabled) {
123
+ context.useWebCodecsDecoder = false;
124
+ }
125
+
126
+ switch (context.sourceType) {
127
+ case VideoSourceType.VideoSourceRemote:
128
+ if (context.uid === undefined) {
129
+ throw new Error('uid is required');
130
+ }
131
+ context.channelId = context.channelId ?? this.defaultChannelId;
132
+ break;
133
+ case VideoSourceType.VideoSourceMediaPlayer:
134
+ if (context.mediaPlayerId === undefined) {
135
+ throw new Error('mediaPlayerId is required');
136
+ }
137
+ context.channelId = '';
138
+ context.uid = context.mediaPlayerId;
139
+ break;
140
+ case undefined:
141
+ if (context.uid) {
142
+ context.sourceType = VideoSourceType.VideoSourceRemote;
143
+ }
144
+ break;
145
+ default:
146
+ context.channelId = '';
147
+ context.uid = 0;
148
+ break;
149
+ }
150
+ return context;
151
+ }
152
+
153
+ public addOrRemoveRenderer(
154
+ context: RendererContext
155
+ ): RendererCacheType | undefined {
156
+ // To be compatible with the old API
157
+ let { setupMode = VideoViewSetupMode.VideoViewSetupAdd } = context;
158
+ if (!context.view) setupMode = VideoViewSetupMode.VideoViewSetupRemove;
159
+ switch (setupMode) {
160
+ case VideoViewSetupMode.VideoViewSetupAdd:
161
+ return this.addRendererToCache(context);
162
+ case VideoViewSetupMode.VideoViewSetupRemove:
163
+ this.removeRendererFromCache(context);
164
+ return undefined;
165
+ case VideoViewSetupMode.VideoViewSetupReplace:
166
+ this.removeRendererFromCache(context);
167
+ return this.addRendererToCache(context);
168
+ }
169
+ }
170
+
171
+ private addRendererToCache(
172
+ context: RendererContext
173
+ ): RendererCacheType | undefined {
174
+ const checkedContext = this.presetRendererContext(context);
175
+
176
+ if (!checkedContext.view) return undefined;
177
+
178
+ if (this.findRenderer(checkedContext.view)) {
179
+ throw new Error('You have already added this view to the renderer');
180
+ }
181
+
182
+ let rendererCache = this.getRendererCache(checkedContext);
183
+ if (!rendererCache) {
184
+ if (context.useWebCodecsDecoder) {
185
+ rendererCache = new WebCodecsRendererCache(checkedContext);
186
+ } else {
187
+ rendererCache = new RendererCache(checkedContext);
188
+ }
189
+ this._rendererCaches.push(rendererCache);
190
+ }
191
+ rendererCache.addRenderer(this.createRenderer(checkedContext));
192
+ if (!context.useWebCodecsDecoder) {
193
+ this.startRendering();
194
+ }
195
+ return rendererCache;
196
+ }
197
+
198
+ public removeRendererFromCache(context: RendererContext): void {
199
+ const checkedContext = this.presetRendererContext(context);
200
+
201
+ const rendererCache = this.getRendererCache(checkedContext);
202
+ if (!rendererCache) return;
203
+ if (checkedContext.view) {
204
+ const renderer = rendererCache.findRenderer(checkedContext.view);
205
+ if (!renderer) return;
206
+ rendererCache.removeRenderer(renderer);
207
+ } else {
208
+ rendererCache.removeRenderer();
209
+ }
210
+ if (rendererCache.renderers.length === 0) {
211
+ rendererCache.release();
212
+ this._rendererCaches.splice(
213
+ this._rendererCaches.indexOf(rendererCache),
214
+ 1
215
+ );
216
+ }
217
+ }
218
+
219
+ public clearRendererCache(): void {
220
+ for (const rendererCache of this._rendererCaches) {
221
+ rendererCache.release();
222
+ }
223
+ this._rendererCaches.splice(0);
224
+ }
225
+
226
+ public getRendererCache(
227
+ context: RendererContext
228
+ ): RendererCacheType | undefined {
229
+ return this._rendererCaches.find(
230
+ (cache) => cache.key === generateRendererCacheKey(context)
231
+ );
232
+ }
233
+
234
+ public getRenderers(context: RendererContext): IRenderer[] {
235
+ return this.getRendererCache(context)?.renderers || [];
236
+ }
237
+
238
+ public findRenderer(view: Element): IRenderer | undefined {
239
+ for (const rendererCache of this._rendererCaches) {
240
+ const renderer = rendererCache.findRenderer(view);
241
+ if (renderer) return renderer;
242
+ }
243
+ return undefined;
244
+ }
245
+
246
+ protected createRenderer(
247
+ context: RendererContext,
248
+ rendererType: RendererType = this.rendererType
249
+ ): IRenderer {
250
+ let renderer: IRenderer;
251
+ switch (rendererType) {
252
+ case RendererType.WEBGL:
253
+ if (context.useWebCodecsDecoder) {
254
+ renderer = new WebCodecsRenderer();
255
+ } else {
256
+ renderer = new WebGLRenderer(
257
+ this.handleWebGLFallback(context).bind(this)
258
+ );
259
+ renderer.bind(context.view);
260
+ }
261
+ break;
262
+ case RendererType.SOFTWARE:
263
+ renderer = new YUVCanvasRenderer();
264
+ renderer.bind(context.view);
265
+ break;
266
+ default:
267
+ throw new Error('Unknown renderer type');
268
+ }
269
+
270
+ renderer.setContext(context);
271
+ return renderer;
272
+ }
273
+
274
+ public startRendering(): void {
275
+ if (this._renderingTimer) return;
276
+
277
+ const renderingLooper = () => {
278
+ if (this._previousFirstFrameTime === 0) {
279
+ // Get the current time as the time of the first frame of per second
280
+ this._previousFirstFrameTime = performance.now();
281
+ // Reset the frame count
282
+ this._currentFrameCount = 0;
283
+ }
284
+
285
+ // Increase the frame count
286
+ ++this._currentFrameCount;
287
+
288
+ // Get the current time
289
+ const currentFrameTime = performance.now();
290
+ // Calculate the time difference between the current frame and the previous frame
291
+ const deltaTime = currentFrameTime - this._previousFirstFrameTime;
292
+ // Calculate the expected time of the current frame
293
+ const expectedTime = (this._currentFrameCount * 1000) / this.renderingFps;
294
+ logDebug(
295
+ new Date().toLocaleTimeString(),
296
+ 'currentFrameCount',
297
+ this._currentFrameCount,
298
+ 'expectedTime',
299
+ expectedTime,
300
+ 'deltaTime',
301
+ deltaTime
302
+ );
303
+
304
+ if (this._rendererCaches.length === 0) {
305
+ // If there is no renderer, stop rendering
306
+ this.stopRendering();
307
+ return;
308
+ }
309
+
310
+ // Render all renderers that do not use WebCodecs
311
+ for (const rendererCache of this._rendererCaches.filter(
312
+ (cache) => cache instanceof RendererCache
313
+ )) {
314
+ this.doRendering(rendererCache);
315
+ }
316
+
317
+ if (this._currentFrameCount >= this.renderingFps) {
318
+ this._previousFirstFrameTime = 0;
319
+ }
320
+
321
+ if (deltaTime < expectedTime) {
322
+ // If the time difference between the current frame and the previous frame is less than the expected time, then wait for the difference
323
+ this._renderingTimer = window.setTimeout(
324
+ renderingLooper,
325
+ expectedTime - deltaTime
326
+ );
327
+ } else {
328
+ // If the time difference between the current frame and the previous frame is greater than the expected time, then render immediately
329
+ renderingLooper();
330
+ }
331
+ };
332
+ renderingLooper();
333
+ }
334
+
335
+ public doRendering(rendererCache: RendererCacheType): void {
336
+ rendererCache.draw();
337
+ }
338
+
339
+ private handleWebGLFallback(context: RendererContext): WebGLFallback {
340
+ return (renderer: WebGLRenderer) => {
341
+ const renderers = this.getRenderers(context);
342
+ renderer.unbind();
343
+ const newRenderer = this.createRenderer(context, RendererType.SOFTWARE);
344
+ renderers.splice(renderers.indexOf(renderer), 1, newRenderer);
345
+ };
346
+ }
347
+
348
+ public handleWebCodecsFallback(context: RendererCacheContext): void {
349
+ let engine = createAgoraRtcEngine();
350
+ engine.getMediaEngine().unregisterVideoEncodedFrameObserver({});
351
+ if (context.uid) {
352
+ if (isUseConnection(context)) {
353
+ engine.setRemoteVideoSubscriptionOptionsEx(
354
+ context.uid,
355
+ {
356
+ type: VideoStreamType.VideoStreamHigh,
357
+ encodedFrameOnly: false,
358
+ },
359
+ {
360
+ channelId: context.channelId,
361
+ localUid: context.localUid,
362
+ }
363
+ );
364
+ } else {
365
+ engine.setRemoteVideoSubscriptionOptions(context.uid, {
366
+ type: VideoStreamType.VideoStreamHigh,
367
+ encodedFrameOnly: false,
368
+ });
369
+ }
370
+ }
371
+ AgoraEnv.enableWebCodecsDecoder = false;
372
+ AgoraEnv.CapabilityManager?.setWebCodecsDecoderEnabled(false);
373
+ let renderers = this.getRenderers(context);
374
+ for (let renderer of renderers) {
375
+ this.addOrRemoveRenderer({
376
+ ...renderer.context,
377
+ setupMode: VideoViewSetupMode.VideoViewSetupReplace,
378
+ });
379
+ }
380
+ }
381
+
382
+ public stopRendering(): void {
383
+ if (this._renderingTimer) {
384
+ window.clearTimeout(this._renderingTimer);
385
+ this._renderingTimer = undefined;
386
+ }
387
+ }
388
+
389
+ public setRendererContext(context: RendererContext): boolean {
390
+ const checkedContext = this.presetRendererContext(context);
391
+
392
+ for (const rendererCache of this._rendererCaches) {
393
+ const result = rendererCache.setRendererContext(checkedContext);
394
+ if (result) {
395
+ return true;
396
+ }
397
+ }
398
+ return false;
399
+ }
400
+ }
@@ -0,0 +1,145 @@
1
+ import { VideoFrame } from '../../Private/AgoraMediaBase';
2
+ import { CodecConfigInfo, RendererType } from '../../Types';
3
+ import { getContextByCanvas } from '../../Utils';
4
+ import { IRenderer } from '../IRenderer';
5
+
6
+ export class WebCodecsRenderer extends IRenderer {
7
+ gl?: WebGLRenderingContext | WebGL2RenderingContext | null;
8
+ // eslint-disable-next-line auto-import/auto-import
9
+ offscreenCanvas: OffscreenCanvas | undefined;
10
+
11
+ constructor() {
12
+ super();
13
+ this.rendererType = RendererType.WEBCODECSRENDERER;
14
+ }
15
+
16
+ static vertexShaderSource = `
17
+ attribute vec2 xy;
18
+ varying highp vec2 uv;
19
+ void main(void) {
20
+ gl_Position = vec4(xy, 0.0, 1.0);
21
+ // Map vertex coordinates (-1 to +1) to UV coordinates (0 to 1).
22
+ // UV coordinates are Y-flipped relative to vertex coordinates.
23
+ uv = vec2((1.0 + xy.x) / 2.0, (1.0 - xy.y) / 2.0);
24
+ }
25
+ `;
26
+ static fragmentShaderSource = `
27
+ varying highp vec2 uv;
28
+ uniform sampler2D texture;
29
+ void main(void) {
30
+ gl_FragColor = texture2D(texture, uv);
31
+ }
32
+ `;
33
+
34
+ bind(element: HTMLElement) {
35
+ super.bind(element);
36
+ if (!this.canvas) return;
37
+ this.offscreenCanvas = this.canvas.transferControlToOffscreen();
38
+ this.gl = getContextByCanvas(this.offscreenCanvas);
39
+ if (!this.gl) return;
40
+ const vertexShader = this.gl.createShader(this.gl.VERTEX_SHADER);
41
+ if (!vertexShader) return;
42
+ this.gl.shaderSource(vertexShader, WebCodecsRenderer.vertexShaderSource);
43
+ this.gl.compileShader(vertexShader);
44
+ if (!this.gl.getShaderParameter(vertexShader, this.gl.COMPILE_STATUS)) {
45
+ throw this.gl.getShaderInfoLog(vertexShader);
46
+ }
47
+ const fragmentShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);
48
+ if (!fragmentShader) return;
49
+ this.gl.shaderSource(
50
+ fragmentShader,
51
+ WebCodecsRenderer.fragmentShaderSource
52
+ );
53
+ this.gl.compileShader(fragmentShader);
54
+ if (!this.gl.getShaderParameter(fragmentShader, this.gl.COMPILE_STATUS)) {
55
+ throw this.gl.getShaderInfoLog(fragmentShader);
56
+ }
57
+ const shaderProgram = this.gl.createProgram();
58
+ if (!shaderProgram) return;
59
+ this.gl.attachShader(shaderProgram, vertexShader);
60
+ this.gl.attachShader(shaderProgram, fragmentShader);
61
+ this.gl.linkProgram(shaderProgram);
62
+ if (!this.gl.getProgramParameter(shaderProgram, this.gl.LINK_STATUS)) {
63
+ throw this.gl.getProgramInfoLog(shaderProgram);
64
+ }
65
+ this.gl.useProgram(shaderProgram);
66
+ // Vertex coordinates, clockwise from bottom-left.
67
+ const vertexBuffer = this.gl.createBuffer();
68
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, vertexBuffer);
69
+ this.gl.bufferData(
70
+ this.gl.ARRAY_BUFFER,
71
+ new Float32Array([-1.0, -1.0, -1.0, +1.0, +1.0, +1.0, +1.0, -1.0]),
72
+ this.gl.STATIC_DRAW
73
+ );
74
+ const xyLocation = this.gl.getAttribLocation(shaderProgram, 'xy');
75
+ this.gl.vertexAttribPointer(xyLocation, 2, this.gl.FLOAT, false, 0, 0);
76
+ this.gl.enableVertexAttribArray(xyLocation);
77
+ // Create one texture to upload frames to.
78
+ const texture = this.gl.createTexture();
79
+ this.gl.bindTexture(this.gl.TEXTURE_2D, texture);
80
+ this.gl.texParameteri(
81
+ this.gl.TEXTURE_2D,
82
+ this.gl.TEXTURE_MAG_FILTER,
83
+ this.gl.NEAREST
84
+ );
85
+ this.gl.texParameteri(
86
+ this.gl.TEXTURE_2D,
87
+ this.gl.TEXTURE_MIN_FILTER,
88
+ this.gl.NEAREST
89
+ );
90
+ this.gl.texParameteri(
91
+ this.gl.TEXTURE_2D,
92
+ this.gl.TEXTURE_WRAP_S,
93
+ this.gl.CLAMP_TO_EDGE
94
+ );
95
+ this.gl.texParameteri(
96
+ this.gl.TEXTURE_2D,
97
+ this.gl.TEXTURE_WRAP_T,
98
+ this.gl.CLAMP_TO_EDGE
99
+ );
100
+ }
101
+
102
+ drawFrame(frame: any, _codecConfig: CodecConfigInfo) {
103
+ if (!this.offscreenCanvas || !frame) return;
104
+
105
+ this.offscreenCanvas.width = _codecConfig.codedWidth!;
106
+ this.offscreenCanvas.height = _codecConfig.codedHeight!;
107
+
108
+ this.updateRenderMode();
109
+ this.rotateCanvas({
110
+ rotation: _codecConfig.rotation,
111
+ });
112
+ if (!this.gl) return;
113
+
114
+ if (this.gl) {
115
+ // Upload the frame.
116
+ this.gl.texImage2D(
117
+ this.gl.TEXTURE_2D,
118
+ 0,
119
+ this.gl.RGBA,
120
+ this.gl.RGBA,
121
+ this.gl.UNSIGNED_BYTE,
122
+ frame
123
+ );
124
+ frame.close();
125
+ // Configure and clear the drawing area.
126
+ this.gl.viewport(
127
+ 0,
128
+ 0,
129
+ this.gl.drawingBufferWidth,
130
+ this.gl.drawingBufferHeight
131
+ );
132
+ this.gl.clearColor(0.0, 0.0, 0.0, 0.0);
133
+ this.gl.clear(this.gl.COLOR_BUFFER_BIT);
134
+ // Draw the frame.
135
+ this.gl.drawArrays(this.gl.TRIANGLE_FAN, 0, 4);
136
+ }
137
+ super.drawFrame();
138
+ this.getFps();
139
+ }
140
+
141
+ protected override rotateCanvas({ rotation }: VideoFrame) {
142
+ if (!this.offscreenCanvas || !this.canvas) return;
143
+ this.canvas.style.transform += ` rotateZ(${rotation}deg)`;
144
+ }
145
+ }
@@ -0,0 +1,137 @@
1
+ import createAgoraRtcEngine from '../AgoraSdk';
2
+ import { WebCodecsDecoder } from '../Decoder/index';
3
+ import { EncodedVideoFrameInfo, VideoStreamType } from '../Private/AgoraBase';
4
+ import { IRtcEngineEx } from '../Private/IAgoraRtcEngineEx';
5
+ import { AgoraElectronBridge } from '../Private/internal/IrisApiEngine';
6
+
7
+ import { RendererContext, RendererType } from '../Types';
8
+ import { AgoraEnv, logInfo } from '../Utils';
9
+
10
+ import { IRendererCache, isUseConnection } from './IRendererCache';
11
+ import { WebCodecsRenderer } from './WebCodecsRenderer/index';
12
+
13
+ export class WebCodecsRendererCache extends IRendererCache {
14
+ private _decoder?: WebCodecsDecoder | null;
15
+ private _engine?: IRtcEngineEx;
16
+ private _firstFrame = true;
17
+
18
+ constructor(context: RendererContext) {
19
+ super(context);
20
+ this._engine = createAgoraRtcEngine();
21
+ this._decoder = new WebCodecsDecoder(
22
+ this.renderers as WebCodecsRenderer[],
23
+ this.onDecoderError.bind(this),
24
+ context
25
+ );
26
+ this.draw();
27
+ }
28
+
29
+ onDecoderError(e: any) {
30
+ logInfo('webCodecsDecoder decode failed, fallback to native decoder', e);
31
+ AgoraEnv.AgoraRendererManager?.handleWebCodecsFallback(this.cacheContext);
32
+ }
33
+
34
+ onEncodedVideoFrameReceived(...[data, buffer]: any) {
35
+ let _data: any;
36
+ try {
37
+ _data = JSON.parse(data) ?? {};
38
+ } catch (e) {
39
+ _data = {};
40
+ }
41
+ if (
42
+ Object.keys(_data).length === 0 ||
43
+ !this._decoder ||
44
+ this.cacheContext.uid !== _data.uid
45
+ )
46
+ return;
47
+ if (this._firstFrame) {
48
+ for (let renderer of this.renderers) {
49
+ if (renderer.rendererType !== RendererType.WEBCODECSRENDERER) {
50
+ continue;
51
+ }
52
+ renderer.bind(renderer.context.view);
53
+ }
54
+
55
+ try {
56
+ this._decoder.decoderConfigure(_data.videoEncodedFrameInfo);
57
+ } catch (error: any) {
58
+ logInfo(error);
59
+ return;
60
+ }
61
+ this._firstFrame = false;
62
+ }
63
+ if (this.shouldFallback(_data.videoEncodedFrameInfo)) {
64
+ AgoraEnv.AgoraRendererManager?.handleWebCodecsFallback(this.cacheContext);
65
+ } else {
66
+ this._decoder.decodeFrame(
67
+ buffer,
68
+ _data.videoEncodedFrameInfo,
69
+ new Date().getTime()
70
+ );
71
+ }
72
+ }
73
+
74
+ public draw() {
75
+ if (isUseConnection(this.cacheContext)) {
76
+ this._engine?.setRemoteVideoSubscriptionOptionsEx(
77
+ this.cacheContext.uid!,
78
+ {
79
+ type: VideoStreamType.VideoStreamHigh,
80
+ encodedFrameOnly: true,
81
+ },
82
+ {
83
+ channelId: this.cacheContext.channelId,
84
+ localUid: this.cacheContext.localUid,
85
+ }
86
+ );
87
+ } else {
88
+ this._engine?.setRemoteVideoSubscriptionOptions(this.cacheContext.uid!, {
89
+ type: VideoStreamType.VideoStreamHigh,
90
+ encodedFrameOnly: true,
91
+ });
92
+ }
93
+ AgoraElectronBridge.OnEvent(
94
+ `call_back_with_encoded_video_frame_${this.cacheContext.uid}`,
95
+ (...params: any) => {
96
+ try {
97
+ this.onEncodedVideoFrameReceived(...params);
98
+ } catch (e) {
99
+ console.error(e);
100
+ }
101
+ }
102
+ );
103
+ }
104
+
105
+ public shouldFallback(frameInfo: EncodedVideoFrameInfo): boolean {
106
+ let shouldFallback = false;
107
+ if (!frameInfo.codecType) {
108
+ shouldFallback = true;
109
+ logInfo('codecType is not supported, fallback to native decoder');
110
+ } else {
111
+ const mapping =
112
+ AgoraEnv.CapabilityManager?.frameCodecMapping[frameInfo.codecType];
113
+ if (mapping === undefined) {
114
+ shouldFallback = true;
115
+ logInfo('codecType is not supported, fallback to native decoder');
116
+ } else if (
117
+ mapping.minWidth >= frameInfo.width! &&
118
+ mapping.minHeight >= frameInfo.height! &&
119
+ mapping.maxWidth <= frameInfo.width! &&
120
+ mapping.maxHeight <= frameInfo.height!
121
+ ) {
122
+ shouldFallback = true;
123
+ logInfo('frame size is not supported, fallback to native decoder');
124
+ }
125
+ }
126
+ return shouldFallback;
127
+ }
128
+
129
+ public release(): void {
130
+ AgoraElectronBridge.UnEvent(
131
+ `call_back_with_encoded_video_frame_${this.cacheContext.uid}`
132
+ );
133
+ this._decoder?.release();
134
+ this._decoder = null;
135
+ super.release();
136
+ }
137
+ }