Skip to content

Commit c844528

Browse files
committed
Revert "chore: optimize"
This reverts commit 29aa87d.
1 parent 3240684 commit c844528

File tree

7 files changed

+108
-22
lines changed

7 files changed

+108
-22
lines changed

source_code/agora_node_ext/agora_electron_bridge.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ napi_value AgoraElectronBridge::Init(napi_env env, napi_value exports) {
4040
napi_property_descriptor properties[] = {
4141
DECLARE_NAPI_METHOD("CallApi", CallApi),
4242
DECLARE_NAPI_METHOD("OnEvent", OnEvent),
43+
DECLARE_NAPI_METHOD("UnEvent", UnEvent),
4344
DECLARE_NAPI_METHOD("GetBuffer", GetBuffer),
4445
DECLARE_NAPI_METHOD("EnableVideoFrameCache", EnableVideoFrameCache),
4546
DECLARE_NAPI_METHOD("DisableVideoFrameCache", DisableVideoFrameCache),
@@ -250,6 +251,30 @@ napi_value AgoraElectronBridge::OnEvent(napi_env env, napi_callback_info info) {
250251
RETURE_NAPI_OBJ();
251252
}
252253

254+
napi_value AgoraElectronBridge::UnEvent(napi_env env, napi_callback_info info) {
255+
napi_status status;
256+
size_t argc = 2;
257+
napi_value args[2];
258+
napi_value jsthis;
259+
int ret = ERR_FAILED;
260+
status = napi_get_cb_info(env, info, &argc, args, &jsthis, nullptr);
261+
assert(status == napi_ok);
262+
263+
AgoraElectronBridge *agoraElectronBridge;
264+
status =
265+
napi_unwrap(env, jsthis, reinterpret_cast<void **>(&agoraElectronBridge));
266+
assert(status == napi_ok);
267+
268+
std::string eventName = "";
269+
status = napi_get_value_utf8string(env, args[0], eventName);
270+
assert(status == napi_ok);
271+
272+
agoraElectronBridge->_iris_rtc_event_handler->removeEvent(eventName);
273+
ret = ERR_OK;
274+
275+
RETURE_NAPI_OBJ();
276+
}
277+
253278
napi_value AgoraElectronBridge::SetAddonLogFile(napi_env env,
254279
napi_callback_info info) {
255280
napi_status status;

source_code/agora_node_ext/agora_electron_bridge.h

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class AgoraElectronBridge {
3434
static napi_value CallApi(napi_env env, napi_callback_info info);
3535
static napi_value GetBuffer(napi_env env, napi_callback_info info);
3636
static napi_value OnEvent(napi_env env, napi_callback_info info);
37+
static napi_value UnEvent(napi_env env, napi_callback_info info);
3738
static napi_value EnableVideoFrameCache(napi_env env,
3839
napi_callback_info info);
3940
static napi_value DisableVideoFrameCache(napi_env env,

source_code/agora_node_ext/node_iris_event_handler.cpp

+44-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,14 @@ void NodeIrisEventHandler::removeEvent(const std::string &eventName) {
5353
}
5454

5555
void NodeIrisEventHandler::OnEvent(EventParam *param) {
56-
fireEvent(_callback_key, param->event, param->data, param->buffer,
57-
param->length, param->buffer_count);
56+
const char *event = "VideoEncodedFrameObserver_onEncodedVideoFrameReceived";
57+
58+
if (strcmp(event, param->event) == 0) {
59+
onEncodedVideoFrameReceived(param->data, param->buffer[0], param->length);
60+
} else {
61+
fireEvent(_callback_key, param->event, param->data, param->buffer,
62+
param->length, param->buffer_count);
63+
}
5864
}
5965

6066
void NodeIrisEventHandler::fireEvent(const char *callback_name,
@@ -128,6 +134,42 @@ void NodeIrisEventHandler::fireEvent(const char *callback_name,
128134
});
129135
}
130136

137+
void NodeIrisEventHandler::onEncodedVideoFrameReceived(const char *data,
138+
void *buffer,
139+
unsigned int *length) {
140+
std::string eventData = "";
141+
if (data) { eventData = data; }
142+
std::vector<unsigned char> buffer_data(length[0]);
143+
memcpy(buffer_data.data(), buffer, length[0]);
144+
145+
unsigned int buffer_length = length[0];
146+
147+
node_async_call::async_call([this, eventData, buffer_data, buffer_length] {
148+
auto it = _callbacks.find("call_back_with_encoded_video_frame");
149+
if (it != _callbacks.end()) {
150+
size_t argc = 2;
151+
napi_value args[2];
152+
napi_value result;
153+
napi_status status;
154+
status = napi_create_string_utf8(it->second->env, eventData.c_str(),
155+
eventData.length(), &args[0]);
156+
157+
napi_create_buffer_copy(it->second->env, buffer_length,
158+
buffer_data.data(), nullptr, &args[1]);
159+
160+
napi_value call_back_value;
161+
status = napi_get_reference_value(
162+
it->second->env, it->second->call_back_ref, &call_back_value);
163+
164+
napi_value recv_value;
165+
status = napi_get_undefined(it->second->env, &recv_value);
166+
167+
status = napi_call_function(it->second->env, recv_value, call_back_value,
168+
argc, args, &result);
169+
}
170+
});
171+
}
172+
131173
}// namespace electron
132174
}// namespace rtc
133175
}// namespace agora

source_code/agora_node_ext/node_iris_event_handler.h

+3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class NodeIrisEventHandler : public iris::IrisEventHandler {
3131
void **buffer, unsigned int *length,
3232
unsigned int buffer_count);
3333

34+
void onEncodedVideoFrameReceived(const char *data, void *buffer,
35+
unsigned int *length);
36+
3437
void addEvent(const std::string &eventName, napi_env &env,
3538
napi_value &call_bcak, napi_value &global);
3639

ts/Decoder/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ export class WebCodecsDecoder {
122122
this._currentCodecConfig?.codedWidth !== frameInfo.width ||
123123
this._currentCodecConfig?.codedHeight !== frameInfo.height
124124
) {
125-
logInfo('frameInfo has changed, reconfigure decoder');
125+
logInfo('codecType is changed, reconfigure decoder');
126126
this._decoder.reset();
127127
this.decoderConfigure(frameInfo);
128128
}

ts/Renderer/WebCodecsRendererCache.ts

+32-19
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
import createAgoraRtcEngine from '../AgoraSdk';
22
import { WebCodecsDecoder } from '../Decoder/index';
33
import { EncodedVideoFrameInfo, VideoStreamType } from '../Private/AgoraBase';
4-
import { IVideoEncodedFrameObserver } from '../Private/AgoraMediaBase';
54
import { IRtcEngineEx } from '../Private/IAgoraRtcEngineEx';
5+
import { AgoraElectronBridge } from '../Private/internal/IrisApiEngine';
66

77
import { RendererContext, RendererType } from '../Types';
88
import { AgoraEnv, logInfo } from '../Utils';
99

1010
import { IRendererCache } from './IRendererCache';
1111
import { WebCodecsRenderer } from './WebCodecsRenderer/index';
1212

13-
export class WebCodecsRendererCache
14-
extends IRendererCache
15-
implements IVideoEncodedFrameObserver
16-
{
13+
export class WebCodecsRendererCache extends IRendererCache {
1714
private _decoder?: WebCodecsDecoder | null;
1815
private _engine?: IRtcEngineEx;
1916
private _firstFrame = true;
@@ -34,38 +31,44 @@ export class WebCodecsRendererCache
3431
AgoraEnv.AgoraRendererManager?.handleWebCodecsFallback(this.cacheContext);
3532
}
3633

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;
4447
if (this._firstFrame) {
4548
for (let renderer of this.renderers) {
4649
if (renderer.rendererType !== RendererType.WEBCODECSRENDERER) {
4750
continue;
4851
}
4952
renderer.bind(renderer.context.view, {
50-
width: videoEncodedFrameInfo.width!,
51-
height: videoEncodedFrameInfo.height!,
53+
width: _data.videoEncodedFrameInfo.width!,
54+
height: _data.videoEncodedFrameInfo.height!,
5255
});
5356
}
5457

5558
try {
56-
this._decoder.decoderConfigure(videoEncodedFrameInfo);
59+
this._decoder.decoderConfigure(_data.videoEncodedFrameInfo);
5760
} catch (error: any) {
5861
logInfo(error);
5962
return;
6063
}
6164
this._firstFrame = false;
6265
}
63-
if (this.shouldFallback(videoEncodedFrameInfo)) {
66+
if (this.shouldFallback(_data.videoEncodedFrameInfo)) {
6467
AgoraEnv.AgoraRendererManager?.handleWebCodecsFallback(this.cacheContext);
6568
} else {
6669
this._decoder.decodeFrame(
67-
imageBuffer,
68-
videoEncodedFrameInfo,
70+
buffer,
71+
_data.videoEncodedFrameInfo,
6972
new Date().getTime()
7073
);
7174
}
@@ -76,6 +79,16 @@ export class WebCodecsRendererCache
7679
type: VideoStreamType.VideoStreamHigh,
7780
encodedFrameOnly: true,
7881
});
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+
);
7992
}
8093

8194
public shouldFallback(frameInfo: EncodedVideoFrameInfo): boolean {
@@ -103,7 +116,7 @@ export class WebCodecsRendererCache
103116
}
104117

105118
public release(): void {
106-
logInfo('call_back_with_encoded_video_frame release');
119+
AgoraElectronBridge.UnEvent('call_back_with_encoded_video_frame');
107120
this._decoder?.release();
108121
this._decoder = null;
109122
super.release();

ts/Types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ export interface IAgoraElectronBridge {
117117
) => void
118118
): void;
119119

120+
UnEvent(callbackName: string): void;
121+
120122
CallApi(
121123
funcName: string,
122124
params: any,

0 commit comments

Comments
 (0)