From e1de1fdbe207a5ac1b23123ca64ddb452af47c64 Mon Sep 17 00:00:00 2001 From: sylar Date: Tue, 1 Apr 2025 19:14:16 +0800 Subject: [PATCH] fix: store weak ref of oc object to avoid crash --- ios/Base/AgoraAudioFrameObserver.mm | 81 ++++++++++-------- ios/Base/AgoraVideoFrameObserver.mm | 122 +++++++++++++++------------- 2 files changed, 112 insertions(+), 91 deletions(-) diff --git a/ios/Base/AgoraAudioFrameObserver.mm b/ios/Base/AgoraAudioFrameObserver.mm index 17c62ce..1cbead0 100644 --- a/ios/Base/AgoraAudioFrameObserver.mm +++ b/ios/Base/AgoraAudioFrameObserver.mm @@ -14,7 +14,8 @@ class AudioFrameObserver : public media::IAudioFrameObserver { public: AudioFrameObserver(long long engineHandle, void *observer) - : engineHandle(engineHandle), observer(observer) { + : engineHandle(engineHandle), + observer((__bridge AgoraAudioFrameObserver *)observer) { auto rtcEngine = reinterpret_cast(engineHandle); if (rtcEngine) { util::AutoPtr mediaEngine; @@ -40,14 +41,16 @@ bool onRecordAudioFrame(const char *channelId, AudioFrame &audioFrame) override { @autoreleasepool { - AgoraAudioFrame *audioFrameApple = NativeToAppleAudioFrame(audioFrame); - - AgoraAudioFrameObserver *observerApple = - (__bridge AgoraAudioFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate - respondsToSelector:@selector(onRecordAudioFrame:)]) { - return [observerApple.delegate onRecordAudioFrame:audioFrameApple]; + AgoraAudioFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + AgoraAudioFrame *audioFrameApple = NativeToAppleAudioFrame(audioFrame); + + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector(onRecordAudioFrame:)]) { + return + [strongObserverApple.delegate onRecordAudioFrame:audioFrameApple]; + } } } return true; @@ -56,14 +59,16 @@ bool onRecordAudioFrame(const char *channelId, bool onPlaybackAudioFrame(const char *channelId, AudioFrame &audioFrame) override { @autoreleasepool { - AgoraAudioFrame *audioFrameApple = NativeToAppleAudioFrame(audioFrame); - - AgoraAudioFrameObserver *observerApple = - (__bridge AgoraAudioFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate - respondsToSelector:@selector(onPlaybackAudioFrame:)]) { - return [observerApple.delegate onPlaybackAudioFrame:audioFrameApple]; + AgoraAudioFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + AgoraAudioFrame *audioFrameApple = NativeToAppleAudioFrame(audioFrame); + + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector(onPlaybackAudioFrame:)]) { + return [strongObserverApple.delegate + onPlaybackAudioFrame:audioFrameApple]; + } } } return true; @@ -72,14 +77,16 @@ bool onPlaybackAudioFrame(const char *channelId, bool onMixedAudioFrame(const char *channelId, AudioFrame &audioFrame) override { @autoreleasepool { - AgoraAudioFrame *audioFrameApple = NativeToAppleAudioFrame(audioFrame); - - AgoraAudioFrameObserver *observerApple = - (__bridge AgoraAudioFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate - respondsToSelector:@selector(onMixedAudioFrame:)]) { - return [observerApple.delegate onMixedAudioFrame:audioFrameApple]; + AgoraAudioFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + AgoraAudioFrame *audioFrameApple = NativeToAppleAudioFrame(audioFrame); + + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector(onMixedAudioFrame:)]) { + return + [strongObserverApple.delegate onMixedAudioFrame:audioFrameApple]; + } } } return true; @@ -88,16 +95,18 @@ bool onMixedAudioFrame(const char *channelId, bool onPlaybackAudioFrameBeforeMixing(const char *channelId, rtc::uid_t uid, AudioFrame &audioFrame) override { @autoreleasepool { - AgoraAudioFrame *audioFrameApple = NativeToAppleAudioFrame(audioFrame); - - AgoraAudioFrameObserver *observerApple = - (__bridge AgoraAudioFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate respondsToSelector:@selector - (onPlaybackAudioFrameBeforeMixing:uid:)]) { - return [observerApple.delegate - onPlaybackAudioFrameBeforeMixing:audioFrameApple - uid:uid]; + AgoraAudioFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + AgoraAudioFrame *audioFrameApple = NativeToAppleAudioFrame(audioFrame); + + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector + (onPlaybackAudioFrameBeforeMixing:uid:)]) { + return [strongObserverApple.delegate + onPlaybackAudioFrameBeforeMixing:audioFrameApple + uid:uid]; + } } } return true; @@ -143,7 +152,7 @@ bool onEarMonitoringAudioFrame( } private: - void *observer; + __weak AgoraAudioFrameObserver *observer; long long engineHandle; }; } // namespace agora diff --git a/ios/Base/AgoraVideoFrameObserver.mm b/ios/Base/AgoraVideoFrameObserver.mm index f5ed22c..de4aefd 100644 --- a/ios/Base/AgoraVideoFrameObserver.mm +++ b/ios/Base/AgoraVideoFrameObserver.mm @@ -14,7 +14,8 @@ class VideoFrameObserver : public media::IVideoFrameObserver { public: VideoFrameObserver(long long engineHandle, void *observer) - : engineHandle(engineHandle), observer(observer) { + : engineHandle(engineHandle), + observer((__bridge AgoraVideoFrameObserver *)observer) { auto rtcEngine = reinterpret_cast(engineHandle); if (rtcEngine) { util::AutoPtr mediaEngine; @@ -40,15 +41,17 @@ bool onCaptureVideoFrame(agora::rtc::VIDEO_SOURCE_TYPE type, VideoFrame &videoFrame) override { @autoreleasepool { - AgoraVideoFrame *videoFrameApple = NativeToAppleVideoFrame(videoFrame); - - AgoraVideoFrameObserver *observerApple = - (__bridge AgoraVideoFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate - respondsToSelector:@selector(onCaptureVideoFrame:frame:)]) { - return [observerApple.delegate onCaptureVideoFrame:type - frame:videoFrameApple]; + AgoraVideoFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + AgoraVideoFrame *videoFrameApple = NativeToAppleVideoFrame(videoFrame); + + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector(onCaptureVideoFrame:frame:)]) { + return [strongObserverApple.delegate + onCaptureVideoFrame:type + frame:videoFrameApple]; + } } } return true; @@ -57,15 +60,17 @@ bool onCaptureVideoFrame(agora::rtc::VIDEO_SOURCE_TYPE type, bool onRenderVideoFrame(const char *channelId, rtc::uid_t remoteUid, VideoFrame &videoFrame) override { @autoreleasepool { - AgoraVideoFrame *videoFrameApple = NativeToAppleVideoFrame(videoFrame); - - AgoraVideoFrameObserver *observerApple = - (__bridge AgoraVideoFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate - respondsToSelector:@selector(onRenderVideoFrame:uid:)]) { - return [observerApple.delegate onRenderVideoFrame:videoFrameApple - uid:remoteUid]; + AgoraVideoFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + AgoraVideoFrame *videoFrameApple = NativeToAppleVideoFrame(videoFrame); + + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector(onRenderVideoFrame:uid:)]) { + return + [strongObserverApple.delegate onRenderVideoFrame:videoFrameApple + uid:remoteUid]; + } } } return true; @@ -74,15 +79,17 @@ bool onRenderVideoFrame(const char *channelId, rtc::uid_t remoteUid, bool onPreEncodeVideoFrame(agora::rtc::VIDEO_SOURCE_TYPE type, VideoFrame &videoFrame) override { @autoreleasepool { - AgoraVideoFrame *videoFrameApple = NativeToAppleVideoFrame(videoFrame); - - AgoraVideoFrameObserver *observerApple = - (__bridge AgoraVideoFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate - respondsToSelector:@selector(onPreEncodeVideoFrame:frame:)]) { - return [observerApple.delegate onPreEncodeVideoFrame:type - frame:videoFrameApple]; + AgoraVideoFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + AgoraVideoFrame *videoFrameApple = NativeToAppleVideoFrame(videoFrame); + + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector(onPreEncodeVideoFrame:frame:)]) { + return [strongObserverApple.delegate + onPreEncodeVideoFrame:type + frame:videoFrameApple]; + } } } @@ -91,13 +98,15 @@ bool onPreEncodeVideoFrame(agora::rtc::VIDEO_SOURCE_TYPE type, media::base::VIDEO_PIXEL_FORMAT getVideoFormatPreference() override { @autoreleasepool { - AgoraVideoFrameObserver *observerApple = - (__bridge AgoraVideoFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate - respondsToSelector:@selector(getVideoFormatPreference)]) { - return (media::base::VIDEO_PIXEL_FORMAT)[observerApple.delegate - getVideoFormatPreference]; + AgoraVideoFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector(getVideoFormatPreference)]) { + return ( + media::base::VIDEO_PIXEL_FORMAT)[strongObserverApple.delegate + getVideoFormatPreference]; + } } } return IVideoFrameObserver::getVideoFormatPreference(); @@ -105,12 +114,13 @@ bool onPreEncodeVideoFrame(agora::rtc::VIDEO_SOURCE_TYPE type, bool getRotationApplied() override { @autoreleasepool { - AgoraVideoFrameObserver *observerApple = - (__bridge AgoraVideoFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate - respondsToSelector:@selector(getRotationApplied)]) { - return [observerApple.delegate getRotationApplied]; + AgoraVideoFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector(getRotationApplied)]) { + return [strongObserverApple.delegate getRotationApplied]; + } } } return IVideoFrameObserver::getRotationApplied(); @@ -118,12 +128,13 @@ bool getRotationApplied() override { bool getMirrorApplied() override { @autoreleasepool { - AgoraVideoFrameObserver *observerApple = - (__bridge AgoraVideoFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate - respondsToSelector:@selector(getMirrorApplied)]) { - return [observerApple.delegate getMirrorApplied]; + AgoraVideoFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector(getMirrorApplied)]) { + return [strongObserverApple.delegate getMirrorApplied]; + } } } return IVideoFrameObserver::getMirrorApplied(); @@ -131,12 +142,13 @@ bool getMirrorApplied() override { uint32_t getObservedFramePosition() override { @autoreleasepool { - AgoraVideoFrameObserver *observerApple = - (__bridge AgoraVideoFrameObserver *)observer; - if (observerApple.delegate != nil && - [observerApple.delegate - respondsToSelector:@selector(getObservedFramePosition)]) { - return [observerApple.delegate getObservedFramePosition]; + AgoraVideoFrameObserver *strongObserverApple = observer; + if (strongObserverApple) { + if (strongObserverApple.delegate != nil && + [strongObserverApple.delegate + respondsToSelector:@selector(getObservedFramePosition)]) { + return [strongObserverApple.delegate getObservedFramePosition]; + } } } return IVideoFrameObserver::getObservedFramePosition(); @@ -180,13 +192,13 @@ bool onTranscodedVideoFrame( } private: - void *observer; + __weak AgoraVideoFrameObserver *observer; long long engineHandle; }; } // namespace agora @interface AgoraVideoFrameObserver () -@property(nonatomic) agora::VideoFrameObserver *observer; +@property(nonatomic, assign) agora::VideoFrameObserver *observer; @end @implementation AgoraVideoFrameObserver