shengwang-electron-sdk 4.6.2-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +391 -0
- package/LICENSE +21 -0
- package/README.md +146 -0
- package/gulpfile.js +52 -0
- package/js/AgoraSdk.js +54 -0
- package/js/Decoder/gpu-utils.js +74 -0
- package/js/Decoder/index.js +172 -0
- package/js/Private/AgoraBase.js +4292 -0
- package/js/Private/AgoraMediaBase.js +1017 -0
- package/js/Private/AgoraMediaPlayerTypes.js +320 -0
- package/js/Private/IAgoraH265Transcoder.js +36 -0
- package/js/Private/IAgoraLog.js +78 -0
- package/js/Private/IAgoraMediaEngine.js +32 -0
- package/js/Private/IAgoraMediaPlayer.js +16 -0
- package/js/Private/IAgoraMediaPlayerSource.js +3 -0
- package/js/Private/IAgoraMediaRecorder.js +10 -0
- package/js/Private/IAgoraMediaStreamingSource.js +74 -0
- package/js/Private/IAgoraMusicContentCenter.js +160 -0
- package/js/Private/IAgoraRhythmPlayer.js +62 -0
- package/js/Private/IAgoraRtcEngine.js +1042 -0
- package/js/Private/IAgoraRtcEngineEx.js +19 -0
- package/js/Private/IAgoraSpatialAudio.js +24 -0
- package/js/Private/IAudioDeviceManager.js +20 -0
- package/js/Private/extension/AgoraBaseExtension.js +3 -0
- package/js/Private/extension/AgoraMediaBaseExtension.js +2 -0
- package/js/Private/extension/AgoraMediaPlayerTypesExtension.js +2 -0
- package/js/Private/extension/IAgoraH265TranscoderExtension.js +2 -0
- package/js/Private/extension/IAgoraLogExtension.js +2 -0
- package/js/Private/extension/IAgoraMediaEngineExtension.js +2 -0
- package/js/Private/extension/IAgoraMediaPlayerExtension.js +2 -0
- package/js/Private/extension/IAgoraMediaPlayerSourceExtension.js +2 -0
- package/js/Private/extension/IAgoraMediaRecorderExtension.js +2 -0
- package/js/Private/extension/IAgoraMusicContentCenterExtension.js +2 -0
- package/js/Private/extension/IAgoraRhythmPlayerExtension.js +2 -0
- package/js/Private/extension/IAgoraRtcEngineExExtension.js +2 -0
- package/js/Private/extension/IAgoraRtcEngineExtension.js +2 -0
- package/js/Private/extension/IAgoraSpatialAudioExtension.js +2 -0
- package/js/Private/extension/IAudioDeviceManagerExtension.js +2 -0
- package/js/Private/impl/AgoraBaseImpl.js +23 -0
- package/js/Private/impl/AgoraMediaBaseImpl.js +149 -0
- package/js/Private/impl/IAgoraH265TranscoderImpl.js +116 -0
- package/js/Private/impl/IAgoraMediaEngineImpl.js +337 -0
- package/js/Private/impl/IAgoraMediaPlayerImpl.js +960 -0
- package/js/Private/impl/IAgoraMediaPlayerSourceImpl.js +73 -0
- package/js/Private/impl/IAgoraMediaRecorderImpl.js +47 -0
- package/js/Private/impl/IAgoraMusicContentCenterImpl.js +422 -0
- package/js/Private/impl/IAgoraRtcEngineExImpl.js +1178 -0
- package/js/Private/impl/IAgoraRtcEngineImpl.js +5428 -0
- package/js/Private/impl/IAgoraSpatialAudioImpl.js +358 -0
- package/js/Private/impl/IAudioDeviceManagerImpl.js +375 -0
- package/js/Private/internal/AgoraH265TranscoderInternal.js +62 -0
- package/js/Private/internal/AgoraMediaBaseInternal.js +15 -0
- package/js/Private/internal/AudioDeviceManagerInternal.js +44 -0
- package/js/Private/internal/IrisApiEngine.js +451 -0
- package/js/Private/internal/LocalSpatialAudioEngineInternal.js +7 -0
- package/js/Private/internal/MediaEngineInternal.js +122 -0
- package/js/Private/internal/MediaPlayerInternal.js +194 -0
- package/js/Private/internal/MediaRecorderInternal.js +70 -0
- package/js/Private/internal/MusicContentCenterInternal.js +139 -0
- package/js/Private/internal/RtcEngineExInternal.js +488 -0
- package/js/Private/ipc/main.js +21 -0
- package/js/Private/ipc/renderer.js +21 -0
- package/js/Private/ti/AgoraBase-ti.js +40 -0
- package/js/Private/ti/AgoraMediaBase-ti.js +75 -0
- package/js/Private/ti/AgoraMediaPlayerTypes-ti.js +5 -0
- package/js/Private/ti/IAgoraH265Transcoder-ti.js +40 -0
- package/js/Private/ti/IAgoraLog-ti.js +5 -0
- package/js/Private/ti/IAgoraMediaEngine-ti.js +5 -0
- package/js/Private/ti/IAgoraMediaPlayer-ti.js +38 -0
- package/js/Private/ti/IAgoraMediaPlayerSource-ti.js +50 -0
- package/js/Private/ti/IAgoraMediaRecorder-ti.js +5 -0
- package/js/Private/ti/IAgoraMediaStreamingSource-ti.js +5 -0
- package/js/Private/ti/IAgoraMusicContentCenter-ti.js +42 -0
- package/js/Private/ti/IAgoraRhythmPlayer-ti.js +5 -0
- package/js/Private/ti/IAgoraRtcEngine-ti.js +144 -0
- package/js/Private/ti/IAgoraRtcEngineEx-ti.js +5 -0
- package/js/Private/ti/IAgoraSpatialAudio-ti.js +5 -0
- package/js/Private/ti/IAudioDeviceManager-ti.js +5 -0
- package/js/Renderer/AgoraView.js +178 -0
- package/js/Renderer/CapabilityManager.js +99 -0
- package/js/Renderer/IRenderer.js +139 -0
- package/js/Renderer/IRendererCache.js +91 -0
- package/js/Renderer/RendererCache.js +252 -0
- package/js/Renderer/RendererManager.js +250 -0
- package/js/Renderer/WebCodecsRenderer/index.js +109 -0
- package/js/Renderer/WebCodecsRendererCache.js +127 -0
- package/js/Renderer/WebGLRenderer/index.js +467 -0
- package/js/Renderer/WebGLRenderer/webgl-utils.js +1337 -0
- package/js/Renderer/YUVCanvasRenderer/index.js +53 -0
- package/js/Renderer/index.js +17 -0
- package/js/Types.js +67 -0
- package/js/Utils.js +187 -0
- package/package.json +168 -0
- package/scripts/bootstrap.js +29 -0
- package/scripts/build.js +37 -0
- package/scripts/buildJS.js +14 -0
- package/scripts/checkElectron.js +43 -0
- package/scripts/clean.js +16 -0
- package/scripts/download.js +102 -0
- package/scripts/downloadPrebuild.js +199 -0
- package/scripts/getConfig.js +73 -0
- package/scripts/logger.js +32 -0
- package/scripts/synclib.js +69 -0
- package/scripts/util.js +47 -0
- package/scripts/zipBuild.js +40 -0
- package/ts/AgoraSdk.ts +44 -0
- package/ts/Decoder/gpu-utils.ts +92 -0
- package/ts/Decoder/index.ts +210 -0
- package/ts/Private/AgoraBase.ts +5941 -0
- package/ts/Private/AgoraMediaBase.ts +1814 -0
- package/ts/Private/AgoraMediaPlayerTypes.ts +467 -0
- package/ts/Private/IAgoraH265Transcoder.ts +73 -0
- package/ts/Private/IAgoraLog.ts +93 -0
- package/ts/Private/IAgoraMediaEngine.ts +321 -0
- package/ts/Private/IAgoraMediaPlayer.ts +759 -0
- package/ts/Private/IAgoraMediaPlayerSource.ts +137 -0
- package/ts/Private/IAgoraMediaRecorder.ts +65 -0
- package/ts/Private/IAgoraMediaStreamingSource.ts +81 -0
- package/ts/Private/IAgoraMusicContentCenter.ts +676 -0
- package/ts/Private/IAgoraRhythmPlayer.ts +67 -0
- package/ts/Private/IAgoraRtcEngine.ts +7909 -0
- package/ts/Private/IAgoraRtcEngineEx.ts +1138 -0
- package/ts/Private/IAgoraSpatialAudio.ts +248 -0
- package/ts/Private/IAudioDeviceManager.ts +351 -0
- package/ts/Private/extension/AgoraBaseExtension.ts +14 -0
- package/ts/Private/extension/AgoraMediaBaseExtension.ts +1 -0
- package/ts/Private/extension/AgoraMediaPlayerTypesExtension.ts +1 -0
- package/ts/Private/extension/IAgoraH265TranscoderExtension.ts +39 -0
- package/ts/Private/extension/IAgoraLogExtension.ts +1 -0
- package/ts/Private/extension/IAgoraMediaEngineExtension.ts +62 -0
- package/ts/Private/extension/IAgoraMediaPlayerExtension.ts +64 -0
- package/ts/Private/extension/IAgoraMediaPlayerSourceExtension.ts +1 -0
- package/ts/Private/extension/IAgoraMediaRecorderExtension.ts +59 -0
- package/ts/Private/extension/IAgoraMusicContentCenterExtension.ts +34 -0
- package/ts/Private/extension/IAgoraRhythmPlayerExtension.ts +1 -0
- package/ts/Private/extension/IAgoraRtcEngineExExtension.ts +1 -0
- package/ts/Private/extension/IAgoraRtcEngineExtension.ts +64 -0
- package/ts/Private/extension/IAgoraSpatialAudioExtension.ts +1 -0
- package/ts/Private/extension/IAudioDeviceManagerExtension.ts +1 -0
- package/ts/Private/impl/AgoraBaseImpl.ts +39 -0
- package/ts/Private/impl/AgoraMediaBaseImpl.ts +238 -0
- package/ts/Private/impl/IAgoraH265TranscoderImpl.ts +152 -0
- package/ts/Private/impl/IAgoraMediaEngineImpl.ts +491 -0
- package/ts/Private/impl/IAgoraMediaPlayerImpl.ts +1181 -0
- package/ts/Private/impl/IAgoraMediaPlayerSourceImpl.ts +94 -0
- package/ts/Private/impl/IAgoraMediaRecorderImpl.ts +59 -0
- package/ts/Private/impl/IAgoraMusicContentCenterImpl.ts +562 -0
- package/ts/Private/impl/IAgoraRtcEngineExImpl.ts +1912 -0
- package/ts/Private/impl/IAgoraRtcEngineImpl.ts +7738 -0
- package/ts/Private/impl/IAgoraSpatialAudioImpl.ts +495 -0
- package/ts/Private/impl/IAudioDeviceManagerImpl.ts +443 -0
- package/ts/Private/internal/AgoraH265TranscoderInternal.ts +97 -0
- package/ts/Private/internal/AgoraMediaBaseInternal.ts +15 -0
- package/ts/Private/internal/AudioDeviceManagerInternal.ts +46 -0
- package/ts/Private/internal/IrisApiEngine.ts +627 -0
- package/ts/Private/internal/LocalSpatialAudioEngineInternal.ts +3 -0
- package/ts/Private/internal/MediaEngineInternal.ts +190 -0
- package/ts/Private/internal/MediaPlayerInternal.ts +311 -0
- package/ts/Private/internal/MediaRecorderInternal.ts +100 -0
- package/ts/Private/internal/MusicContentCenterInternal.ts +208 -0
- package/ts/Private/internal/RtcEngineExInternal.ts +720 -0
- package/ts/Private/ipc/main.ts +22 -0
- package/ts/Private/ipc/renderer.ts +21 -0
- package/ts/Private/ti/AgoraBase-ti.ts +16 -0
- package/ts/Private/ti/AgoraMediaBase-ti.ts +58 -0
- package/ts/Private/ti/AgoraMediaPlayerTypes-ti.ts +11 -0
- package/ts/Private/ti/IAgoraH265Transcoder-ti.ts +16 -0
- package/ts/Private/ti/IAgoraLog-ti.ts +11 -0
- package/ts/Private/ti/IAgoraMediaEngine-ti.ts +11 -0
- package/ts/Private/ti/IAgoraMediaPlayer-ti.ts +14 -0
- package/ts/Private/ti/IAgoraMediaPlayerSource-ti.ts +26 -0
- package/ts/Private/ti/IAgoraMediaRecorder-ti.ts +11 -0
- package/ts/Private/ti/IAgoraMediaStreamingSource-ti.ts +11 -0
- package/ts/Private/ti/IAgoraMusicContentCenter-ti.ts +18 -0
- package/ts/Private/ti/IAgoraRhythmPlayer-ti.ts +11 -0
- package/ts/Private/ti/IAgoraRtcEngine-ti.ts +122 -0
- package/ts/Private/ti/IAgoraRtcEngineEx-ti.ts +11 -0
- package/ts/Private/ti/IAgoraSpatialAudio-ti.ts +11 -0
- package/ts/Private/ti/IAudioDeviceManager-ti.ts +11 -0
- package/ts/Renderer/AgoraView.ts +264 -0
- package/ts/Renderer/CapabilityManager.ts +126 -0
- package/ts/Renderer/IRenderer.ts +163 -0
- package/ts/Renderer/IRendererCache.ts +130 -0
- package/ts/Renderer/RendererCache.ts +323 -0
- package/ts/Renderer/RendererManager.ts +322 -0
- package/ts/Renderer/WebCodecsRenderer/index.ts +148 -0
- package/ts/Renderer/WebCodecsRendererCache.ts +153 -0
- package/ts/Renderer/WebGLRenderer/index.ts +695 -0
- package/ts/Renderer/WebGLRenderer/webgl-utils.js +1510 -0
- package/ts/Renderer/YUVCanvasRenderer/index.ts +80 -0
- package/ts/Renderer/index.ts +1 -0
- package/ts/Types.ts +254 -0
- package/ts/Utils.ts +198 -0
- package/types/AgoraSdk.d.ts +30 -0
- package/types/AgoraSdk.d.ts.map +1 -0
- package/types/Decoder/gpu-utils.d.ts +21 -0
- package/types/Decoder/gpu-utils.d.ts.map +1 -0
- package/types/Decoder/index.d.ts +26 -0
- package/types/Decoder/index.d.ts.map +1 -0
- package/types/Private/AgoraBase.d.ts +5728 -0
- package/types/Private/AgoraBase.d.ts.map +1 -0
- package/types/Private/AgoraMediaBase.d.ts +1717 -0
- package/types/Private/AgoraMediaBase.d.ts.map +1 -0
- package/types/Private/AgoraMediaPlayerTypes.d.ts +456 -0
- package/types/Private/AgoraMediaPlayerTypes.d.ts.map +1 -0
- package/types/Private/IAgoraH265Transcoder.d.ts +28 -0
- package/types/Private/IAgoraH265Transcoder.d.ts.map +1 -0
- package/types/Private/IAgoraLog.d.ts +91 -0
- package/types/Private/IAgoraLog.d.ts.map +1 -0
- package/types/Private/IAgoraMediaEngine.d.ts +255 -0
- package/types/Private/IAgoraMediaEngine.d.ts.map +1 -0
- package/types/Private/IAgoraMediaPlayer.d.ts +662 -0
- package/types/Private/IAgoraMediaPlayer.d.ts.map +1 -0
- package/types/Private/IAgoraMediaPlayerSource.d.ts +109 -0
- package/types/Private/IAgoraMediaPlayerSource.d.ts.map +1 -0
- package/types/Private/IAgoraMediaRecorder.d.ts +60 -0
- package/types/Private/IAgoraMediaRecorder.d.ts.map +1 -0
- package/types/Private/IAgoraMediaStreamingSource.d.ts +42 -0
- package/types/Private/IAgoraMediaStreamingSource.d.ts.map +1 -0
- package/types/Private/IAgoraMusicContentCenter.d.ts +602 -0
- package/types/Private/IAgoraMusicContentCenter.d.ts.map +1 -0
- package/types/Private/IAgoraRhythmPlayer.d.ts +65 -0
- package/types/Private/IAgoraRhythmPlayer.d.ts.map +1 -0
- package/types/Private/IAgoraRtcEngine.d.ts +6640 -0
- package/types/Private/IAgoraRtcEngine.d.ts.map +1 -0
- package/types/Private/IAgoraRtcEngineEx.d.ts +847 -0
- package/types/Private/IAgoraRtcEngineEx.d.ts.map +1 -0
- package/types/Private/IAgoraSpatialAudio.d.ts +194 -0
- package/types/Private/IAgoraSpatialAudio.d.ts.map +1 -0
- package/types/Private/IAudioDeviceManager.d.ts +321 -0
- package/types/Private/IAudioDeviceManager.d.ts.map +1 -0
- package/types/Private/extension/AgoraBaseExtension.d.ts +14 -0
- package/types/Private/extension/AgoraBaseExtension.d.ts.map +1 -0
- package/types/Private/extension/AgoraMediaBaseExtension.d.ts +2 -0
- package/types/Private/extension/AgoraMediaBaseExtension.d.ts.map +1 -0
- package/types/Private/extension/AgoraMediaPlayerTypesExtension.d.ts +2 -0
- package/types/Private/extension/AgoraMediaPlayerTypesExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraH265TranscoderExtension.d.ts +24 -0
- package/types/Private/extension/IAgoraH265TranscoderExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraLogExtension.d.ts +2 -0
- package/types/Private/extension/IAgoraLogExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraMediaEngineExtension.d.ts +40 -0
- package/types/Private/extension/IAgoraMediaEngineExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraMediaPlayerExtension.d.ts +46 -0
- package/types/Private/extension/IAgoraMediaPlayerExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraMediaPlayerSourceExtension.d.ts +2 -0
- package/types/Private/extension/IAgoraMediaPlayerSourceExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraMediaRecorderExtension.d.ts +44 -0
- package/types/Private/extension/IAgoraMediaRecorderExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraMusicContentCenterExtension.d.ts +20 -0
- package/types/Private/extension/IAgoraMusicContentCenterExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraRhythmPlayerExtension.d.ts +2 -0
- package/types/Private/extension/IAgoraRhythmPlayerExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraRtcEngineExExtension.d.ts +2 -0
- package/types/Private/extension/IAgoraRtcEngineExExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraRtcEngineExtension.d.ts +42 -0
- package/types/Private/extension/IAgoraRtcEngineExtension.d.ts.map +1 -0
- package/types/Private/extension/IAgoraSpatialAudioExtension.d.ts +2 -0
- package/types/Private/extension/IAgoraSpatialAudioExtension.d.ts.map +1 -0
- package/types/Private/extension/IAudioDeviceManagerExtension.d.ts +2 -0
- package/types/Private/extension/IAudioDeviceManagerExtension.d.ts.map +1 -0
- package/types/Private/impl/AgoraBaseImpl.d.ts +3 -0
- package/types/Private/impl/AgoraBaseImpl.d.ts.map +1 -0
- package/types/Private/impl/AgoraMediaBaseImpl.d.ts +14 -0
- package/types/Private/impl/AgoraMediaBaseImpl.d.ts.map +1 -0
- package/types/Private/impl/IAgoraH265TranscoderImpl.d.ts +15 -0
- package/types/Private/impl/IAgoraH265TranscoderImpl.d.ts.map +1 -0
- package/types/Private/impl/IAgoraMediaEngineImpl.d.ts +46 -0
- package/types/Private/impl/IAgoraMediaEngineImpl.d.ts.map +1 -0
- package/types/Private/impl/IAgoraMediaPlayerImpl.d.ts +145 -0
- package/types/Private/impl/IAgoraMediaPlayerImpl.d.ts.map +1 -0
- package/types/Private/impl/IAgoraMediaPlayerSourceImpl.d.ts +3 -0
- package/types/Private/impl/IAgoraMediaPlayerSourceImpl.d.ts.map +1 -0
- package/types/Private/impl/IAgoraMediaRecorderImpl.d.ts +11 -0
- package/types/Private/impl/IAgoraMediaRecorderImpl.d.ts.map +1 -0
- package/types/Private/impl/IAgoraMusicContentCenterImpl.d.ts +67 -0
- package/types/Private/impl/IAgoraMusicContentCenterImpl.d.ts.map +1 -0
- package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts +128 -0
- package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts.map +1 -0
- package/types/Private/impl/IAgoraRtcEngineImpl.d.ts +656 -0
- package/types/Private/impl/IAgoraRtcEngineImpl.d.ts.map +1 -0
- package/types/Private/impl/IAgoraSpatialAudioImpl.d.ts +47 -0
- package/types/Private/impl/IAgoraSpatialAudioImpl.d.ts.map +1 -0
- package/types/Private/impl/IAudioDeviceManagerImpl.d.ts +65 -0
- package/types/Private/impl/IAudioDeviceManagerImpl.d.ts.map +1 -0
- package/types/Private/internal/AgoraH265TranscoderInternal.d.ts +14 -0
- package/types/Private/internal/AgoraH265TranscoderInternal.d.ts.map +1 -0
- package/types/Private/internal/AgoraMediaBaseInternal.d.ts +8 -0
- package/types/Private/internal/AgoraMediaBaseInternal.d.ts.map +1 -0
- package/types/Private/internal/AudioDeviceManagerInternal.d.ts +9 -0
- package/types/Private/internal/AudioDeviceManagerInternal.d.ts.map +1 -0
- package/types/Private/internal/IrisApiEngine.d.ts +69 -0
- package/types/Private/internal/IrisApiEngine.d.ts.map +1 -0
- package/types/Private/internal/LocalSpatialAudioEngineInternal.d.ts +4 -0
- package/types/Private/internal/LocalSpatialAudioEngineInternal.d.ts.map +1 -0
- package/types/Private/internal/MediaEngineInternal.d.ts +23 -0
- package/types/Private/internal/MediaEngineInternal.d.ts.map +1 -0
- package/types/Private/internal/MediaPlayerInternal.d.ts +30 -0
- package/types/Private/internal/MediaPlayerInternal.d.ts.map +1 -0
- package/types/Private/internal/MediaRecorderInternal.d.ts +16 -0
- package/types/Private/internal/MediaRecorderInternal.d.ts.map +1 -0
- package/types/Private/internal/MusicContentCenterInternal.d.ts +31 -0
- package/types/Private/internal/MusicContentCenterInternal.d.ts.map +1 -0
- package/types/Private/internal/RtcEngineExInternal.d.ts +77 -0
- package/types/Private/internal/RtcEngineExInternal.d.ts.map +1 -0
- package/types/Private/ipc/main.d.ts +2 -0
- package/types/Private/ipc/main.d.ts.map +1 -0
- package/types/Private/ipc/renderer.d.ts +3 -0
- package/types/Private/ipc/renderer.d.ts.map +1 -0
- package/types/Private/ti/AgoraBase-ti.d.ts +8 -0
- package/types/Private/ti/AgoraBase-ti.d.ts.map +1 -0
- package/types/Private/ti/AgoraMediaBase-ti.d.ts +15 -0
- package/types/Private/ti/AgoraMediaBase-ti.d.ts.map +1 -0
- package/types/Private/ti/AgoraMediaPlayerTypes-ti.d.ts +7 -0
- package/types/Private/ti/AgoraMediaPlayerTypes-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraH265Transcoder-ti.d.ts +8 -0
- package/types/Private/ti/IAgoraH265Transcoder-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraLog-ti.d.ts +7 -0
- package/types/Private/ti/IAgoraLog-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraMediaEngine-ti.d.ts +7 -0
- package/types/Private/ti/IAgoraMediaEngine-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraMediaPlayer-ti.d.ts +8 -0
- package/types/Private/ti/IAgoraMediaPlayer-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraMediaPlayerSource-ti.d.ts +8 -0
- package/types/Private/ti/IAgoraMediaPlayerSource-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraMediaRecorder-ti.d.ts +7 -0
- package/types/Private/ti/IAgoraMediaRecorder-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraMediaStreamingSource-ti.d.ts +7 -0
- package/types/Private/ti/IAgoraMediaStreamingSource-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraMusicContentCenter-ti.d.ts +8 -0
- package/types/Private/ti/IAgoraMusicContentCenter-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraRhythmPlayer-ti.d.ts +7 -0
- package/types/Private/ti/IAgoraRhythmPlayer-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraRtcEngine-ti.d.ts +10 -0
- package/types/Private/ti/IAgoraRtcEngine-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraRtcEngineEx-ti.d.ts +7 -0
- package/types/Private/ti/IAgoraRtcEngineEx-ti.d.ts.map +1 -0
- package/types/Private/ti/IAgoraSpatialAudio-ti.d.ts +7 -0
- package/types/Private/ti/IAgoraSpatialAudio-ti.d.ts.map +1 -0
- package/types/Private/ti/IAudioDeviceManager-ti.d.ts +7 -0
- package/types/Private/ti/IAudioDeviceManager-ti.d.ts.map +1 -0
- package/types/Renderer/AgoraView.d.ts +82 -0
- package/types/Renderer/AgoraView.d.ts.map +1 -0
- package/types/Renderer/CapabilityManager.d.ts +20 -0
- package/types/Renderer/CapabilityManager.d.ts.map +1 -0
- package/types/Renderer/IRenderer.d.ts +20 -0
- package/types/Renderer/IRenderer.d.ts.map +1 -0
- package/types/Renderer/IRendererCache.d.ts +47 -0
- package/types/Renderer/IRendererCache.d.ts.map +1 -0
- package/types/Renderer/RendererCache.d.ts +51 -0
- package/types/Renderer/RendererCache.d.ts.map +1 -0
- package/types/Renderer/RendererManager.d.ts +53 -0
- package/types/Renderer/RendererManager.d.ts.map +1 -0
- package/types/Renderer/WebCodecsRenderer/index.d.ts +14 -0
- package/types/Renderer/WebCodecsRenderer/index.d.ts.map +1 -0
- package/types/Renderer/WebCodecsRendererCache.d.ts +22 -0
- package/types/Renderer/WebCodecsRendererCache.d.ts.map +1 -0
- package/types/Renderer/WebGLRenderer/index.d.ts +37 -0
- package/types/Renderer/WebGLRenderer/index.d.ts.map +1 -0
- package/types/Renderer/WebGLRenderer/webgl-utils.d.ts +1 -0
- package/types/Renderer/WebGLRenderer/webgl-utils.d.ts.map +1 -0
- package/types/Renderer/YUVCanvasRenderer/index.d.ts +10 -0
- package/types/Renderer/YUVCanvasRenderer/index.d.ts.map +1 -0
- package/types/Renderer/index.d.ts +2 -0
- package/types/Renderer/index.d.ts.map +1 -0
- package/types/Types.d.ts +182 -0
- package/types/Types.d.ts.map +1 -0
- package/types/Utils.d.ts +50 -0
- package/types/Utils.d.ts.map +1 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { VideoMirrorModeType, VideoViewSetupMode } from '../Private/AgoraBase';
|
|
2
|
+
import {
|
|
3
|
+
RenderModeType,
|
|
4
|
+
VideoModulePosition,
|
|
5
|
+
VideoSourceType,
|
|
6
|
+
} from '../Private/AgoraMediaBase';
|
|
7
|
+
import { AgoraEnv } from '../Utils';
|
|
8
|
+
|
|
9
|
+
const VIDEO_SOURCE_TYPE_STRING = 'video-source-type';
|
|
10
|
+
const UID_STRING = 'uid';
|
|
11
|
+
const CHANNEL_ID_STRING = 'channel-id';
|
|
12
|
+
const POSITION_STRING = 'position';
|
|
13
|
+
const RENDERER_CONTENT_MODE_STRING = 'renderer-content-mode';
|
|
14
|
+
const RENDERER_MIRROR_STRING = 'renderer-mirror';
|
|
15
|
+
const ENABLE_ALPHA_MASK_STRING = 'enable-alpha-mask';
|
|
16
|
+
|
|
17
|
+
const observedAttributes = [
|
|
18
|
+
VIDEO_SOURCE_TYPE_STRING,
|
|
19
|
+
UID_STRING,
|
|
20
|
+
CHANNEL_ID_STRING,
|
|
21
|
+
POSITION_STRING,
|
|
22
|
+
RENDERER_CONTENT_MODE_STRING,
|
|
23
|
+
RENDERER_MIRROR_STRING,
|
|
24
|
+
ENABLE_ALPHA_MASK_STRING,
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
declare global {
|
|
28
|
+
/**
|
|
29
|
+
* Attributes of the Agora custom element.
|
|
30
|
+
* You can use this custom element as follows:<agora-view video-source-type="{VideoSourceType.VideoSourceCamera}" channel-id="" uid="{0}" position="{VideoModulePosition.PositionPreRenderer}"></agora-view>
|
|
31
|
+
*/
|
|
32
|
+
interface AgoraView {
|
|
33
|
+
/**
|
|
34
|
+
* The type of the video source. See VideoSourceType .
|
|
35
|
+
*/
|
|
36
|
+
'video-source-type': VideoSourceType;
|
|
37
|
+
/**
|
|
38
|
+
* The ID of the remote user.
|
|
39
|
+
*/
|
|
40
|
+
'uid': number;
|
|
41
|
+
/**
|
|
42
|
+
* The channel name. This parameter signifies the channel in which users engage in real-time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters:
|
|
43
|
+
* All lowercase English letters: a to z.
|
|
44
|
+
* All uppercase English letters: A to Z.
|
|
45
|
+
* All numeric characters: 0 to 9.
|
|
46
|
+
* Space
|
|
47
|
+
* "!", "#", "$", "%", "&", "(", ")", "+", "-", ":", ";", "<", "= ", ".", ">", "?", "@", "[", "]", "^", "_", "{", "}", "|", "~", ","
|
|
48
|
+
*/
|
|
49
|
+
'channel-id': string;
|
|
50
|
+
/**
|
|
51
|
+
* The frame position of the video observer.
|
|
52
|
+
*/
|
|
53
|
+
'position': VideoModulePosition;
|
|
54
|
+
/**
|
|
55
|
+
* The video display mode.
|
|
56
|
+
*/
|
|
57
|
+
'renderer-content-mode': RenderModeType;
|
|
58
|
+
/**
|
|
59
|
+
* Whether to enable mirror mode when rendering video: true: Enable mirror mode.false: Do not enable mirror mode.
|
|
60
|
+
*/
|
|
61
|
+
'renderer-mirror': boolean;
|
|
62
|
+
/**
|
|
63
|
+
* The inline style of elements. See style .
|
|
64
|
+
*/
|
|
65
|
+
'style': any;
|
|
66
|
+
/**
|
|
67
|
+
* Whether to enable alpha mask rendering: true : Enable alpha mask rendering. false : (Default) Disable alpha mask rendering. Alpha mask rendering can create images with transparent effects and extract portraits from videos. When used in combination with other methods, you can implement effects such as portrait-in-picture and watermarking.
|
|
68
|
+
*/
|
|
69
|
+
'enable-alpha-mask': boolean;
|
|
70
|
+
}
|
|
71
|
+
namespace JSX {
|
|
72
|
+
/**
|
|
73
|
+
* The custom HTML elements defined by Agora.
|
|
74
|
+
*/
|
|
75
|
+
interface IntrinsicElements {
|
|
76
|
+
/**
|
|
77
|
+
* The name of the custom element, which supports rendering an AgoraView or HTMLElement object.
|
|
78
|
+
*/
|
|
79
|
+
'agora-view': AgoraView | HTMLElement;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export default class AgoraView extends HTMLElement {
|
|
85
|
+
isConnectedCallback = false;
|
|
86
|
+
static get observedAttributes() {
|
|
87
|
+
return observedAttributes;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
get sourceType(): VideoSourceType {
|
|
91
|
+
const number = Number(this.getAttribute(VIDEO_SOURCE_TYPE_STRING));
|
|
92
|
+
return isNaN(number) ? 0 : number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
set sourceType(val) {
|
|
96
|
+
if (val) {
|
|
97
|
+
this.setAttribute(VIDEO_SOURCE_TYPE_STRING, String(val));
|
|
98
|
+
} else {
|
|
99
|
+
this.removeAttribute(VIDEO_SOURCE_TYPE_STRING);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
get uid(): number {
|
|
104
|
+
const number = Number(this.getAttribute(UID_STRING));
|
|
105
|
+
return isNaN(number) ? 0 : number;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
set uid(val) {
|
|
109
|
+
if (val) {
|
|
110
|
+
this.setAttribute(UID_STRING, String(val));
|
|
111
|
+
} else {
|
|
112
|
+
this.removeAttribute(UID_STRING);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
get channelId(): string {
|
|
117
|
+
return this.getAttribute(CHANNEL_ID_STRING) || '';
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
set channelId(val) {
|
|
121
|
+
if (val) {
|
|
122
|
+
this.setAttribute(CHANNEL_ID_STRING, val);
|
|
123
|
+
} else {
|
|
124
|
+
this.removeAttribute(CHANNEL_ID_STRING);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
get position(): VideoModulePosition {
|
|
129
|
+
const number = Number(this.getAttribute(POSITION_STRING));
|
|
130
|
+
return isNaN(number)
|
|
131
|
+
? VideoModulePosition.PositionPreEncoder |
|
|
132
|
+
VideoModulePosition.PositionPreRenderer
|
|
133
|
+
: number;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
set position(val) {
|
|
137
|
+
if (val) {
|
|
138
|
+
this.setAttribute(POSITION_STRING, String(val));
|
|
139
|
+
} else {
|
|
140
|
+
this.removeAttribute(POSITION_STRING);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
get renderMode(): RenderModeType {
|
|
145
|
+
const number = Number(
|
|
146
|
+
this.getAttribute(RENDERER_CONTENT_MODE_STRING) ||
|
|
147
|
+
RenderModeType.RenderModeFit
|
|
148
|
+
);
|
|
149
|
+
return isNaN(number) ? RenderModeType.RenderModeFit : number;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
set renderMode(val) {
|
|
153
|
+
if (val) {
|
|
154
|
+
this.setAttribute(RENDERER_CONTENT_MODE_STRING, String(val));
|
|
155
|
+
} else {
|
|
156
|
+
this.removeAttribute(RENDERER_CONTENT_MODE_STRING);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
get renderMirror(): boolean {
|
|
161
|
+
return this.getAttribute(RENDERER_MIRROR_STRING) === 'true';
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
set renderMirror(val) {
|
|
165
|
+
if (val) {
|
|
166
|
+
this.setAttribute(RENDERER_MIRROR_STRING, String(val));
|
|
167
|
+
} else {
|
|
168
|
+
this.removeAttribute(RENDERER_MIRROR_STRING);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
get enableAlphaMask(): boolean {
|
|
173
|
+
return this.getAttribute(ENABLE_ALPHA_MASK_STRING) === 'true';
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
set enableAlphaMask(val) {
|
|
177
|
+
if (val) {
|
|
178
|
+
this.setAttribute(ENABLE_ALPHA_MASK_STRING, String(val));
|
|
179
|
+
} else {
|
|
180
|
+
this.removeAttribute(ENABLE_ALPHA_MASK_STRING);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
constructor() {
|
|
185
|
+
super();
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
initializeRender = () => {
|
|
189
|
+
const {
|
|
190
|
+
channelId,
|
|
191
|
+
uid,
|
|
192
|
+
sourceType,
|
|
193
|
+
position,
|
|
194
|
+
renderMode,
|
|
195
|
+
renderMirror,
|
|
196
|
+
enableAlphaMask,
|
|
197
|
+
} = this;
|
|
198
|
+
AgoraEnv.AgoraRendererManager?.addOrRemoveRenderer({
|
|
199
|
+
sourceType,
|
|
200
|
+
view: this,
|
|
201
|
+
uid,
|
|
202
|
+
channelId,
|
|
203
|
+
position,
|
|
204
|
+
renderMode,
|
|
205
|
+
mirrorMode: renderMirror
|
|
206
|
+
? VideoMirrorModeType.VideoMirrorModeEnabled
|
|
207
|
+
: VideoMirrorModeType.VideoMirrorModeDisabled,
|
|
208
|
+
setupMode: VideoViewSetupMode.VideoViewSetupReplace,
|
|
209
|
+
enableAlphaMask,
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
destroyRender = () => {
|
|
214
|
+
const { channelId, uid, sourceType, position, enableAlphaMask } = this;
|
|
215
|
+
AgoraEnv.AgoraRendererManager?.removeRendererFromCache({
|
|
216
|
+
channelId,
|
|
217
|
+
position,
|
|
218
|
+
uid,
|
|
219
|
+
sourceType,
|
|
220
|
+
view: this,
|
|
221
|
+
enableAlphaMask,
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
connectedCallback() {
|
|
226
|
+
this.isConnectedCallback = true;
|
|
227
|
+
this.initializeRender();
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
attributeChangedCallback(attrName: string, oldVal: any, newVal: any) {
|
|
231
|
+
if (!this.isConnectedCallback) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const isSetRenderOption = [
|
|
235
|
+
RENDERER_CONTENT_MODE_STRING,
|
|
236
|
+
RENDERER_MIRROR_STRING,
|
|
237
|
+
ENABLE_ALPHA_MASK_STRING,
|
|
238
|
+
].includes(attrName);
|
|
239
|
+
|
|
240
|
+
if (isSetRenderOption) {
|
|
241
|
+
AgoraEnv.AgoraRendererManager?.setRendererContext({
|
|
242
|
+
view: this,
|
|
243
|
+
renderMode: this.renderMode,
|
|
244
|
+
mirrorMode: this.renderMirror
|
|
245
|
+
? VideoMirrorModeType.VideoMirrorModeEnabled
|
|
246
|
+
: VideoMirrorModeType.VideoMirrorModeDisabled,
|
|
247
|
+
enableAlphaMask: this.enableAlphaMask,
|
|
248
|
+
});
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const isNeedReInitialize = observedAttributes.includes(attrName);
|
|
252
|
+
if (!isNeedReInitialize) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
this.initializeRender();
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
disconnectedCallback() {
|
|
259
|
+
this.isConnectedCallback = false;
|
|
260
|
+
this.destroyRender();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
window.customElements.define('agora-view', AgoraView);
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
2
|
+
|
|
3
|
+
import createAgoraRtcEngine from '../AgoraSdk';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
GpuInfo,
|
|
7
|
+
VideoDecodeAcceleratorSupportedProfile,
|
|
8
|
+
} from '../Decoder/gpu-utils';
|
|
9
|
+
import { VideoCodecType } from '../Private/AgoraBase';
|
|
10
|
+
import { IRtcEngineEx } from '../Private/IAgoraRtcEngineEx';
|
|
11
|
+
import { ipcSend } from '../Private/ipc/renderer';
|
|
12
|
+
|
|
13
|
+
import { IPCMessageType, VideoFallbackStrategy, codecMapping } from '../Types';
|
|
14
|
+
import { AgoraEnv, logError, logInfo } from '../Utils';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @ignore
|
|
18
|
+
*/
|
|
19
|
+
export class CapabilityManager {
|
|
20
|
+
gpuInfo: GpuInfo = new GpuInfo();
|
|
21
|
+
frameCodecMapping: {
|
|
22
|
+
[key in VideoCodecType]?: VideoDecodeAcceleratorSupportedProfile;
|
|
23
|
+
} = {};
|
|
24
|
+
webCodecsDecoderEnabled: boolean = AgoraEnv.enableWebCodecsDecoder;
|
|
25
|
+
private _engine: IRtcEngineEx;
|
|
26
|
+
|
|
27
|
+
setWebCodecsDecoderEnabled(enabled: boolean): void {
|
|
28
|
+
this.webCodecsDecoderEnabled = enabled;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
constructor() {
|
|
32
|
+
this._engine = createAgoraRtcEngine();
|
|
33
|
+
if (AgoraEnv.enableWebCodecsDecoder) {
|
|
34
|
+
this.getGpuInfo(() => {
|
|
35
|
+
if (
|
|
36
|
+
AgoraEnv.videoFallbackStrategy ===
|
|
37
|
+
VideoFallbackStrategy.PerformancePriority
|
|
38
|
+
) {
|
|
39
|
+
if (!this.isSupportedH265()) {
|
|
40
|
+
if (this.isSupportedH264()) {
|
|
41
|
+
this._engine.setParameters(
|
|
42
|
+
JSON.stringify({ 'che.video.h265_dec_enable': false })
|
|
43
|
+
);
|
|
44
|
+
logInfo(
|
|
45
|
+
'the videoFallbackStrategy is PerformancePriority, H265 is not supported, fallback to H264'
|
|
46
|
+
);
|
|
47
|
+
} else {
|
|
48
|
+
this.webCodecsDecoderEnabled = false;
|
|
49
|
+
logInfo(
|
|
50
|
+
'the videoFallbackStrategy is PerformancePriority, H264 and H265 are not supported, fallback to native decoder'
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
} else if (
|
|
55
|
+
AgoraEnv.videoFallbackStrategy ===
|
|
56
|
+
VideoFallbackStrategy.BandwidthPriority
|
|
57
|
+
) {
|
|
58
|
+
if (!this.isSupportedH265()) {
|
|
59
|
+
this.webCodecsDecoderEnabled = false;
|
|
60
|
+
logInfo(
|
|
61
|
+
'the videoFallbackStrategy is BandwidthPriority, H265 is not supported, fallback to native decoder'
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public getGpuInfo(callback?: () => void): void {
|
|
70
|
+
//getGpuInfo and videoDecoder is not supported in electron version < 22.0.0
|
|
71
|
+
//@ts-ignore
|
|
72
|
+
if (semver.lt(process.versions.electron, '22.0.0')) {
|
|
73
|
+
logError(
|
|
74
|
+
'WebCodecsDecoder is not supported in electron version < 22.0.0, please upgrade electron to 22.0.0 or later.'
|
|
75
|
+
);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
//@ts-ignore
|
|
79
|
+
if (process.type === 'renderer') {
|
|
80
|
+
ipcSend(IPCMessageType.AGORA_IPC_GET_GPU_INFO)
|
|
81
|
+
.then((result) => {
|
|
82
|
+
this.gpuInfo.videoDecodeAcceleratorSupportedProfile = result;
|
|
83
|
+
this.webCodecsDecoderEnabled = (AgoraEnv.enableWebCodecsDecoder &&
|
|
84
|
+
this.gpuInfo.videoDecodeAcceleratorSupportedProfile.length > 0)!;
|
|
85
|
+
|
|
86
|
+
result.forEach((profile: VideoDecodeAcceleratorSupportedProfile) => {
|
|
87
|
+
const match = codecMapping.find((item) =>
|
|
88
|
+
profile.codec.includes(item.profile)
|
|
89
|
+
);
|
|
90
|
+
if (match) {
|
|
91
|
+
//Normally, the range of compatible widths and heights should be the same under the same codec.
|
|
92
|
+
//there is no need to differentiate between different profiles. This could be optimized in the future.
|
|
93
|
+
this.frameCodecMapping[match.type] = {
|
|
94
|
+
codec: match.codec,
|
|
95
|
+
minWidth: profile.minWidth,
|
|
96
|
+
minHeight: profile.minHeight,
|
|
97
|
+
maxWidth: profile.maxWidth,
|
|
98
|
+
maxHeight: profile.maxHeight,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
callback && callback();
|
|
103
|
+
})
|
|
104
|
+
.catch((error) => {
|
|
105
|
+
logError(
|
|
106
|
+
'Failed to get GPU info, please check if you are already import agora-electron-sdk in the main process.',
|
|
107
|
+
error
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
} else {
|
|
111
|
+
logError('This function only works in renderer process');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public isSupportedH264(): boolean {
|
|
116
|
+
return this.frameCodecMapping[VideoCodecType.VideoCodecH264] !== undefined;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public isSupportedH265(): boolean {
|
|
120
|
+
return this.frameCodecMapping[VideoCodecType.VideoCodecH265] !== undefined;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
release(): void {
|
|
124
|
+
AgoraEnv.enableWebCodecsDecoder = false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { VideoMirrorModeType } from '../Private/AgoraBase';
|
|
2
|
+
import { RenderModeType, VideoFrame } from '../Private/AgoraMediaBase';
|
|
3
|
+
import { CodecConfigInfo, RendererContext, RendererType } from '../Types';
|
|
4
|
+
|
|
5
|
+
export abstract class IRenderer {
|
|
6
|
+
parentElement?: HTMLElement;
|
|
7
|
+
container?: HTMLElement;
|
|
8
|
+
canvas?: HTMLCanvasElement;
|
|
9
|
+
rendererType: RendererType | undefined;
|
|
10
|
+
context: RendererContext = {};
|
|
11
|
+
private _frameCount = 0;
|
|
12
|
+
private _startTime: number | null = null;
|
|
13
|
+
|
|
14
|
+
public bind(context: RendererContext) {
|
|
15
|
+
this.parentElement = context.view;
|
|
16
|
+
this.container = document.createElement('div');
|
|
17
|
+
Object.assign(this.container.style, {
|
|
18
|
+
width: '100%',
|
|
19
|
+
height: '100%',
|
|
20
|
+
display: 'flex',
|
|
21
|
+
justifyContent: 'center',
|
|
22
|
+
alignItems: 'center',
|
|
23
|
+
overflow: 'hidden',
|
|
24
|
+
});
|
|
25
|
+
this.parentElement?.appendChild(this.container);
|
|
26
|
+
this.canvas = document.createElement('canvas');
|
|
27
|
+
this.canvas.style.display = 'none';
|
|
28
|
+
this.container.appendChild(this.canvas);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public unbind() {
|
|
32
|
+
if (this.container && this.canvas?.parentNode === this.container) {
|
|
33
|
+
this.container.removeChild(this.canvas);
|
|
34
|
+
}
|
|
35
|
+
if (
|
|
36
|
+
this.parentElement &&
|
|
37
|
+
this.container?.parentNode === this.parentElement
|
|
38
|
+
) {
|
|
39
|
+
this.parentElement.removeChild(this.container);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
this.canvas = undefined;
|
|
43
|
+
this.container = undefined;
|
|
44
|
+
this.parentElement = undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public drawFrame(
|
|
48
|
+
uid: number,
|
|
49
|
+
_videoFrame?: VideoFrame,
|
|
50
|
+
_codecConfig?: CodecConfigInfo
|
|
51
|
+
): void {
|
|
52
|
+
if (!this.canvas) return;
|
|
53
|
+
if (this.canvas.style.display !== '') {
|
|
54
|
+
this.canvas.style.display = '';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public setContext(context: RendererContext) {
|
|
59
|
+
if (this.context.renderMode !== context.renderMode) {
|
|
60
|
+
this.context.renderMode = context.renderMode;
|
|
61
|
+
this.updateRenderMode();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (this.context.mirrorMode !== context.mirrorMode) {
|
|
65
|
+
this.context.mirrorMode = context.mirrorMode;
|
|
66
|
+
this.updateMirrorMode();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (this.context.enableAlphaMask !== context.enableAlphaMask) {
|
|
70
|
+
this.context.enableAlphaMask = context.enableAlphaMask;
|
|
71
|
+
}
|
|
72
|
+
this.context = { ...this.context, ...context };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
protected updateRenderMode(): void {
|
|
76
|
+
if (!this.canvas || !this.container) return;
|
|
77
|
+
|
|
78
|
+
const { clientWidth, clientHeight } = this.container;
|
|
79
|
+
const { width, height } = this.canvas;
|
|
80
|
+
|
|
81
|
+
const containerAspectRatio = clientWidth / clientHeight;
|
|
82
|
+
const canvasAspectRatio = width / height;
|
|
83
|
+
const widthScale = clientWidth / width;
|
|
84
|
+
const heightScale = clientHeight / height;
|
|
85
|
+
const isHidden =
|
|
86
|
+
this.context.renderMode === RenderModeType.RenderModeHidden;
|
|
87
|
+
|
|
88
|
+
let scale = 1;
|
|
89
|
+
// If container's aspect ratio is larger than canvas's aspect ratio
|
|
90
|
+
if (containerAspectRatio > canvasAspectRatio) {
|
|
91
|
+
// Scale canvas to fit container's width on hidden mode
|
|
92
|
+
// Scale canvas to fit container's height on fit mode
|
|
93
|
+
scale = isHidden ? widthScale : heightScale;
|
|
94
|
+
} else {
|
|
95
|
+
// Scale canvas to fit container's height on hidden mode
|
|
96
|
+
// Scale canvas to fit container's width on fit mode
|
|
97
|
+
scale = isHidden ? heightScale : widthScale;
|
|
98
|
+
}
|
|
99
|
+
this.canvas.style.transform = `scale(${scale})`;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
protected updateMirrorMode(): void {
|
|
103
|
+
if (!this.parentElement) return;
|
|
104
|
+
|
|
105
|
+
Object.assign(this.parentElement.style, {
|
|
106
|
+
transform:
|
|
107
|
+
this.context.mirrorMode === VideoMirrorModeType.VideoMirrorModeEnabled
|
|
108
|
+
? 'rotateY(180deg)'
|
|
109
|
+
: '',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
protected rotateCanvas({ width, height, rotation }: VideoFrame): void {
|
|
114
|
+
if (!this.canvas) return;
|
|
115
|
+
|
|
116
|
+
if (rotation === 0 || rotation === 180) {
|
|
117
|
+
this.canvas.width = width!;
|
|
118
|
+
this.canvas.height = height!;
|
|
119
|
+
} else if (rotation === 90 || rotation === 270) {
|
|
120
|
+
this.canvas.height = width!;
|
|
121
|
+
this.canvas.width = height!;
|
|
122
|
+
} else {
|
|
123
|
+
throw new Error(
|
|
124
|
+
`Invalid rotation: ${rotation}, only 0, 90, 180, 270 are supported`
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public getFps(): number {
|
|
130
|
+
let fps = 0;
|
|
131
|
+
if (!this.context.enableFps || !this.container) {
|
|
132
|
+
return fps;
|
|
133
|
+
}
|
|
134
|
+
if (this._startTime == null) {
|
|
135
|
+
this._startTime = performance.now();
|
|
136
|
+
} else {
|
|
137
|
+
const elapsed = (performance.now() - this._startTime) / 1000;
|
|
138
|
+
fps = ++this._frameCount / elapsed;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
let span = this.container.querySelector('span');
|
|
142
|
+
if (!span) {
|
|
143
|
+
span = document.createElement('span');
|
|
144
|
+
|
|
145
|
+
Object.assign(span.style, {
|
|
146
|
+
position: 'absolute',
|
|
147
|
+
bottom: '0',
|
|
148
|
+
left: '0',
|
|
149
|
+
zIndex: '10',
|
|
150
|
+
width: '55px',
|
|
151
|
+
background: '#fff',
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
this.container.style.position = 'relative';
|
|
155
|
+
|
|
156
|
+
this.container.appendChild(span);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
span.innerText = `fps: ${fps.toFixed(0)}`;
|
|
160
|
+
|
|
161
|
+
return fps;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { VideoSourceType } from '../Private/AgoraMediaBase';
|
|
2
|
+
import { RtcConnection } from '../Private/IAgoraRtcEngineEx';
|
|
3
|
+
|
|
4
|
+
import { RendererCacheContext, RendererContext } from '../Types';
|
|
5
|
+
|
|
6
|
+
import { IRenderer } from './IRenderer';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @ignore
|
|
10
|
+
*/
|
|
11
|
+
export function generateRendererCacheKey({
|
|
12
|
+
channelId,
|
|
13
|
+
uid,
|
|
14
|
+
sourceType,
|
|
15
|
+
}: RendererContext): string {
|
|
16
|
+
return `${channelId}_${uid}_${sourceType}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @ignore
|
|
21
|
+
*/
|
|
22
|
+
export function isUseConnection(context: RendererCacheContext): boolean {
|
|
23
|
+
// if RtcConnection is not undefined, then use connection
|
|
24
|
+
return !!context.channelId && context.localUid !== undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export abstract class IRendererCache {
|
|
28
|
+
renderers: IRenderer[];
|
|
29
|
+
cacheContext: RendererCacheContext;
|
|
30
|
+
callbackContext: { connection: RtcConnection; sourceType: VideoSourceType };
|
|
31
|
+
|
|
32
|
+
// 性能统计数据
|
|
33
|
+
public actualFps: number = 0;
|
|
34
|
+
public avgFrameTime: number = 0;
|
|
35
|
+
public maxFrameTime: number = 0;
|
|
36
|
+
public minFrameTime: number = 0;
|
|
37
|
+
public avgFrameInterval: number = 0;
|
|
38
|
+
public maxFrameInterval: number = 0;
|
|
39
|
+
public minFrameInterval: number = 0;
|
|
40
|
+
|
|
41
|
+
constructor({
|
|
42
|
+
channelId,
|
|
43
|
+
uid,
|
|
44
|
+
useWebCodecsDecoder,
|
|
45
|
+
enableFps,
|
|
46
|
+
sourceType,
|
|
47
|
+
localUid,
|
|
48
|
+
position,
|
|
49
|
+
enableAlphaMask,
|
|
50
|
+
}: RendererContext) {
|
|
51
|
+
this.renderers = [];
|
|
52
|
+
this.cacheContext = {
|
|
53
|
+
channelId,
|
|
54
|
+
uid,
|
|
55
|
+
useWebCodecsDecoder,
|
|
56
|
+
enableFps,
|
|
57
|
+
sourceType,
|
|
58
|
+
localUid,
|
|
59
|
+
position,
|
|
60
|
+
enableAlphaMask,
|
|
61
|
+
};
|
|
62
|
+
this.callbackContext = {
|
|
63
|
+
connection: { channelId, localUid },
|
|
64
|
+
sourceType: sourceType!,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public setCallbackContext(
|
|
69
|
+
connection: RtcConnection,
|
|
70
|
+
sourceType: VideoSourceType
|
|
71
|
+
): void {
|
|
72
|
+
this.callbackContext = { connection, sourceType };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public get key(): string {
|
|
76
|
+
return generateRendererCacheKey(this.cacheContext);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public abstract draw(): void;
|
|
80
|
+
|
|
81
|
+
public findRenderer(view: Element): IRenderer | undefined {
|
|
82
|
+
return this.renderers.find((renderer) => renderer.parentElement === view);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public addRenderer(renderer: IRenderer): void {
|
|
86
|
+
this.renderers.push(renderer);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Remove the specified renderer if it is specified, otherwise remove all renderers
|
|
91
|
+
*/
|
|
92
|
+
public removeRenderer(renderer?: IRenderer): void {
|
|
93
|
+
let start = 0;
|
|
94
|
+
let deleteCount = this.renderers.length;
|
|
95
|
+
if (renderer) {
|
|
96
|
+
start = this.renderers.indexOf(renderer);
|
|
97
|
+
if (start < 0) return;
|
|
98
|
+
deleteCount = 1;
|
|
99
|
+
}
|
|
100
|
+
this.renderers.splice(start, deleteCount).forEach((it) => it.unbind());
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public setRendererContext(context: RendererContext): boolean {
|
|
104
|
+
if (context.view) {
|
|
105
|
+
const renderer = this.findRenderer(context.view);
|
|
106
|
+
if (renderer) {
|
|
107
|
+
renderer.setContext(context);
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
} else {
|
|
112
|
+
this.renderers.forEach((it) => {
|
|
113
|
+
it.setContext(context);
|
|
114
|
+
});
|
|
115
|
+
return this.renderers.length > 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public abstract fetchVideoFrame(): {
|
|
120
|
+
hasMoreFrame: boolean;
|
|
121
|
+
needRender: boolean;
|
|
122
|
+
};
|
|
123
|
+
public abstract renderFrame(): void;
|
|
124
|
+
public abstract startRendering(): void;
|
|
125
|
+
public abstract stopRendering(): void;
|
|
126
|
+
|
|
127
|
+
public release(): void {
|
|
128
|
+
this.removeRenderer();
|
|
129
|
+
}
|
|
130
|
+
}
|