5
5
#import < AgoraRtcWrapper/iris_rtc_rendering_cxx.h>
6
6
#import < Foundation/Foundation.h>
7
7
8
+ #import < memory.h>
8
9
#import < stdio.h>
9
10
10
11
using namespace agora ::iris;
@@ -26,7 +27,8 @@ @interface TextureRender ()
26
27
@end
27
28
28
29
namespace {
29
- class RendererDelegate : public agora ::iris::VideoFrameObserverDelegate {
30
+ class RendererDelegate : public std ::enable_shared_from_this<RendererDelegate>,
31
+ public agora::iris::VideoFrameObserverDelegate {
30
32
public:
31
33
RendererDelegate (void *renderer)
32
34
: renderer_(((__bridge TextureRender *)renderer)), pre_width_(0 ),
@@ -40,6 +42,8 @@ void OnVideoFrameReceived(const void *videoFrame,
40
42
return ;
41
43
}
42
44
45
+ std::weak_ptr<RendererDelegate> self_weak = shared_from_this ();
46
+
43
47
agora::media::base::VideoFrame *vf =
44
48
(agora::media::base::VideoFrame *)videoFrame;
45
49
@@ -61,8 +65,14 @@ void OnVideoFrameReceived(const void *videoFrame,
61
65
// copy the width and height to local variables.
62
66
int temp_width = vf->width ;
63
67
int temp_height = vf->height ;
68
+
64
69
dispatch_async (dispatch_get_main_queue (), ^{
65
- TextureRender *strongRenderer = renderer_;
70
+ std::shared_ptr<RendererDelegate> self_strong = self_weak.lock ();
71
+ if (!self_strong) {
72
+ return ;
73
+ }
74
+
75
+ TextureRender *strongRenderer = self_strong->renderer_ ;
66
76
if (!strongRenderer) {
67
77
return ;
68
78
}
@@ -93,7 +103,12 @@ void OnVideoFrameReceived(const void *videoFrame,
93
103
94
104
// notify new frame available on main thread
95
105
dispatch_async (dispatch_get_main_queue (), ^{
96
- TextureRender *strongRenderer = renderer_;
106
+ std::shared_ptr<RendererDelegate> self_strong = self_weak.lock ();
107
+ if (!self_strong) {
108
+ return ;
109
+ }
110
+
111
+ TextureRender *strongRenderer = self_strong->renderer_ ;
97
112
if (!strongRenderer) {
98
113
return ;
99
114
}
@@ -111,7 +126,7 @@ void OnVideoFrameReceived(const void *videoFrame,
111
126
112
127
@interface TextureRender ()
113
128
114
- @property (nonatomic ) RendererDelegate * delegate;
129
+ @property (nonatomic ) std::shared_ptr< RendererDelegate> delegate;
115
130
116
131
@end
117
132
@@ -133,7 +148,7 @@ @implementation TextureRender
133
148
self .textureId]
134
149
binaryMessenger: messenger];
135
150
136
- self.delegate = new :: RendererDelegate ((__bridge void *)self);
151
+ self.delegate = std::make_shared<:: RendererDelegate> ((__bridge void *)self);
137
152
self.latestPixelBuffer = nil ;
138
153
self.pixelBufferSynchronizationQueue = dispatch_queue_create (
139
154
[[NSString stringWithFormat: @" io.agora.flutter.render_%lld " , _textureId]
@@ -163,7 +178,7 @@ - (void)updateData:(NSNumber *)uid
163
178
agora::media::base::VIDEO_MODULE_POSITION::POSITION_PRE_RENDERER;
164
179
165
180
self.delegateId = self.irisRtcRendering ->AddVideoFrameObserverDelegate (
166
- config, self.delegate );
181
+ config, self.delegate . get () );
167
182
}
168
183
169
184
- (CVPixelBufferRef _Nullable)copyPixelBuffer {
@@ -184,8 +199,7 @@ - (void)dispose {
184
199
self.irisRtcRendering = nil ;
185
200
}
186
201
if (self.delegate ) {
187
- delete self.delegate ;
188
- self.delegate = nil ;
202
+ self.delegate .reset ();
189
203
}
190
204
if (self.textureRegistry ) {
191
205
[self .textureRegistry unregisterTexture: self .textureId];
0 commit comments