Skip to content

Commit fbfcdb5

Browse files
author
Xia Ning
committed
add protection for cpp video frame observer class
1 parent e569548 commit fbfcdb5

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

Android/APIExample/README.zh.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
3. 复制后台的 **App Id** 并备注,稍后启动应用时会用到它
2424
4. 在项目页面生成临时 **Access Token** (24小时内有效)并备注,注意生成的Token只能适用于对应的频道名。
2525

26-
5. 打开 `Android/APIExample` 并编辑 `app/src/main/res/values/string-config.xml`,将你的 AppID 和 Token 分别替换到 `<#Your App Id#>``<#Temp Access Token#>`
26+
5. 打开 `Android/APIExample` 并编辑 `app/src/main/res/values/string_config.xml`,将你的 AppID 和 Token 分别替换到 `<#Your App Id#>``<#Temp Access Token#>`
2727

2828
```
2929
<string name="agora_app_id" translatable="false">YOUR APP ID</string>
@@ -33,6 +33,10 @@
3333
3434
然后你就可以编译并运行项目了。
3535
36+
> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
37+
>
38+
> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
39+
3640
## 联系我们
3741
3842
- 如果你遇到了困难,可以先参阅 [常见问题](https://docs.agora.io/cn/faq)

Android/APIExample/lib-raw-data/src/main/cpp/io_agora_advancedvideo_rawdata_MediaPreProcessing.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ void *_javaDirectPlayBufferPlayAudio = nullptr;
2727
void *_javaDirectPlayBufferBeforeMixAudio = nullptr;
2828
void *_javaDirectPlayBufferMixAudio = nullptr;
2929
map<int, void *> decodeBufferMap;
30+
volatile bool mAvailable = false;
3031

3132
static JavaVM *gJVM = nullptr;
3233

@@ -68,6 +69,13 @@ class AgoraVideoFrameObserver : public agora::media::IVideoFrameObserver
6869
memcpy((uint8_t *) _byteBufferObject + widthAndHeight * 5 / 4, videoFrame.vBuffer,
6970
widthAndHeight / 4);
7071

72+
73+
if (!mAvailable)
74+
{
75+
// check gCallBack is available.
76+
return;
77+
}
78+
7179
if (uid == 0)
7280
{
7381
env->CallVoidMethod(gCallBack, jmethodID, videoFrame.type, width, height, length,
@@ -204,6 +212,12 @@ class AgoraAudioFrameObserver : public agora::media::IAudioFrameObserver
204212
int len = audioFrame.samples * audioFrame.bytesPerSample;
205213
memcpy(_byteBufferObject, audioFrame.buffer, (size_t) len); // * sizeof(int16_t)
206214

215+
if (!mAvailable)
216+
{
217+
// check gCallBack is available.
218+
return;
219+
}
220+
207221
if (uid == 0)
208222
{
209223
env->CallVoidMethod(gCallBack, jmethodID, audioFrame.type, audioFrame.samples,
@@ -364,12 +378,14 @@ JNIEXPORT void JNICALL Java_io_agora_advancedvideo_rawdata_MediaPreProcessing_se
364378
captureVideoMethodId = env->GetMethodID(gCallbackClass, "onCaptureVideoFrame",
365379
"(IIIIIIIIJ)V");
366380
preEncodeVideoMethodId = env->GetMethodID(gCallbackClass, "onPreEncodeVideoFrame",
367-
"(IIIIIIIIJ)V");
381+
"(IIIIIIIIJ)V");
368382
renderVideoMethodId = env->GetMethodID(gCallbackClass, "onRenderVideoFrame",
369383
"(IIIIIIIIIJ)V");
370384

371385
__android_log_print(ANDROID_LOG_DEBUG, "setCallback", "setCallback done successfully");
372386
}
387+
388+
mAvailable = true;
373389
}
374390

375391
JNIEXPORT void JNICALL
@@ -425,6 +441,8 @@ Java_io_agora_advancedvideo_rawdata_MediaPreProcessing_setVideoDecodeByteBuffer
425441
JNIEXPORT void JNICALL Java_io_agora_advancedvideo_rawdata_MediaPreProcessing_releasePoint
426442
(JNIEnv *env, jclass)
427443
{
444+
mAvailable = false;
445+
428446
agora::util::AutoPtr<agora::media::IMediaEngine> mediaEngine;
429447
mediaEngine.queryInterface(rtcEngine, agora::INTERFACE_ID_TYPE::AGORA_IID_MEDIA_ENGINE);
430448

0 commit comments

Comments
 (0)