1
1
import createAgoraRtcEngine from '../AgoraSdk' ;
2
2
import { WebCodecsDecoder } from '../Decoder/index' ;
3
3
import { EncodedVideoFrameInfo , VideoStreamType } from '../Private/AgoraBase' ;
4
- import { IVideoEncodedFrameObserver } from '../Private/AgoraMediaBase' ;
5
4
import { IRtcEngineEx } from '../Private/IAgoraRtcEngineEx' ;
5
+ import { AgoraElectronBridge } from '../Private/internal/IrisApiEngine' ;
6
6
7
7
import { RendererContext , RendererType } from '../Types' ;
8
8
import { AgoraEnv , logInfo } from '../Utils' ;
9
9
10
10
import { IRendererCache } from './IRendererCache' ;
11
11
import { WebCodecsRenderer } from './WebCodecsRenderer/index' ;
12
12
13
- export class WebCodecsRendererCache
14
- extends IRendererCache
15
- implements IVideoEncodedFrameObserver
16
- {
13
+ export class WebCodecsRendererCache extends IRendererCache {
17
14
private _decoder ?: WebCodecsDecoder | null ;
18
15
private _engine ?: IRtcEngineEx ;
19
16
private _firstFrame = true ;
@@ -34,38 +31,44 @@ export class WebCodecsRendererCache
34
31
AgoraEnv . AgoraRendererManager ?. handleWebCodecsFallback ( this . cacheContext ) ;
35
32
}
36
33
37
- onEncodedVideoFrameReceived (
38
- uid : number ,
39
- imageBuffer : Uint8Array ,
40
- length : number ,
41
- videoEncodedFrameInfo : EncodedVideoFrameInfo
42
- ) {
43
- if ( ! this . _decoder || this . cacheContext . uid !== uid ) return ;
34
+ onEncodedVideoFrameReceived ( ...[ data , buffer ] : any ) {
35
+ let _data : any ;
36
+ try {
37
+ _data = JSON . parse ( data ) ?? { } ;
38
+ } catch ( e ) {
39
+ _data = { } ;
40
+ }
41
+ if (
42
+ Object . keys ( _data ) . length === 0 ||
43
+ ! this . _decoder ||
44
+ this . cacheContext . uid !== _data . uid
45
+ )
46
+ return ;
44
47
if ( this . _firstFrame ) {
45
48
for ( let renderer of this . renderers ) {
46
49
if ( renderer . rendererType !== RendererType . WEBCODECSRENDERER ) {
47
50
continue ;
48
51
}
49
52
renderer . bind ( renderer . context . view , {
50
- width : videoEncodedFrameInfo . width ! ,
51
- height : videoEncodedFrameInfo . height ! ,
53
+ width : _data . videoEncodedFrameInfo . width ! ,
54
+ height : _data . videoEncodedFrameInfo . height ! ,
52
55
} ) ;
53
56
}
54
57
55
58
try {
56
- this . _decoder . decoderConfigure ( videoEncodedFrameInfo ) ;
59
+ this . _decoder . decoderConfigure ( _data . videoEncodedFrameInfo ) ;
57
60
} catch ( error : any ) {
58
61
logInfo ( error ) ;
59
62
return ;
60
63
}
61
64
this . _firstFrame = false ;
62
65
}
63
- if ( this . shouldFallback ( videoEncodedFrameInfo ) ) {
66
+ if ( this . shouldFallback ( _data . videoEncodedFrameInfo ) ) {
64
67
AgoraEnv . AgoraRendererManager ?. handleWebCodecsFallback ( this . cacheContext ) ;
65
68
} else {
66
69
this . _decoder . decodeFrame (
67
- imageBuffer ,
68
- videoEncodedFrameInfo ,
70
+ buffer ,
71
+ _data . videoEncodedFrameInfo ,
69
72
new Date ( ) . getTime ( )
70
73
) ;
71
74
}
@@ -76,6 +79,16 @@ export class WebCodecsRendererCache
76
79
type : VideoStreamType . VideoStreamHigh ,
77
80
encodedFrameOnly : true ,
78
81
} ) ;
82
+ AgoraElectronBridge . OnEvent (
83
+ 'call_back_with_encoded_video_frame' ,
84
+ ( ...params : any ) => {
85
+ try {
86
+ this . onEncodedVideoFrameReceived ( ...params ) ;
87
+ } catch ( e ) {
88
+ console . error ( e ) ;
89
+ }
90
+ }
91
+ ) ;
79
92
}
80
93
81
94
public shouldFallback ( frameInfo : EncodedVideoFrameInfo ) : boolean {
@@ -103,7 +116,7 @@ export class WebCodecsRendererCache
103
116
}
104
117
105
118
public release ( ) : void {
106
- logInfo ( 'call_back_with_encoded_video_frame release ' ) ;
119
+ AgoraElectronBridge . UnEvent ( 'call_back_with_encoded_video_frame' ) ;
107
120
this . _decoder ?. release ( ) ;
108
121
this . _decoder = null ;
109
122
super . release ( ) ;
0 commit comments