8000 Fixed android VideoRenderer bug. · suresh44t/flutter-webrtc@69a1bda · GitHub
[go: up one dir, main page]

Skip to content

Commit 69a1bda

Browse files
committed
Fixed android VideoRenderer bug.
1 parent e21ccd2 commit 69a1bda

File tree

7 files changed

+71
-95
lines changed

7 files changed

+71
-95
lines changed

android/src/main/java/com/cloudwebrtc/webrtc/FlutterRTCVideoRenderer.java

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ public class FlutterRTCVideoRenderer implements EventChannel.StreamHandler {
2626

2727
public void Dispose(){
2828
//destroy
29-
this.surfaceTextureRenderer.release();
30-
eventChannel.setStreamHandler(null);
29+
if(surfaceTextureRenderer != null) {
30+
surfaceTextureRenderer.release();
31+
}
32+
if(eventChannel != null)
33+
eventChannel.setStreamHandler(null);
34+
3135
eventSink = null;
3236
}
3337

@@ -42,6 +46,10 @@ public void Dispose(){
4246

4347
@Override
4448
public void onFirstFrameRendered() {
49+
ConstraintsMap params = new ConstraintsMap();
50+
params.putString("event", "didFirstFrameRendered");
51+
params.putInt("id", id);
52+
eventSink.success(params.toMap());
4553
}
4654

4755
@Override
@@ -121,10 +129,6 @@ public void onCancel(Object o) {
121129
eventSink = null;
122130
}
123131

124-
private final SurfaceTextureRenderer getSurfaceTextureRenderer() {
125-
return surfaceTextureRenderer;
126-
}
127-
128132
/**
129133
* Stops rendering {@link #videoTrack} and releases the associated acquired
130134
* resources (if rendering is in progress).
@@ -134,8 +138,6 @@ private void removeRendererFromVideoTrack() {
134138
videoTrack.removeRenderer(videoRenderer);
135139
videoRenderer.dispose();
136140
videoRenderer = null;
137-
138-
getSurfaceTextureRenderer().release();
139141
}
140142
}
141143

@@ -159,13 +161,6 @@ public void setStream(MediaStream mediaStream) {
159161
}
160162

161163
setVideoTrack(videoTrack);
162-
163-
boolean enabled = (videoTrack != null && mediaStream != null);
164-
ConstraintsMap params = new ConstraintsMap();
165-
params.putString("event", "videoState");
166-
params.putInt("id", id);
167-
params.putBoolean("enabled", enabled);
168-
eventSink.success(params.toMap());
169164
}
170165

171166
/**
@@ -187,8 +182,7 @@ private void setVideoTrack(VideoTrack videoTrack) {
187182
if (videoTrack != null) {
188183
tryAddRendererToVideoTrack();
189184
}else{
190-
this.surfaceTextureRenderer.release();
191-
this.surfaceTextureRenderer = new SurfaceTextureRenderer(context, texture);
185+
192186
}
193187
}
194188
}
@@ -209,10 +203,11 @@ private void tryAddRendererToVideoTrack() {
209203
return;
210204
}
211205

212-
SurfaceTextureRenderer surfaceViewRenderer = getSurfaceTextureRenderer();
213-
surfaceViewRenderer.init(sharedContext, rendererEvents);
206+
surfaceTextureRenderer.release();
207+
surfaceTextureRenderer = new SurfaceTextureRenderer(context, texture);
208+
surfaceTextureRenderer.init(sharedContext, rendererEvents);
214209

215-
videoRenderer = new VideoRenderer(surfaceViewRenderer);
210+
videoRenderer = new VideoRenderer(surfaceTextureRenderer);
216211
videoTrack.addRenderer(videoRenderer);
217212
}
218213
}

android/src/main/java/com/cloudwebrtc/webrtc/PeerConnectionObserver.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,9 @@ void setPeerConnection(PeerConnection peerConnection) {
9797
void close() {
9898
eventChannel.setStreamHandler(null);
9999
peerConnection.close();
100-
100+
peerConnection.dispose();
101101
remoteStreams.clear();
102102
remoteTracks.clear();
103-
104-
// Unlike on iOS, we cannot unregister the DataChannel.Observer
105-
// instance on Android. At least do whatever else we do on iOS.
106103
dataChannels.clear();
107104
}
108105

@@ -349,13 +346,8 @@ void sendEvent(ConstraintsMap event) {
349346

350347
@Override
351348
public void onRemoveStream(MediaStream mediaStream) {
352-
String streamReactTag = getReactTagForStream(mediaStream);
353-
if (streamReactTag == null) {
354-
Log.w(TAG,
355-
"onRemoveStream - no remote stream for id: "
356-
+ mediaStream.label());
357-
return;
358-
}
349+
350+
String streamId = mediaStream.label();
359351

360352
for (VideoTrack track : mediaStream.videoTracks) {
361353
this.remoteTracks.remove(track.id());
@@ -364,11 +356,10 @@ public void onRemoveStream(MediaStream mediaStream) {
364356
this.remoteTracks.remove(track.id());
365357
}
366358

367-
this.remoteStreams.remove(streamReactTag);
368-
359+
this.remoteStreams.remove(streamId);
369360
ConstraintsMap params = new ConstraintsMap();
370361
params.putString("event", "onRemoveStream");
371-
params.putString("streamId", streamReactTag);
362+
params.putString("streamId", streamId);
372363
sendEvent(params);
373364
}
374365

example/lib/src/basic_sample/loopback_sample.dart

Lines changed: 1 addition & 1 deletion
F438
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,9 @@ class _MyAppState extends State<LoopBackSample> {
163163

164164
_hangUp() async {
165165
try {
166+
await _localStream.dispose();
166167
await _peerConnection.close();
167168
_peerConnection = null;
168-
await _localStream.dispose();
169169
_localRenderer.srcObject = null;
170170
_remoteRenderer.srcObject = null;
171171
} catch (e) {

example/lib/src/call_sample/call_sample.dart

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ class _CallSampleState extends State<CallSample> {
2121
Platform.localHostname + '(' + Platform.operatingSystem + ")";
2222
List<dynamic> _peers;
2323
var _self_id;
24-
final _localRenderer = new RTCVideoRenderer();
25-
final _remoteRenderer = new RTCVideoRenderer();
24+
RTCVideoRenderer _localRenderer = new RTCVideoRenderer();
25+
RTCVideoRenderer _remoteRenderer = new RTCVideoRenderer();
2626
bool _inCalling = false;
2727
final String serverIP;
2828

@@ -60,6 +60,8 @@ class _CallSampleState extends State<CallSample> {
6060
break;
6161
case SignalingState.CallStateBye:
6262
this.setState(() {
63+
_localRenderer.srcObject = null;
64+
_remoteRenderer.srcObject = null;
6365
_inCalling = false;
6466
});
6567
break;
@@ -74,24 +76,20 @@ class _CallSampleState extends State<CallSample> {
7476
});
7577

7678
_signaling.onLocalStream = ((stream) {
77-
this.setState(() {
78-
_localRenderer.srcObject = stream;
79-
});
79+
_localRenderer.srcObject = stream;
8080
});
8181

8282
_signaling.onAddRemoteStream = ((stream) {
8383
_remoteRenderer.srcObject = stream;
8484
});
8585

8686
_signaling.onRemoveRemoteStream = ((stream) {
87-
this.setState(() {
88-
_remoteRenderer.srcObject = null;
89-
});
87+
_remoteRenderer.srcObject = null;
9088
});
9189
}
9290
}
9391

94-
_invitePeer(context, peerId) {
92+
_invitePeer(context, peerId) async {
9593
if (_signaling != null && peerId != _self_id) {
9694
_signaling.invite(peerId, 'video');
9795
}

example/lib/src/call_sample/signaling.dart

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class Signaling {
3333
var _daChannels = new Map<int, RTCDataChannel>();
3434
Timer _timer;
3535
MediaStream _localStream;
36+
List<MediaStream> _remoteStreams;
3637
SignalingStateCallback onStateChange;
3738
StreamStateCallback onLocalStream;
3839
StreamStateCallback onAddRemoteStream;
@@ -64,10 +65,12 @@ class Signaling {
6465
Signaling(this._url, this._name);
6566

6667
close() {
68+
6769
if (_localStream != null) {
6870
_localStream.dispose();
6971
_localStream = null;
7072
}
73+
7174
_peerConnections.forEach((key, pc){
7275
pc.close();
7376
});
@@ -169,6 +172,7 @@ class Signaling {
169172
_localStream.dispose();
170173
_localStream = null;
171174
}
175+
172176
var pc = _peerConnections[id];
173177
if (pc != null) {
174178
pc.close();
@@ -181,16 +185,16 @@ class Signaling {
181185
}
182186
break;
183187
case 'bye':
184-
{
185-
var from = data['from'];
186-
var to = data['to'];
187-
var session_id = data['session_id'];
188-
print('bye: ' + session_id);
188+
{ var from = data['from'];
189+
var to = data['to'];
190+
var session_id = data['session_id'];
191+
print('bye: ' + session_id);
192+
193+
if (_localStream != null) {
194+
_localStream.dispose();
195+
_localStream = null;
196+
}
189197

190-
if (_localStream != null) {
191-
_localStream.dispose();
192-
_localStream = null;
193-
}
194198

195199
var pc = _peerConnections[to];
196200
if (pc != null) {
@@ -234,7 +238,7 @@ class Signaling {
234238
_send('new', {
235239
'name': _name,
236240
'id': _self_id,
237-
'user_agent': 'flutter-webrtc/ios-plugin 0.0.1'
241+
'user_agent': 'flutter-webrtc/'+ Platform.operatingSystem +'-plugin 0.0.1'
238242
});
239243
}catch(e){
240244
if(this.onStateChange != null){
@@ -284,11 +288,15 @@ class Signaling {
284288
pc.onAddStream = ((stream) {
285289
if(this.onAddRemoteStream != null)
286290
this.onAddRemoteStream(stream);
291+
//_remoteStreams.add(stream);
287292
});
288293

289294
pc.onRemoveStream = (stream) {
290295
if(this.onRemoveRemoteStream != null)
291296
this.onRemoveRemoteStream(stream);
297+
_remoteStreams.removeWhere((it) {
298+
return (it.id == stream.id);
299+
});
292300
};
293301

294302
pc.onDataChannel = (channel) {

ios/Classes/FlutterRTCVideoRenderer.m

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -171,17 +171,6 @@ -(void)setStreamId:(NSString*)streamId view:(FlutterRTCVideoRenderer*)view {
171171
}
172172

173173
view.videoTrack = videoTrack;
174-
175-
BOOL enabled = (stream && videoTrack);
176-
__weak FlutterRTCVideoRenderer *weakSelf = view;
177-
dispatch_async(dispatch_get_main_queue(), ^{
178-
FlutterRTCVideoRenderer *strongSelf = weakSelf;
179-
if(strongSelf.eventSink){
180-
strongSelf.eventSink(@{@"event" : @"videoState",
181-
@"id": @(strongSelf.textureId),
182-
@"enabled":@(enabled)});
183-
}
184-
});
185174
}
186175

187176
@end

0 commit comments

Comments
 (0)
0