agora-electron-sdk 4.5.2 → 4.5.3-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +6 -3
- package/js/example/src/renderer/examples/advanced/VideoEffect/videoEffectHelpers.js +395 -0
- package/js/{AgoraSdk.js → ts/AgoraSdk.js} +2 -12
- package/js/{Decoder → ts/Decoder}/index.js +1 -1
- package/js/{Private → ts/Private}/AgoraBase.js +829 -674
- package/js/{Private → ts/Private}/AgoraMediaBase.js +154 -151
- package/js/{Private → ts/Private}/AgoraMediaPlayerTypes.js +58 -54
- package/js/{Private → ts/Private}/IAgoraLog.js +13 -13
- package/js/{Private → ts/Private}/IAgoraMediaEngine.js +4 -4
- package/js/{Private → ts/Private}/IAgoraMediaPlayer.js +2 -2
- package/js/{Private → ts/Private}/IAgoraMusicContentCenter.js +1 -1
- package/js/{Private → ts/Private}/IAgoraRhythmPlayer.js +13 -13
- package/js/{Private → ts/Private}/IAgoraRtcEngine.js +150 -94
- package/js/{Private → ts/Private}/IAgoraRtcEngineEx.js +3 -3
- package/js/{Private → ts/Private}/IAgoraSpatialAudio.js +4 -4
- package/js/{Private → ts/Private}/IAudioDeviceManager.js +2 -2
- package/js/{Private → ts/Private}/impl/IAgoraMediaPlayerImpl.js +10 -0
- package/js/{Private → ts/Private}/impl/IAgoraRtcEngineExImpl.js +74 -0
- package/js/{Private → ts/Private}/impl/IAgoraRtcEngineImpl.js +233 -1
- package/js/{Private → ts/Private}/internal/IrisApiEngine.js +45 -0
- package/js/{Private → ts/Private}/internal/RtcEngineExInternal.js +74 -4
- package/js/ts/Private/internal/VideoEffectObjectInternal.js +14 -0
- package/js/{Private → ts/Private}/ti/IAgoraRtcEngine-ti.js +2 -0
- package/js/{Renderer → ts/Renderer}/AgoraView.js +19 -2
- package/js/{Renderer → ts/Renderer}/IRenderer.js +7 -4
- package/js/{Renderer → ts/Renderer}/IRendererCache.js +17 -1
- package/js/ts/Renderer/RendererCache.js +252 -0
- package/js/{Renderer → ts/Renderer}/RendererManager.js +13 -64
- package/js/{Renderer → ts/Renderer}/WebCodecsRenderer/index.js +5 -5
- package/js/{Renderer → ts/Renderer}/WebCodecsRendererCache.js +13 -1
- package/js/{Renderer → ts/Renderer}/WebGLRenderer/index.js +179 -26
- package/js/{Renderer → ts/Renderer}/YUVCanvasRenderer/index.js +12 -5
- package/js/{Utils.js → ts/Utils.js} +7 -7
- package/package.json +25 -12
- package/scripts/checkElectron.js +4 -2
- package/scripts/download.js +102 -0
- package/scripts/downloadPrebuild.js +2 -1
- package/scripts/synclib.js +2 -2
- package/ts/AgoraSdk.ts +2 -12
- package/ts/Decoder/index.ts +5 -1
- package/ts/Private/AgoraBase.ts +1259 -1060
- package/ts/Private/AgoraMediaBase.ts +351 -324
- package/ts/Private/AgoraMediaPlayerTypes.ts +94 -91
- package/ts/Private/IAgoraLog.ts +20 -18
- package/ts/Private/IAgoraMediaEngine.ts +86 -81
- package/ts/Private/IAgoraMediaPlayer.ts +196 -181
- package/ts/Private/IAgoraMediaPlayerSource.ts +40 -40
- package/ts/Private/IAgoraMusicContentCenter.ts +3 -3
- package/ts/Private/IAgoraRhythmPlayer.ts +15 -15
- package/ts/Private/IAgoraRtcEngine.ts +2492 -2047
- package/ts/Private/IAgoraRtcEngineEx.ts +434 -335
- package/ts/Private/IAgoraSpatialAudio.ts +43 -45
- package/ts/Private/IAudioDeviceManager.ts +106 -97
- package/ts/Private/impl/IAgoraMediaPlayerImpl.ts +12 -0
- package/ts/Private/impl/IAgoraRtcEngineExImpl.ts +138 -0
- package/ts/Private/impl/IAgoraRtcEngineImpl.ts +331 -0
- package/ts/Private/internal/IrisApiEngine.ts +47 -0
- package/ts/Private/internal/RtcEngineExInternal.ts +106 -9
- package/ts/Private/internal/VideoEffectObjectInternal.ts +14 -0
- package/ts/Private/ti/IAgoraRtcEngine-ti.ts +2 -0
- package/ts/Renderer/AgoraView.ts +32 -3
- package/ts/Renderer/IRenderer.ts +8 -3
- package/ts/Renderer/IRendererCache.ts +33 -0
- package/ts/Renderer/RendererCache.ts +211 -12
- package/ts/Renderer/RendererManager.ts +21 -99
- package/ts/Renderer/WebCodecsRenderer/index.ts +9 -6
- package/ts/Renderer/WebCodecsRendererCache.ts +17 -1
- package/ts/Renderer/WebGLRenderer/index.ts +246 -40
- package/ts/Renderer/YUVCanvasRenderer/index.ts +29 -16
- package/ts/Types.ts +14 -9
- package/ts/Utils.ts +8 -7
- package/types/example/src/renderer/examples/advanced/VideoEffect/videoEffectHelpers.d.ts +168 -0
- package/types/example/src/renderer/examples/advanced/VideoEffect/videoEffectHelpers.d.ts.map +1 -0
- package/types/{AgoraSdk.d.ts → ts/AgoraSdk.d.ts} +2 -12
- package/types/ts/AgoraSdk.d.ts.map +1 -0
- package/types/ts/Decoder/gpu-utils.d.ts.map +1 -0
- package/types/ts/Decoder/index.d.ts.map +1 -0
- package/types/ts/Private/AgoraBase.d.ts +5504 -0
- package/types/ts/Private/AgoraBase.d.ts.map +1 -0
- package/types/ts/Private/AgoraMediaBase.d.ts +1695 -0
- package/types/ts/Private/AgoraMediaBase.d.ts.map +1 -0
- package/types/ts/Private/AgoraMediaPlayerTypes.d.ts +456 -0
- package/types/ts/Private/AgoraMediaPlayerTypes.d.ts.map +1 -0
- package/types/ts/Private/IAgoraH265Transcoder.d.ts.map +1 -0
- package/types/ts/Private/IAgoraLog.d.ts +91 -0
- package/types/ts/Private/IAgoraLog.d.ts.map +1 -0
- package/types/ts/Private/IAgoraMediaEngine.d.ts +255 -0
- package/types/ts/Private/IAgoraMediaEngine.d.ts.map +1 -0
- package/types/ts/Private/IAgoraMediaPlayer.d.ts +662 -0
- package/types/ts/Private/IAgoraMediaPlayer.d.ts.map +1 -0
- package/types/ts/Private/IAgoraMediaPlayerSource.d.ts +109 -0
- package/types/ts/Private/IAgoraMediaPlayerSource.d.ts.map +1 -0
- package/types/ts/Private/IAgoraMediaRecorder.d.ts.map +1 -0
- package/types/ts/Private/IAgoraMediaStreamingSource.d.ts.map +1 -0
- package/types/{Private → ts/Private}/IAgoraMusicContentCenter.d.ts +3 -3
- package/types/ts/Private/IAgoraMusicContentCenter.d.ts.map +1 -0
- package/types/ts/Private/IAgoraRhythmPlayer.d.ts +65 -0
- package/types/ts/Private/IAgoraRhythmPlayer.d.ts.map +1 -0
- package/types/ts/Private/IAgoraRtcEngine.d.ts +6504 -0
- package/types/ts/Private/IAgoraRtcEngine.d.ts.map +1 -0
- package/types/ts/Private/IAgoraRtcEngineEx.d.ts +817 -0
- package/types/ts/Private/IAgoraRtcEngineEx.d.ts.map +1 -0
- package/types/ts/Private/IAgoraSpatialAudio.d.ts +194 -0
- package/types/ts/Private/IAgoraSpatialAudio.d.ts.map +1 -0
- package/types/ts/Private/IAudioDeviceManager.d.ts +321 -0
- package/types/ts/Private/IAudioDeviceManager.d.ts.map +1 -0
- package/types/ts/Private/extension/AgoraBaseExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/AgoraMediaBaseExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/AgoraMediaPlayerTypesExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraH265TranscoderExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraLogExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraMediaEngineExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraMediaPlayerExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraMediaPlayerSourceExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraMediaRecorderExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraMusicContentCenterExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraRhythmPlayerExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraRtcEngineExExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraRtcEngineExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAgoraSpatialAudioExtension.d.ts.map +1 -0
- package/types/ts/Private/extension/IAudioDeviceManagerExtension.d.ts.map +1 -0
- package/types/ts/Private/impl/AgoraBaseImpl.d.ts.map +1 -0
- package/types/ts/Private/impl/AgoraMediaBaseImpl.d.ts.map +1 -0
- package/types/ts/Private/impl/IAgoraH265TranscoderImpl.d.ts.map +1 -0
- package/types/ts/Private/impl/IAgoraMediaEngineImpl.d.ts.map +1 -0
- package/types/{Private → ts/Private}/impl/IAgoraMediaPlayerImpl.d.ts +2 -0
- package/types/ts/Private/impl/IAgoraMediaPlayerImpl.d.ts.map +1 -0
- package/types/ts/Private/impl/IAgoraMediaPlayerSourceImpl.d.ts.map +1 -0
- package/types/ts/Private/impl/IAgoraMediaRecorderImpl.d.ts.map +1 -0
- package/types/ts/Private/impl/IAgoraMusicContentCenterImpl.d.ts.map +1 -0
- package/types/{Private → ts/Private}/impl/IAgoraRtcEngineExImpl.d.ts +7 -1
- package/types/ts/Private/impl/IAgoraRtcEngineExImpl.d.ts.map +1 -0
- package/types/{Private → ts/Private}/impl/IAgoraRtcEngineImpl.d.ts +27 -1
- package/types/ts/Private/impl/IAgoraRtcEngineImpl.d.ts.map +1 -0
- package/types/ts/Private/impl/IAgoraSpatialAudioImpl.d.ts.map +1 -0
- package/types/ts/Private/impl/IAudioDeviceManagerImpl.d.ts.map +1 -0
- package/types/ts/Private/internal/AgoraH265TranscoderInternal.d.ts.map +1 -0
- package/types/ts/Private/internal/AgoraMediaBaseInternal.d.ts.map +1 -0
- package/types/ts/Private/internal/AudioDeviceManagerInternal.d.ts.map +1 -0
- package/types/ts/Private/internal/IrisApiEngine.d.ts.map +1 -0
- package/types/ts/Private/internal/LocalSpatialAudioEngineInternal.d.ts.map +1 -0
- package/types/ts/Private/internal/MediaEngineInternal.d.ts.map +1 -0
- package/types/ts/Private/internal/MediaPlayerInternal.d.ts.map +1 -0
- package/types/ts/Private/internal/MediaRecorderInternal.d.ts.map +1 -0
- package/types/ts/Private/internal/MusicContentCenterInternal.d.ts.map +1 -0
- package/types/{Private → ts/Private}/internal/RtcEngineExInternal.d.ts +10 -4
- package/types/ts/Private/internal/RtcEngineExInternal.d.ts.map +1 -0
- package/types/ts/Private/internal/VideoEffectObjectInternal.d.ts +7 -0
- package/types/ts/Private/internal/VideoEffectObjectInternal.d.ts.map +1 -0
- package/types/{Private → ts/Private}/ipc/main.d.ts.map +1 -1
- package/types/ts/Private/ipc/renderer.d.ts.map +1 -0
- package/types/ts/Private/ti/AgoraBase-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/AgoraMediaBase-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/AgoraMediaPlayerTypes-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraH265Transcoder-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraLog-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraMediaEngine-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraMediaPlayer-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraMediaPlayerSource-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraMediaRecorder-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraMediaStreamingSource-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraMusicContentCenter-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraRhythmPlayer-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraRtcEngine-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraRtcEngineEx-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAgoraSpatialAudio-ti.d.ts.map +1 -0
- package/types/ts/Private/ti/IAudioDeviceManager-ti.d.ts.map +1 -0
- package/types/{Renderer → ts/Renderer}/AgoraView.d.ts +6 -0
- package/types/ts/Renderer/AgoraView.d.ts.map +1 -0
- package/types/ts/Renderer/CapabilityManager.d.ts.map +1 -0
- package/types/{Renderer → ts/Renderer}/IRenderer.d.ts +2 -2
- package/types/ts/Renderer/IRenderer.d.ts.map +1 -0
- package/types/{Renderer → ts/Renderer}/IRendererCache.d.ts +21 -1
- package/types/ts/Renderer/IRendererCache.d.ts.map +1 -0
- package/types/{Renderer → ts/Renderer}/RendererCache.d.ts +27 -0
- package/types/ts/Renderer/RendererCache.d.ts.map +1 -0
- package/types/{Renderer → ts/Renderer}/RendererManager.d.ts +4 -17
- package/types/ts/Renderer/RendererManager.d.ts.map +1 -0
- package/types/{Renderer → ts/Renderer}/WebCodecsRenderer/index.d.ts +3 -3
- package/types/ts/Renderer/WebCodecsRenderer/index.d.ts.map +1 -0
- package/types/{Renderer → ts/Renderer}/WebCodecsRendererCache.d.ts +7 -0
- package/types/ts/Renderer/WebCodecsRendererCache.d.ts.map +1 -0
- package/types/{Renderer → ts/Renderer}/WebGLRenderer/index.d.ts +12 -2
- package/types/ts/Renderer/WebGLRenderer/index.d.ts.map +1 -0
- package/types/ts/Renderer/WebGLRenderer/webgl-utils.d.ts.map +1 -0
- package/types/ts/Renderer/YUVCanvasRenderer/index.d.ts +10 -0
- package/types/ts/Renderer/YUVCanvasRenderer/index.d.ts.map +1 -0
- package/types/ts/Renderer/index.d.ts.map +1 -0
- package/types/{Types.d.ts → ts/Types.d.ts} +11 -6
- package/types/ts/Types.d.ts.map +1 -0
- package/types/{Utils.d.ts → ts/Utils.d.ts} +1 -1
- package/types/ts/Utils.d.ts.map +1 -0
- package/js/Renderer/RendererCache.js +0 -100
- package/types/AgoraSdk.d.ts.map +0 -1
- package/types/Decoder/gpu-utils.d.ts.map +0 -1
- package/types/Decoder/index.d.ts.map +0 -1
- package/types/Private/AgoraBase.d.ts +0 -5310
- package/types/Private/AgoraBase.d.ts.map +0 -1
- package/types/Private/AgoraMediaBase.d.ts +0 -1668
- package/types/Private/AgoraMediaBase.d.ts.map +0 -1
- package/types/Private/AgoraMediaPlayerTypes.d.ts +0 -453
- package/types/Private/AgoraMediaPlayerTypes.d.ts.map +0 -1
- package/types/Private/IAgoraH265Transcoder.d.ts.map +0 -1
- package/types/Private/IAgoraLog.d.ts +0 -89
- package/types/Private/IAgoraLog.d.ts.map +0 -1
- package/types/Private/IAgoraMediaEngine.d.ts +0 -250
- package/types/Private/IAgoraMediaEngine.d.ts.map +0 -1
- package/types/Private/IAgoraMediaPlayer.d.ts +0 -648
- package/types/Private/IAgoraMediaPlayer.d.ts.map +0 -1
- package/types/Private/IAgoraMediaPlayerSource.d.ts +0 -109
- package/types/Private/IAgoraMediaPlayerSource.d.ts.map +0 -1
- package/types/Private/IAgoraMediaRecorder.d.ts.map +0 -1
- package/types/Private/IAgoraMediaStreamingSource.d.ts.map +0 -1
- package/types/Private/IAgoraMusicContentCenter.d.ts.map +0 -1
- package/types/Private/IAgoraRhythmPlayer.d.ts +0 -65
- package/types/Private/IAgoraRhythmPlayer.d.ts.map +0 -1
- package/types/Private/IAgoraRtcEngine.d.ts +0 -6103
- package/types/Private/IAgoraRtcEngine.d.ts.map +0 -1
- package/types/Private/IAgoraRtcEngineEx.d.ts +0 -741
- package/types/Private/IAgoraRtcEngineEx.d.ts.map +0 -1
- package/types/Private/IAgoraSpatialAudio.d.ts +0 -196
- package/types/Private/IAgoraSpatialAudio.d.ts.map +0 -1
- package/types/Private/IAudioDeviceManager.d.ts +0 -312
- package/types/Private/IAudioDeviceManager.d.ts.map +0 -1
- package/types/Private/extension/AgoraBaseExtension.d.ts.map +0 -1
- package/types/Private/extension/AgoraMediaBaseExtension.d.ts.map +0 -1
- package/types/Private/extension/AgoraMediaPlayerTypesExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraH265TranscoderExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraLogExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraMediaEngineExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraMediaPlayerExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraMediaPlayerSourceExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraMediaRecorderExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraMusicContentCenterExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraRhythmPlayerExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraRtcEngineExExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraRtcEngineExtension.d.ts.map +0 -1
- package/types/Private/extension/IAgoraSpatialAudioExtension.d.ts.map +0 -1
- package/types/Private/extension/IAudioDeviceManagerExtension.d.ts.map +0 -1
- package/types/Private/impl/AgoraBaseImpl.d.ts.map +0 -1
- package/types/Private/impl/AgoraMediaBaseImpl.d.ts.map +0 -1
- package/types/Private/impl/IAgoraH265TranscoderImpl.d.ts.map +0 -1
- package/types/Private/impl/IAgoraMediaEngineImpl.d.ts.map +0 -1
- package/types/Private/impl/IAgoraMediaPlayerImpl.d.ts.map +0 -1
- package/types/Private/impl/IAgoraMediaPlayerSourceImpl.d.ts.map +0 -1
- package/types/Private/impl/IAgoraMediaRecorderImpl.d.ts.map +0 -1
- package/types/Private/impl/IAgoraMusicContentCenterImpl.d.ts.map +0 -1
- package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts.map +0 -1
- package/types/Private/impl/IAgoraRtcEngineImpl.d.ts.map +0 -1
- package/types/Private/impl/IAgoraSpatialAudioImpl.d.ts.map +0 -1
- package/types/Private/impl/IAudioDeviceManagerImpl.d.ts.map +0 -1
- package/types/Private/internal/AgoraH265TranscoderInternal.d.ts.map +0 -1
- package/types/Private/internal/AgoraMediaBaseInternal.d.ts.map +0 -1
- package/types/Private/internal/AudioDeviceManagerInternal.d.ts.map +0 -1
- package/types/Private/internal/IrisApiEngine.d.ts.map +0 -1
- package/types/Private/internal/LocalSpatialAudioEngineInternal.d.ts.map +0 -1
- package/types/Private/internal/MediaEngineInternal.d.ts.map +0 -1
- package/types/Private/internal/MediaPlayerInternal.d.ts.map +0 -1
- package/types/Private/internal/MediaRecorderInternal.d.ts.map +0 -1
- package/types/Private/internal/MusicContentCenterInternal.d.ts.map +0 -1
- package/types/Private/internal/RtcEngineExInternal.d.ts.map +0 -1
- package/types/Private/ipc/renderer.d.ts.map +0 -1
- package/types/Private/ti/AgoraBase-ti.d.ts.map +0 -1
- package/types/Private/ti/AgoraMediaBase-ti.d.ts.map +0 -1
- package/types/Private/ti/AgoraMediaPlayerTypes-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraH265Transcoder-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraLog-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraMediaEngine-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraMediaPlayer-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraMediaPlayerSource-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraMediaRecorder-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraMediaStreamingSource-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraMusicContentCenter-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraRhythmPlayer-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraRtcEngine-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraRtcEngineEx-ti.d.ts.map +0 -1
- package/types/Private/ti/IAgoraSpatialAudio-ti.d.ts.map +0 -1
- package/types/Private/ti/IAudioDeviceManager-ti.d.ts.map +0 -1
- package/types/Renderer/AgoraView.d.ts.map +0 -1
- package/types/Renderer/CapabilityManager.d.ts.map +0 -1
- package/types/Renderer/IRenderer.d.ts.map +0 -1
- package/types/Renderer/IRendererCache.d.ts.map +0 -1
- package/types/Renderer/RendererCache.d.ts.map +0 -1
- package/types/Renderer/RendererManager.d.ts.map +0 -1
- package/types/Renderer/WebCodecsRenderer/index.d.ts.map +0 -1
- package/types/Renderer/WebCodecsRendererCache.d.ts.map +0 -1
- package/types/Renderer/WebGLRenderer/index.d.ts.map +0 -1
- package/types/Renderer/WebGLRenderer/webgl-utils.d.ts.map +0 -1
- package/types/Renderer/YUVCanvasRenderer/index.d.ts +0 -9
- package/types/Renderer/YUVCanvasRenderer/index.d.ts.map +0 -1
- package/types/Renderer/index.d.ts.map +0 -1
- package/types/Types.d.ts.map +0 -1
- package/types/Utils.d.ts.map +0 -1
- /package/js/{Decoder → ts/Decoder}/gpu-utils.js +0 -0
- /package/js/{Private → ts/Private}/IAgoraH265Transcoder.js +0 -0
- /package/js/{Private → ts/Private}/IAgoraMediaPlayerSource.js +0 -0
- /package/js/{Private → ts/Private}/IAgoraMediaRecorder.js +0 -0
- /package/js/{Private → ts/Private}/IAgoraMediaStreamingSource.js +0 -0
- /package/js/{Private → ts/Private}/extension/AgoraBaseExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/AgoraMediaBaseExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/AgoraMediaPlayerTypesExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraH265TranscoderExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraLogExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraMediaEngineExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraMediaPlayerExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraMediaPlayerSourceExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraMediaRecorderExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraMusicContentCenterExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraRhythmPlayerExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraRtcEngineExExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraRtcEngineExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAgoraSpatialAudioExtension.js +0 -0
- /package/js/{Private → ts/Private}/extension/IAudioDeviceManagerExtension.js +0 -0
- /package/js/{Private → ts/Private}/impl/AgoraBaseImpl.js +0 -0
- /package/js/{Private → ts/Private}/impl/AgoraMediaBaseImpl.js +0 -0
- /package/js/{Private → ts/Private}/impl/IAgoraH265TranscoderImpl.js +0 -0
- /package/js/{Private → ts/Private}/impl/IAgoraMediaEngineImpl.js +0 -0
- /package/js/{Private → ts/Private}/impl/IAgoraMediaPlayerSourceImpl.js +0 -0
- /package/js/{Private → ts/Private}/impl/IAgoraMediaRecorderImpl.js +0 -0
- /package/js/{Private → ts/Private}/impl/IAgoraMusicContentCenterImpl.js +0 -0
- /package/js/{Private → ts/Private}/impl/IAgoraSpatialAudioImpl.js +0 -0
- /package/js/{Private → ts/Private}/impl/IAudioDeviceManagerImpl.js +0 -0
- /package/js/{Private → ts/Private}/internal/AgoraH265TranscoderInternal.js +0 -0
- /package/js/{Private → ts/Private}/internal/AgoraMediaBaseInternal.js +0 -0
- /package/js/{Private → ts/Private}/internal/AudioDeviceManagerInternal.js +0 -0
- /package/js/{Private → ts/Private}/internal/LocalSpatialAudioEngineInternal.js +0 -0
- /package/js/{Private → ts/Private}/internal/MediaEngineInternal.js +0 -0
- /package/js/{Private → ts/Private}/internal/MediaPlayerInternal.js +0 -0
- /package/js/{Private → ts/Private}/internal/MediaRecorderInternal.js +0 -0
- /package/js/{Private → ts/Private}/internal/MusicContentCenterInternal.js +0 -0
- /package/js/{Private → ts/Private}/ipc/main.js +0 -0
- /package/js/{Private → ts/Private}/ipc/renderer.js +0 -0
- /package/js/{Private → ts/Private}/ti/AgoraBase-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/AgoraMediaBase-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/AgoraMediaPlayerTypes-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraH265Transcoder-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraLog-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraMediaEngine-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraMediaPlayer-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraMediaPlayerSource-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraMediaRecorder-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraMediaStreamingSource-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraMusicContentCenter-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraRhythmPlayer-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraRtcEngineEx-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAgoraSpatialAudio-ti.js +0 -0
- /package/js/{Private → ts/Private}/ti/IAudioDeviceManager-ti.js +0 -0
- /package/js/{Renderer → ts/Renderer}/CapabilityManager.js +0 -0
- /package/js/{Renderer → ts/Renderer}/WebGLRenderer/webgl-utils.js +0 -0
- /package/js/{Renderer → ts/Renderer}/index.js +0 -0
- /package/js/{Types.js → ts/Types.js} +0 -0
- /package/types/{Decoder → ts/Decoder}/gpu-utils.d.ts +0 -0
- /package/types/{Decoder → ts/Decoder}/index.d.ts +0 -0
- /package/types/{Private → ts/Private}/IAgoraH265Transcoder.d.ts +0 -0
- /package/types/{Private → ts/Private}/IAgoraMediaRecorder.d.ts +0 -0
- /package/types/{Private → ts/Private}/IAgoraMediaStreamingSource.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/AgoraBaseExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/AgoraMediaBaseExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/AgoraMediaPlayerTypesExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraH265TranscoderExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraLogExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraMediaEngineExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraMediaPlayerExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraMediaPlayerSourceExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraMediaRecorderExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraMusicContentCenterExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraRhythmPlayerExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraRtcEngineExExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraRtcEngineExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAgoraSpatialAudioExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/extension/IAudioDeviceManagerExtension.d.ts +0 -0
- /package/types/{Private → ts/Private}/impl/AgoraBaseImpl.d.ts +0 -0
- /package/types/{Private → ts/Private}/impl/AgoraMediaBaseImpl.d.ts +0 -0
- /package/types/{Private → ts/Private}/impl/IAgoraH265TranscoderImpl.d.ts +0 -0
- /package/types/{Private → ts/Private}/impl/IAgoraMediaEngineImpl.d.ts +0 -0
- /package/types/{Private → ts/Private}/impl/IAgoraMediaPlayerSourceImpl.d.ts +0 -0
- /package/types/{Private → ts/Private}/impl/IAgoraMediaRecorderImpl.d.ts +0 -0
- /package/types/{Private → ts/Private}/impl/IAgoraMusicContentCenterImpl.d.ts +0 -0
- /package/types/{Private → ts/Private}/impl/IAgoraSpatialAudioImpl.d.ts +0 -0
- /package/types/{Private → ts/Private}/impl/IAudioDeviceManagerImpl.d.ts +0 -0
- /package/types/{Private → ts/Private}/internal/AgoraH265TranscoderInternal.d.ts +0 -0
- /package/types/{Private → ts/Private}/internal/AgoraMediaBaseInternal.d.ts +0 -0
- /package/types/{Private → ts/Private}/internal/AudioDeviceManagerInternal.d.ts +0 -0
- /package/types/{Private → ts/Private}/internal/IrisApiEngine.d.ts +0 -0
- /package/types/{Private → ts/Private}/internal/LocalSpatialAudioEngineInternal.d.ts +0 -0
- /package/types/{Private → ts/Private}/internal/MediaEngineInternal.d.ts +0 -0
- /package/types/{Private → ts/Private}/internal/MediaPlayerInternal.d.ts +0 -0
- /package/types/{Private → ts/Private}/internal/MediaRecorderInternal.d.ts +0 -0
- /package/types/{Private → ts/Private}/internal/MusicContentCenterInternal.d.ts +0 -0
- /package/types/{Private → ts/Private}/ipc/main.d.ts +0 -0
- /package/types/{Private → ts/Private}/ipc/renderer.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/AgoraBase-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/AgoraMediaBase-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/AgoraMediaPlayerTypes-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraH265Transcoder-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraLog-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraMediaEngine-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraMediaPlayer-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraMediaPlayerSource-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraMediaRecorder-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraMediaStreamingSource-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraMusicContentCenter-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraRhythmPlayer-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraRtcEngine-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraRtcEngineEx-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAgoraSpatialAudio-ti.d.ts +0 -0
- /package/types/{Private → ts/Private}/ti/IAudioDeviceManager-ti.d.ts +0 -0
- /package/types/{Renderer → ts/Renderer}/CapabilityManager.d.ts +0 -0
- /package/types/{Renderer → ts/Renderer}/WebGLRenderer/webgl-utils.d.ts +0 -0
- /package/types/{Renderer → ts/Renderer}/index.d.ts +0 -0
package/ts/Renderer/AgoraView.ts
CHANGED
|
@@ -12,6 +12,7 @@ const CHANNEL_ID_STRING = 'channel-id';
|
|
|
12
12
|
const POSITION_STRING = 'position';
|
|
13
13
|
const RENDERER_CONTENT_MODE_STRING = 'renderer-content-mode';
|
|
14
14
|
const RENDERER_MIRROR_STRING = 'renderer-mirror';
|
|
15
|
+
const ENABLE_ALPHA_MASK_STRING = 'enable-alpha-mask';
|
|
15
16
|
|
|
16
17
|
const observedAttributes = [
|
|
17
18
|
VIDEO_SOURCE_TYPE_STRING,
|
|
@@ -20,6 +21,7 @@ const observedAttributes = [
|
|
|
20
21
|
POSITION_STRING,
|
|
21
22
|
RENDERER_CONTENT_MODE_STRING,
|
|
22
23
|
RENDERER_MIRROR_STRING,
|
|
24
|
+
ENABLE_ALPHA_MASK_STRING,
|
|
23
25
|
];
|
|
24
26
|
|
|
25
27
|
declare global {
|
|
@@ -61,6 +63,10 @@ declare global {
|
|
|
61
63
|
* The inline style of elements. See style .
|
|
62
64
|
*/
|
|
63
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;
|
|
64
70
|
}
|
|
65
71
|
namespace JSX {
|
|
66
72
|
/**
|
|
@@ -163,13 +169,32 @@ export default class AgoraView extends HTMLElement {
|
|
|
163
169
|
}
|
|
164
170
|
}
|
|
165
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
|
+
|
|
166
184
|
constructor() {
|
|
167
185
|
super();
|
|
168
186
|
}
|
|
169
187
|
|
|
170
188
|
initializeRender = () => {
|
|
171
|
-
const {
|
|
172
|
-
|
|
189
|
+
const {
|
|
190
|
+
channelId,
|
|
191
|
+
uid,
|
|
192
|
+
sourceType,
|
|
193
|
+
position,
|
|
194
|
+
renderMode,
|
|
195
|
+
renderMirror,
|
|
196
|
+
enableAlphaMask,
|
|
197
|
+
} = this;
|
|
173
198
|
AgoraEnv.AgoraRendererManager?.addOrRemoveRenderer({
|
|
174
199
|
sourceType,
|
|
175
200
|
view: this,
|
|
@@ -181,17 +206,19 @@ export default class AgoraView extends HTMLElement {
|
|
|
181
206
|
? VideoMirrorModeType.VideoMirrorModeEnabled
|
|
182
207
|
: VideoMirrorModeType.VideoMirrorModeDisabled,
|
|
183
208
|
setupMode: VideoViewSetupMode.VideoViewSetupReplace,
|
|
209
|
+
enableAlphaMask,
|
|
184
210
|
});
|
|
185
211
|
};
|
|
186
212
|
|
|
187
213
|
destroyRender = () => {
|
|
188
|
-
const { channelId, uid, sourceType, position } = this;
|
|
214
|
+
const { channelId, uid, sourceType, position, enableAlphaMask } = this;
|
|
189
215
|
AgoraEnv.AgoraRendererManager?.removeRendererFromCache({
|
|
190
216
|
channelId,
|
|
191
217
|
position,
|
|
192
218
|
uid,
|
|
193
219
|
sourceType,
|
|
194
220
|
view: this,
|
|
221
|
+
enableAlphaMask,
|
|
195
222
|
});
|
|
196
223
|
};
|
|
197
224
|
|
|
@@ -207,6 +234,7 @@ export default class AgoraView extends HTMLElement {
|
|
|
207
234
|
const isSetRenderOption = [
|
|
208
235
|
RENDERER_CONTENT_MODE_STRING,
|
|
209
236
|
RENDERER_MIRROR_STRING,
|
|
237
|
+
ENABLE_ALPHA_MASK_STRING,
|
|
210
238
|
].includes(attrName);
|
|
211
239
|
|
|
212
240
|
if (isSetRenderOption) {
|
|
@@ -216,6 +244,7 @@ export default class AgoraView extends HTMLElement {
|
|
|
216
244
|
mirrorMode: this.renderMirror
|
|
217
245
|
? VideoMirrorModeType.VideoMirrorModeEnabled
|
|
218
246
|
: VideoMirrorModeType.VideoMirrorModeDisabled,
|
|
247
|
+
enableAlphaMask: this.enableAlphaMask,
|
|
219
248
|
});
|
|
220
249
|
return;
|
|
221
250
|
}
|
package/ts/Renderer/IRenderer.ts
CHANGED
|
@@ -11,8 +11,8 @@ export abstract class IRenderer {
|
|
|
11
11
|
private _frameCount = 0;
|
|
12
12
|
private _startTime: number | null = null;
|
|
13
13
|
|
|
14
|
-
public bind(
|
|
15
|
-
this.parentElement =
|
|
14
|
+
public bind(context: RendererContext) {
|
|
15
|
+
this.parentElement = context.view;
|
|
16
16
|
this.container = document.createElement('div');
|
|
17
17
|
Object.assign(this.container.style, {
|
|
18
18
|
width: '100%',
|
|
@@ -22,7 +22,7 @@ export abstract class IRenderer {
|
|
|
22
22
|
alignItems: 'center',
|
|
23
23
|
overflow: 'hidden',
|
|
24
24
|
});
|
|
25
|
-
this.parentElement
|
|
25
|
+
this.parentElement?.appendChild(this.container);
|
|
26
26
|
this.canvas = document.createElement('canvas');
|
|
27
27
|
this.canvas.style.display = 'none';
|
|
28
28
|
this.container.appendChild(this.canvas);
|
|
@@ -45,6 +45,7 @@ export abstract class IRenderer {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
public drawFrame(
|
|
48
|
+
uid: number,
|
|
48
49
|
_videoFrame?: VideoFrame,
|
|
49
50
|
_codecConfig?: CodecConfigInfo
|
|
50
51
|
): void {
|
|
@@ -64,6 +65,10 @@ export abstract class IRenderer {
|
|
|
64
65
|
this.context.mirrorMode = context.mirrorMode;
|
|
65
66
|
this.updateMirrorMode();
|
|
66
67
|
}
|
|
68
|
+
|
|
69
|
+
if (this.context.enableAlphaMask !== context.enableAlphaMask) {
|
|
70
|
+
this.context.enableAlphaMask = context.enableAlphaMask;
|
|
71
|
+
}
|
|
67
72
|
this.context = { ...this.context, ...context };
|
|
68
73
|
}
|
|
69
74
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { RtcConnection, VideoSourceType } from 'agora-electron-sdk';
|
|
2
|
+
|
|
1
3
|
import { RendererCacheContext, RendererContext } from '../Types';
|
|
2
4
|
|
|
3
5
|
import { IRenderer } from './IRenderer';
|
|
@@ -24,6 +26,16 @@ export function isUseConnection(context: RendererCacheContext): boolean {
|
|
|
24
26
|
export abstract class IRendererCache {
|
|
25
27
|
renderers: IRenderer[];
|
|
26
28
|
cacheContext: RendererCacheContext;
|
|
29
|
+
callbackContext: { connection: RtcConnection; sourceType: VideoSourceType };
|
|
30
|
+
|
|
31
|
+
// 性能统计数据
|
|
32
|
+
public actualFps: number = 0;
|
|
33
|
+
public avgFrameTime: number = 0;
|
|
34
|
+
public maxFrameTime: number = 0;
|
|
35
|
+
public minFrameTime: number = 0;
|
|
36
|
+
public avgFrameInterval: number = 0;
|
|
37
|
+
public maxFrameInterval: number = 0;
|
|
38
|
+
public minFrameInterval: number = 0;
|
|
27
39
|
|
|
28
40
|
constructor({
|
|
29
41
|
channelId,
|
|
@@ -33,6 +45,7 @@ export abstract class IRendererCache {
|
|
|
33
45
|
sourceType,
|
|
34
46
|
localUid,
|
|
35
47
|
position,
|
|
48
|
+
enableAlphaMask,
|
|
36
49
|
}: RendererContext) {
|
|
37
50
|
this.renderers = [];
|
|
38
51
|
this.cacheContext = {
|
|
@@ -43,9 +56,21 @@ export abstract class IRendererCache {
|
|
|
43
56
|
sourceType,
|
|
44
57
|
localUid,
|
|
45
58
|
position,
|
|
59
|
+
enableAlphaMask,
|
|
60
|
+
};
|
|
61
|
+
this.callbackContext = {
|
|
62
|
+
connection: { channelId, localUid },
|
|
63
|
+
sourceType: sourceType!,
|
|
46
64
|
};
|
|
47
65
|
}
|
|
48
66
|
|
|
67
|
+
public setCallbackContext(
|
|
68
|
+
connection: RtcConnection,
|
|
69
|
+
sourceType: VideoSourceType
|
|
70
|
+
): void {
|
|
71
|
+
this.callbackContext = { connection, sourceType };
|
|
72
|
+
}
|
|
73
|
+
|
|
49
74
|
public get key(): string {
|
|
50
75
|
return generateRendererCacheKey(this.cacheContext);
|
|
51
76
|
}
|
|
@@ -90,6 +115,14 @@ export abstract class IRendererCache {
|
|
|
90
115
|
}
|
|
91
116
|
}
|
|
92
117
|
|
|
118
|
+
public abstract fetchVideoFrame(): {
|
|
119
|
+
hasMoreFrame: boolean;
|
|
120
|
+
needRender: boolean;
|
|
121
|
+
};
|
|
122
|
+
public abstract renderFrame(): void;
|
|
123
|
+
public abstract startRendering(): void;
|
|
124
|
+
public abstract stopRendering(): void;
|
|
125
|
+
|
|
93
126
|
public release(): void {
|
|
94
127
|
this.removeRenderer();
|
|
95
128
|
}
|
|
@@ -11,19 +11,32 @@ export class RendererCache extends IRendererCache {
|
|
|
11
11
|
private videoFrame: VideoFrame;
|
|
12
12
|
private _enabled: boolean;
|
|
13
13
|
|
|
14
|
+
// 渲染相关属性
|
|
15
|
+
private _renderingFps: number = 0;
|
|
16
|
+
private _renderingTimer?: number;
|
|
17
|
+
private _isRendering: boolean = false;
|
|
18
|
+
private _lastRenderTime: number = 0;
|
|
19
|
+
|
|
20
|
+
// 性能监控相关属性
|
|
21
|
+
private _frameTimes: number[] = []; // 存储最近100帧的渲染时间
|
|
22
|
+
private _frameIntervals: number[] = []; // 存储最近100帧的帧间隔
|
|
23
|
+
private _lastFrameTimestamp: number = 0; // 上一帧的时间戳
|
|
24
|
+
private _statsInterval: number = 100; // 每100帧输出一次统计
|
|
25
|
+
|
|
14
26
|
constructor(context: RendererContext) {
|
|
15
27
|
super(context);
|
|
16
28
|
this.videoFrame = {
|
|
17
29
|
yBuffer: Buffer.alloc(0),
|
|
18
30
|
uBuffer: Buffer.alloc(0),
|
|
19
31
|
vBuffer: Buffer.alloc(0),
|
|
20
|
-
alphaBuffer:
|
|
32
|
+
alphaBuffer: Buffer.alloc(0),
|
|
21
33
|
width: 0,
|
|
22
34
|
height: 0,
|
|
23
35
|
yStride: 0,
|
|
24
36
|
uStride: 0,
|
|
25
37
|
vStride: 0,
|
|
26
38
|
rotation: 0,
|
|
39
|
+
colorSpace: undefined,
|
|
27
40
|
};
|
|
28
41
|
this._enabled = false;
|
|
29
42
|
}
|
|
@@ -39,6 +52,10 @@ export class RendererCache extends IRendererCache {
|
|
|
39
52
|
if (this._enabled) return;
|
|
40
53
|
AgoraElectronBridge.EnableVideoFrameCache(this.cacheContext);
|
|
41
54
|
this._enabled = true;
|
|
55
|
+
if (AgoraEnv.AgoraRendererManager) {
|
|
56
|
+
this._renderingFps = AgoraEnv.AgoraRendererManager.renderingFps;
|
|
57
|
+
}
|
|
58
|
+
this.startRendering();
|
|
42
59
|
}
|
|
43
60
|
|
|
44
61
|
private disable() {
|
|
@@ -55,25 +72,30 @@ export class RendererCache extends IRendererCache {
|
|
|
55
72
|
}
|
|
56
73
|
}
|
|
57
74
|
|
|
58
|
-
override draw() {
|
|
59
|
-
|
|
75
|
+
override draw(): void {}
|
|
76
|
+
|
|
77
|
+
public fetchVideoFrame(): { hasMoreFrame: boolean; needRender: boolean } {
|
|
78
|
+
const renderAlpha = this.cacheContext.enableAlphaMask ?? false;
|
|
79
|
+
let needRender = false;
|
|
80
|
+
let { ret, hasMoreFrame } = AgoraElectronBridge.GetVideoFrame(
|
|
60
81
|
this.cacheContext,
|
|
61
82
|
this.videoFrame,
|
|
62
83
|
{
|
|
63
|
-
|
|
84
|
+
renderAlpha: renderAlpha,
|
|
64
85
|
}
|
|
65
86
|
);
|
|
66
87
|
|
|
67
88
|
switch (ret) {
|
|
68
89
|
case 0: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::OK = 0
|
|
69
90
|
//
|
|
91
|
+
needRender = true;
|
|
70
92
|
break;
|
|
71
93
|
case 1: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::RESIZED = 1
|
|
72
94
|
const { yStride, uStride, vStride, height } = this.videoFrame;
|
|
73
95
|
this.videoFrame.yBuffer = Buffer.alloc(yStride! * height!);
|
|
74
96
|
this.videoFrame.uBuffer = Buffer.alloc(uStride! * height!);
|
|
75
97
|
this.videoFrame.vBuffer = Buffer.alloc(vStride! * height!);
|
|
76
|
-
if (
|
|
98
|
+
if (renderAlpha) {
|
|
77
99
|
this.videoFrame.alphaBuffer = Buffer.alloc(
|
|
78
100
|
this.videoFrame.width! * this.videoFrame.height!
|
|
79
101
|
);
|
|
@@ -83,26 +105,43 @@ export class RendererCache extends IRendererCache {
|
|
|
83
105
|
this.cacheContext,
|
|
84
106
|
this.videoFrame,
|
|
85
107
|
{
|
|
86
|
-
|
|
108
|
+
renderAlpha: renderAlpha,
|
|
87
109
|
}
|
|
88
110
|
);
|
|
89
111
|
ret = result.ret;
|
|
90
|
-
|
|
112
|
+
hasMoreFrame = result.hasMoreFrame;
|
|
113
|
+
needRender = false;
|
|
91
114
|
break;
|
|
92
115
|
case 2: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::NO_CACHE = 2
|
|
93
116
|
logDebug('No renderer cache, please enable cache first');
|
|
94
|
-
return;
|
|
117
|
+
return { hasMoreFrame: false, needRender: false };
|
|
95
118
|
}
|
|
96
119
|
|
|
97
|
-
if (!
|
|
98
|
-
|
|
120
|
+
if (!renderAlpha) {
|
|
121
|
+
if (
|
|
122
|
+
this.videoFrame.alphaBuffer &&
|
|
123
|
+
this.videoFrame.alphaBuffer.length > 0
|
|
124
|
+
) {
|
|
125
|
+
this.videoFrame.alphaBuffer = Buffer.alloc(0);
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
if (
|
|
129
|
+
!this.videoFrame.alphaBuffer ||
|
|
130
|
+
this.videoFrame.alphaBuffer.length === 0
|
|
131
|
+
) {
|
|
132
|
+
this.videoFrame.alphaBuffer = Buffer.alloc(
|
|
133
|
+
this.videoFrame.width! * this.videoFrame.height!
|
|
134
|
+
);
|
|
135
|
+
}
|
|
99
136
|
}
|
|
100
137
|
|
|
101
|
-
if (
|
|
138
|
+
if (hasMoreFrame) {
|
|
102
139
|
this.renderers.forEach((renderer) => {
|
|
103
|
-
renderer.drawFrame(this.videoFrame);
|
|
140
|
+
renderer.drawFrame(this.cacheContext.uid!, this.videoFrame);
|
|
104
141
|
});
|
|
105
142
|
}
|
|
143
|
+
|
|
144
|
+
return { hasMoreFrame, needRender };
|
|
106
145
|
}
|
|
107
146
|
|
|
108
147
|
override addRenderer(renderer: IRenderer): void {
|
|
@@ -110,6 +149,155 @@ export class RendererCache extends IRendererCache {
|
|
|
110
149
|
this.shouldEnable();
|
|
111
150
|
}
|
|
112
151
|
|
|
152
|
+
/**
|
|
153
|
+
* 渲染当前视频帧
|
|
154
|
+
* 此方法假设已经通过fetchVideoFrame获取了新帧
|
|
155
|
+
*/
|
|
156
|
+
public renderFrame() {
|
|
157
|
+
if (this.renderers.length === 0) return;
|
|
158
|
+
|
|
159
|
+
// 记录当前时间戳,用于计算帧间隔
|
|
160
|
+
const now = performance.now();
|
|
161
|
+
|
|
162
|
+
// 计算帧间隔并记录
|
|
163
|
+
if (this._lastFrameTimestamp > 0) {
|
|
164
|
+
const interval = now - this._lastFrameTimestamp;
|
|
165
|
+
this._frameIntervals.push(interval);
|
|
166
|
+
}
|
|
167
|
+
this._lastFrameTimestamp = now;
|
|
168
|
+
|
|
169
|
+
// 使用高精度计数器测量渲染时间
|
|
170
|
+
const renderStartTime = performance.now();
|
|
171
|
+
|
|
172
|
+
// 执行渲染
|
|
173
|
+
this.renderers.forEach((renderer) => {
|
|
174
|
+
renderer.drawFrame(this.cacheContext.uid!, this.videoFrame);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// 计算渲染耗时
|
|
178
|
+
const renderEndTime = performance.now();
|
|
179
|
+
const frameTime = renderEndTime - renderStartTime;
|
|
180
|
+
|
|
181
|
+
// 更新帧时间统计
|
|
182
|
+
this._frameTimes.push(frameTime);
|
|
183
|
+
|
|
184
|
+
// 每statsInterval帧输出一次统计信息
|
|
185
|
+
if (this._frameTimes.length >= this._statsInterval) {
|
|
186
|
+
this._outputPerformanceStats();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* 输出性能统计信息
|
|
192
|
+
* 包括帧时间和帧间隔的统计数据
|
|
193
|
+
*/
|
|
194
|
+
private _outputPerformanceStats(): void {
|
|
195
|
+
if (this._frameTimes.length === 0) return;
|
|
196
|
+
|
|
197
|
+
// 计算帧时间统计
|
|
198
|
+
this.avgFrameTime =
|
|
199
|
+
this._frameTimes.reduce((a, b) => a + b, 0) / this._frameTimes.length;
|
|
200
|
+
this.maxFrameTime = Math.max(...this._frameTimes);
|
|
201
|
+
this.minFrameTime = Math.min(...this._frameTimes);
|
|
202
|
+
|
|
203
|
+
// 计算帧间隔统计
|
|
204
|
+
this.avgFrameInterval = 0;
|
|
205
|
+
this.maxFrameInterval = 0;
|
|
206
|
+
this.minFrameInterval = Number.MAX_VALUE;
|
|
207
|
+
|
|
208
|
+
if (this._frameIntervals.length > 0) {
|
|
209
|
+
this.avgFrameInterval =
|
|
210
|
+
this._frameIntervals.reduce((a, b) => a + b, 0) /
|
|
211
|
+
this._frameIntervals.length;
|
|
212
|
+
this.maxFrameInterval = Math.max(...this._frameIntervals);
|
|
213
|
+
this.minFrameInterval = Math.min(...this._frameIntervals);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// 计算实际帧率
|
|
217
|
+
this.actualFps =
|
|
218
|
+
this._frameIntervals.length > 0
|
|
219
|
+
? 1000 / this.avgFrameInterval
|
|
220
|
+
: this._renderingFps;
|
|
221
|
+
|
|
222
|
+
// 输出帧时间统计
|
|
223
|
+
logDebug(
|
|
224
|
+
`[FPS_STATS][UID:${this.callbackContext.connection.localUid}] 帧时间统计(${this._frameTimes.length}帧):`,
|
|
225
|
+
`平均=${this.avgFrameTime.toFixed(2)}ms`,
|
|
226
|
+
`最大=${this.maxFrameTime.toFixed(2)}ms`,
|
|
227
|
+
`最小=${this.minFrameTime.toFixed(2)}ms`
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
// 输出帧间隔统计
|
|
231
|
+
if (this._frameIntervals.length > 0) {
|
|
232
|
+
logDebug(
|
|
233
|
+
`[FPS_STATS][UID:${this.callbackContext.connection.localUid}] 帧间隔统计(${this._frameIntervals.length}帧):`,
|
|
234
|
+
`实际帧率=${this.actualFps.toFixed(2)}fps`,
|
|
235
|
+
`目标帧率=${this._renderingFps}fps`,
|
|
236
|
+
`平均=${this.avgFrameInterval.toFixed(2)}ms`,
|
|
237
|
+
`最大=${this.maxFrameInterval.toFixed(2)}ms`,
|
|
238
|
+
`最小=${this.minFrameInterval.toFixed(2)}ms`
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// 重置统计数据
|
|
243
|
+
this._frameTimes = [];
|
|
244
|
+
this._frameIntervals = [];
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* 开始独立渲染循环
|
|
249
|
+
*/
|
|
250
|
+
public startRendering() {
|
|
251
|
+
if (this._renderingTimer || this._isRendering) return;
|
|
252
|
+
|
|
253
|
+
this._isRendering = true;
|
|
254
|
+
|
|
255
|
+
const renderingLooper = () => {
|
|
256
|
+
if (!this._isRendering) return;
|
|
257
|
+
|
|
258
|
+
const currentTime = performance.now();
|
|
259
|
+
const timeSinceLastRender = this._lastRenderTime
|
|
260
|
+
? currentTime - this._lastRenderTime
|
|
261
|
+
: 0;
|
|
262
|
+
const frameInterval = 1000 / this._renderingFps;
|
|
263
|
+
|
|
264
|
+
// 如果距离上次渲染的时间不足一帧间隔,等待
|
|
265
|
+
if (this._lastRenderTime && timeSinceLastRender < frameInterval) {
|
|
266
|
+
const waitTime = frameInterval - timeSinceLastRender;
|
|
267
|
+
this._renderingTimer = window.setTimeout(renderingLooper, waitTime);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// 记录当前时间作为本次循环的开始时间
|
|
272
|
+
this._lastRenderTime = currentTime;
|
|
273
|
+
|
|
274
|
+
// 获取第一帧并渲染
|
|
275
|
+
// 无论hasMoreFrame是true还是false,都渲染当前帧
|
|
276
|
+
// 因为fetchVideoFrame总是会获取一帧数据(如果有的话)
|
|
277
|
+
let { hasMoreFrame, needRender } = this.fetchVideoFrame();
|
|
278
|
+
if (needRender) {
|
|
279
|
+
this.renderFrame();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// 如果hasMoreFrame为true,表示还有更多帧需要获取
|
|
283
|
+
while (hasMoreFrame) {
|
|
284
|
+
// 获取下一帧
|
|
285
|
+
let { hasMoreFrame: nextHasMoreFrame, needRender } =
|
|
286
|
+
this.fetchVideoFrame();
|
|
287
|
+
hasMoreFrame = nextHasMoreFrame;
|
|
288
|
+
if (needRender) {
|
|
289
|
+
this.renderFrame();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// 安排下一帧
|
|
294
|
+
this._renderingTimer = window.setTimeout(renderingLooper, 0);
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
// 启动渲染循环
|
|
298
|
+
this._renderingTimer = window.setTimeout(renderingLooper, 0);
|
|
299
|
+
}
|
|
300
|
+
|
|
113
301
|
/**
|
|
114
302
|
* Remove the specified renderer if it is specified, otherwise remove all renderers
|
|
115
303
|
*/
|
|
@@ -118,6 +306,17 @@ export class RendererCache extends IRendererCache {
|
|
|
118
306
|
this.shouldEnable();
|
|
119
307
|
}
|
|
120
308
|
|
|
309
|
+
public stopRendering() {
|
|
310
|
+
if (!this._isRendering) return;
|
|
311
|
+
|
|
312
|
+
if (this._renderingTimer) {
|
|
313
|
+
window.clearTimeout(this._renderingTimer);
|
|
314
|
+
this._renderingTimer = undefined;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
this._isRendering = false;
|
|
318
|
+
}
|
|
319
|
+
|
|
121
320
|
public release(): void {
|
|
122
321
|
super.release();
|
|
123
322
|
}
|