Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 45 additions & 36 deletions ios/Base/AgoraAudioFrameObserver.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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<rtc::IRtcEngine *>(engineHandle);
if (rtcEngine) {
util::AutoPtr<media::IMediaEngine> mediaEngine;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -143,7 +152,7 @@ bool onEarMonitoringAudioFrame(
}

private:
void *observer;
__weak AgoraAudioFrameObserver *observer;
long long engineHandle;
};
} // namespace agora
Expand Down
122 changes: 67 additions & 55 deletions ios/Base/AgoraVideoFrameObserver.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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<rtc::IRtcEngine *>(engineHandle);
if (rtcEngine) {
util::AutoPtr<media::IMediaEngine> mediaEngine;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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];
}
}
}

Expand All @@ -91,52 +98,57 @@ 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();
}

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();
}

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();
}

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();
Expand Down Expand Up @@ -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
Expand Down