8000 Update. · Condelab/flutter-webrtc@09560e8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 09560e8

Browse files
committed
Update.
1 parent 80a7db1 commit 09560e8

File tree

6 files changed

+91
-53
lines changed

6 files changed

+91
-53
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
import org.webrtc.VideoTrack;
1616

1717
import io.flutter.plugin.common.EventChannel;
18+
import io.flutter.view.TextureRegistry;
1819

1920
public class FlutterRTCVideoRenderer implements EventChannel.StreamHandler {
2021

2122
private static final String TAG = FlutterWebRTCPlugin.TAG;
2223
private final SurfaceTexture texture;
24+
private TextureRegistry.SurfaceTextureEntry entry;
2325
private int id = -1;
2426

2527
public void Dispose(){
@@ -31,6 +33,7 @@ public void Dispose(){
3133
eventChannel.setStreamHandler(null);
3234

3335
eventSink = null;
36+
entry.release();
3437
}
3538

3639
/**
@@ -96,13 +99,14 @@ public void onFrameResolutionChanged(
9699
EventChannel eventChannel;
97100
EventChannel.EventSink eventSink;
98101

99-
public FlutterRTCVideoRenderer(SurfaceTexture texture) {
102+
public FlutterRTCVideoRenderer(SurfaceTexture texture, TextureRegistry.SurfaceTextureEntry entry) {
100103
this.surfaceTextureRenderer = new SurfaceTextureRenderer("");
101104
surfaceTextureRenderer.init(EglUtils.getRootEglBaseContext(), rendererEvents);
102105
surfaceTextureRenderer.surfaceCreated(texture);
103106

104107
this.texture = texture;
105108
this.eventSink = null;
109+
this.entry = entry;
106110
}
107111

108112
public void setEventChannel(EventChannel eventChannel){

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ public void onMethodCall(MethodCall call, Result result) {
237237
} else if (call.method.equals("createVideoRenderer")) {
238238
TextureRegistry.SurfaceTextureEntry entry = textures.createSurfaceTexture();
239239
SurfaceTexture surfaceTexture = entry.surfaceTexture();
240-
FlutterRTCVideoRenderer render = new FlutterRTCVideoRenderer(surfaceTexture);
240+
FlutterRTCVideoRenderer render = new FlutterRTCVideoRenderer(surfaceTexture, entry);
241241
renders.put(entry.id(), render);
242242

243243
EventChannel eventChannel =

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

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.webrtc.MediaStreamTrack;
2525
import org.webrtc.PeerConnection;
2626
import org.webrtc.RtpReceiver;
27+
import org.webrtc.RtpTransceiver;
2728
import org.webrtc.StatsObserver;
2829
import org.webrtc.StatsReport;
2930
import org.webrtc.VideoTrack;
@@ -375,34 +376,26 @@ public void onRemoveStream(MediaStream mediaStream) {
375376
@Override
376377
public void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams){
377378
Log.d(TAG, "onAddTrack");
378-
379379
for (MediaStream stream : mediaStreams) {
380380
String streamId = stream.getId();
381-
List<MediaStreamTrack> tracks = new ArrayList<>(stream.audioTracks);
382-
tracks.addAll(stream.videoTracks);
383-
384-
for (MediaStreamTrack track : tracks) {
385-
ConstraintsMap params = new ConstraintsMap();
386-
params.putString("event", "onAddTrack");
387-
params.putString("streamId", streamId);
388-
params.putString("trackId", track.id());
389-
390-
String trackId = track.id();
391-
ConstraintsMap trackInfo = new ConstraintsMap();
392-
trackInfo.putString("id", trackId);
393-
trackInfo.putString("label", track.kind());
394-
trackInfo.putString("kind", track.kind());
395-
trackInfo.putBoolean("enabled", track.enabled());
396-
trackInfo.putString("readyState", track.state().toString());
397-
trackInfo.putBoolean("remote", true);
398-
399-
params.putMap("track", trackInfo.toMap());
400-
401-
sendEvent(params);
402-
}
381+
MediaStreamTrack track = receiver.track();
382+
ConstraintsMap params = new ConstraintsMap();
383+
params.putString("event", "onAddTrack");
384+
params.putString("streamId", streamId);
385+
params.putString("trackId", track.id());
386+
387+
String trackId = track.id();
388+
ConstraintsMap trackInfo = new ConstraintsMap();
389+
trackInfo.putString("id", trackId);
390+
trackInfo.putString("label", track.kind());
391+
trackInfo.putString("kind", track.kind());
392+
trackInfo.putBoolean("enabled", track.enabled());
393+
trackInfo.putString("readyState", track.state().toString());
394+
trackInfo.putBoolean("remote", true);
395+
params.putMap("track", trackInfo.toMap());
396+
sendEvent(params);
403397
}
404398
}
405-
406399
@Override
407400
public void onDataChannel(DataChannel dataChannel) {
408401
// XXX Unfortunately, the Java WebRTC API doesn't expose the id

lib/media_stream.dart

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,18 @@ class MediaStream {
1111
MediaStream(this._streamId);
1212

1313
void setMediaTracks(List<dynamic> audioTracks, List<dynamic> videoTracks){
14+
15+
List<MediaStreamTrack> newAudioTracks = new List();
1416
audioTracks.forEach((track){
15-
_audioTracks.add(new MediaStreamTrack(track["id"], track["label"], track["kind"], track["enabled"]));
17+
newAudioTracks.add(new MediaStreamTrack(track["id"], track["label"], track["kind"], track["enabled"]));
1618
});
19+
_audioTracks = newAudioTracks;
20+
21+
List<MediaStreamTrack> newVideoTracks = new List();
1722
videoTracks.forEach((track){
18-
_videoTracks.add(new MediaStreamTrack(track["id"], track["label"], track["kind"], track["enabled"]));
23+
newVideoTracks.add(new MediaStreamTrack(track["id"], track["label"], track["kind"], track["enabled"]));
1924
});
25+
_videoTracks = newVideoTracks;
2026
}
2127

2228
Future<void> getMediaTracks() async {
@@ -27,34 +33,41 @@ class MediaStream {
2733
);
2834

2935
List<dynamic> audioTracks = response['audioTracks'];
36+
37+
List<MediaStreamTrack> newAudioTracks = new List();
3038
audioTracks.forEach((track){
31-
_audioTracks.add(new MediaStreamTrack(track["id"], track["label"], track["kind"], track["enabled"]));
39+
newAudioTracks.add(new MediaStreamTrack(track["id"], track["label"], track["kind"], track["enabled"]));
3240
});
41+
_audioTracks = newAudioTracks;
3342

43+
List<MediaStreamTrack> newVideoTracks = new List();
3444
List<dynamic> videoTracks = response['videoTracks'];
3545
videoTracks.forEach((track){
36-
_videoTracks.add(new MediaStreamTrack(track["id"], track["label"], track["kind"], track["enabled"]));
46+
newVideoTracks.add(new MediaStreamTrack(track["id"], track["label"], track["kind"], track["enabled"]));
3747
});
48+
_videoTracks = newVideoTracks;
3849
}
3950

4051
String get id => _streamId;
41-
addTrack(MediaStreamTrack track) {
52+
Future<void> addTrack(MediaStreamTrack track, {bool addToNaitve = true}) async {
4253
if (track.kind == 'audio')
4354
_audioTracks.add(track);
4455
else
4556
_videoTracks.add(track);
4657

47-
_channel.invokeMethod('mediaStreamAddTrack',
58+
if(addToNaitve)
59+
await _channel.invokeMethod('mediaStreamAddTrack',
4860
<String, dynamic>{'streamId': _streamId, 'trackId': track.id});
4961
}
5062

51-
removeTrack(MediaStreamTrack track) {
63+
Future<void> removeTrack(MediaStreamTrack track, {bool removeFromNaitve = true}) async {
5264
if (track.kind == 'audio')
53-
_audioTracks.remove(track);
65+
_audioTracks.removeWhere((it) => it.id == track.id);
5466
else
55-
_videoTracks.remove(track);
67+
_videoTracks.removeWhere((it) => it.id == track.id);
5668

57-
_channel.invokeMethod('mediaStreamRemoveTrack',
69+
if(removeFromNaitve)
70+
await _channel.invokeMethod EED3 ('mediaStreamRemoveTrack',
5871
<String, dynamic>{'streamId': _streamId, 'trackId': track.id});
5972
}
6073

lib/rtc_data_channel.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ class RTCDataChannel {
7979
throw e;
8080
}
8181

82-
void send(String type, dynamic data){
83-
_channel.invokeMethod('dataChannelSend',
82+
Future<void> send(String type, dynamic data) async {
83+
await _channel.invokeMethod('dataChannelSend',
8484
<String, dynamic>{ 'peerConnectionId': _peerConnectionId,
8585
'dataChannelId': _dataChannelId,
8686
'type': type,

lib/rtc_peerconnection.dart

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ enum RTCIceConnectionState {
3636
}
3737

3838
/*
39-
* 回调类型定义.
39+
* Delegate for PeerConnection.
4040
*/
4141
typedef void SignalingStateCallback(RTCSignalingState state);
4242
typedef void IceGatheringStateCallback(RTCIceGatheringState state);
@@ -56,8 +56,8 @@ class RTCPeerConnection {
5656
String _peerConnectionId;
5757
MethodChannel _channel = WebRTC.methodChannel();
5858
StreamSubscription<dynamic> _eventSubscription;
59-
List<MediaStream> _localStreams;
60-
List<MediaStream> _remoteStreams;
59+
List<MediaStream> _localStreams = new List();
60+
List<MediaStream> _remoteStreams = new List();
6161
RTCDataChannel _dataChannel;
6262

6363
// public: delegate
@@ -116,26 +116,52 @@ class RTCPeerConnection {
116116
break;
117117
case 'onAddStream':
118118
String streamId = map['streamId'];
119-
MediaStream stream = new MediaStream(streamId);
120-
stream.setMediaTracks(map['audioTracks'], map['videoTracks']);
119+
MediaStream stream = _remoteStreams.firstWhere((it) => it.id == streamId, orElse: () {
120+
var newStream = new MediaStream(streamId);
121+
newStream.setMediaTracks(map['audioTracks'], map['videoTracks']);
122+
_remoteStreams.add(newStream);
123+
return newStream;
124+
});
121125
if (this.onAddStream != null) this.onAddStream(stream);
126+
_remoteStreams.add(stream);
122127
break;
123128
case 'onRemoveStream':
124129
String streamId = map['streamId'];
125-
MediaStream stream = new MediaStream(streamId);
130+
MediaStream stream = _remoteStreams.firstWhere((it) => it.id == streamId, orElse: () {
131+
return null;
132+
});
126133
if (this.onRemoveStream != null) this.onRemoveStream(stream);
134+
_remoteStreams.removeWhere((it) => it.id == streamId);
127135
break;
128136
case 'onAddTrack':
129137
String streamId = map['streamId'];
130-
MediaStream stream = new MediaStream(streamId);
131138
Map<dynamic, dynamic> track = map['track'];
139+
132140
MediaStreamTrack newTrack = new MediaStreamTrack(
133141
map['trackId'], track['label'], track['kind'], track['enabled']);
142+
String kind = track["kind"];
143+
144+
MediaStream stream = _remoteStreams.firstWhere((it) => it.id == streamId,orElse: () {
145+
var newStream = new MediaStream(streamId);
146+
_remoteStreams.add(newStream);
147+
return newStream;
148+
});
149+
150+
List<MediaStreamTrack> oldTracks = (kind == 'audio')? stream.getAudioTracks() : stream.getVideoTracks();
151+
MediaStreamTrack oldTrack = oldTracks.length > 0? oldTracks[0] : null;
152+
if(oldTrack != null){
153+
stream.removeTrack(oldTrack, removeFromNaitve: false);
154+
if (this.onRemoveTrack != null) this.onRemoveTrack(stream, oldTrack);
155+
}
156+
157+
stream.addTrack(newTrack, addToNaitve: false);
134158
if (this.onAddTrack != null) this.onAddTrack(stream, newTrack);
135159
break;
136160
case 'onRemoveTrack':
137161
String streamId = map['streamId'];
138-
MediaStream stream = new MediaStream(streamId);
162+
MediaStream stream = _remoteStreams.firstWhere((it) => it.id == streamId, orElse: () {
163+
return null;
164+
});
139165
Map<dynamic, dynamic> track = map['track'];
140166
MediaStreamTrack oldTrack = new MediaStreamTrack(
141167
map['trackId'], track['label'], track['kind'], track['enabled']);
@@ -159,7 +185,7 @@ class RTCPeerConnection {
159185
throw e;
160186
}
161187

162-
Future<Null> dispose() async {
188+
Future<void> dispose() async {
163189
await _eventSubscription?.cancel();
164190
await _channel.invokeMethod(
165191
'peerConnectionDispose',
@@ -207,15 +233,17 @@ class RTCPeerConnection {
207233
}
208234
}
209235

210-
void addStream(MediaStream stream) {
211-
_channel.invokeMethod('addStream', <String, dynamic>{
236+
Future<void> addStream(MediaStream stream) async {
237+
_localStreams.add(stream);
238+
await _channel.invokeMethod('addStream', <String, dynamic>{
212239
'peerConnectionId': this._peerConnectionId,
213240
'streamId': stream.id,
214241
});
215242
}
216243

217-
void removeStream(MediaStream stream) {
218-
_channel.invokeMethod('removeStream', <String, dynamic>{
244+
Future<void> removeStream(MediaStream stream) async {
245+
_localStreams.removeWhere((it) => it.id == stream.id);
246+
await _channel.invokeMethod('removeStream', <String, dynamic>{
219247
'peerConnectionId': this._peerConnectionId,
220248
'streamId': stream.id,
221249
});
@@ -243,8 +271,8 @@ class RTCPeerConnection {
243271
}
244272
}
245273

246-
void addCandidate(RTCIceCandidate candidate) {
247-
_channel.invokeMethod('addCandidate', <String, dynamic>{
274+
Future<void> addCandidate(RTCIceCandidate candidate) async {
275+
await _channel.invokeMethod('addCandidate', <String, dynamic>{
248276
'peerConnectionId': this._peerConnectionId,
249277
'candidate': candidate.toMap(),
250278
});

0 commit comments

Comments
 (0)
0