8000 Merge pull request #350 from flutter-webrtc/issues/349 · next-coder/flutter-webrtc@89ed3c6 · GitHub
[go: up one dir, main page]

Skip to content

Commit 89ed3c6

Browse files
authored
Issues/349
2 parents dce7e97 + 5fc32d9 commit 89ed3c6

File tree

2 files changed

+63
-30
lines changed

2 files changed

+63
-30
lines changed

lib/src/web/rtc_video_view.dart

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class RTCVideoRenderer extends ValueNotifier<RTCVideoValue> {
8282
final int textureId;
8383
html.VideoElement videoElement;
8484
MediaStream _srcObject;
85+
final _subscriptions = <StreamSubscription>[];
8586

8687
bool get muted => videoElement?.muted ?? true;
8788

@@ -104,40 +105,57 @@ class RTCVideoRenderer extends ValueNotifier<RTCVideoValue> {
104105
ui.platformViewRegistry.registerViewFactory(
105106
'RTCVideoRenderer-$textureId', (int viewId) => videoElement);
106107

107-
videoElement.onCanPlay.listen((dynamic _) {
108-
value = value.copyWith(
109-
rotation: 0,
110-
width: videoElement.videoWidth.toDouble() ?? 0.0,
111-
height: videoElement.videoHeight.toDouble() ?? 0.0,
112-
renderVideo: renderVideo);
113-
print('RTCVideoRenderer: videoElement.onCanPlay ${value.toString()}');
114-
});
108+
_subscriptions.add(
109+
videoElement.onCanPlay.listen(
110+
(dynamic _) {
111+
_updateAllValues();
112+
print('RTCVideoRenderer: videoElement.onCanPlay ${value.toString()}');
113+
},
114+
),
115+
);
115116

116-
videoElement.onResize.listen((dynamic _) {
117-
value = value.copyWith(
118-
rotation: 0,
119-
width: videoElement.videoWidth.toDouble() ?? 0.0,
120-
height: videoElement.videoHeight.toDouble() ?? 0.0,
121-
renderVideo: renderVideo);
122-
print('RTCVideoRenderer: videoElement.onResize ${value.toString()}');
123-
});
117+
_subscriptions.add(
118+
videoElement.onResize.listen(
119+
(dynamic _) {
120+
_updateAllValues();
121+
print('RTCVideoRenderer: videoElement.onResize ${value.toString()}');
122+
},
123+
),
124+
);
124125

125126
// The error event fires when some form of error occurs while attempting to load or perform the media.
126-
videoElement.onError.listen((html.Event _) {
127-
// The Event itself (_) doesn't contain info about the actual error.
128-
// We need to look at the HTMLMediaElement.error.
129-
// See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error
130-
var error = videoElement.error;
131-
throw PlatformException(
132-
code: _kErrorValueToErrorName[error.code],
133-
message: error.message != '' ? error.message : _kDefaultErrorMessage,
134-
details: _kErrorValueToErrorDescription[error.code],
135-
);
136-
});
127+
_subscriptions.add(
128+
videoElement.onError.listen(
129+
(html.Event _) {
130+
// The Event itself (_) doesn't contain info about the actual error.
131+
// We need to look at the HTMLMediaElement.error.
132+
// See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error
133+
var error = videoElement.error;
134+
throw PlatformException(
135+
code: _kErrorValueToErrorName[error.code],
136+
message:
137+
error.message != '' ? error.message : _kDefaultErrorMessage,
138+
details: _kErrorValueToErrorDescription[error.code],
139+
);
140+
},
141+
),
142+
);
137143

138-
videoElement.onEnded.listen((dynamic _) {
139-
print('RTCVideoRenderer: videoElement.onEnded');
140-
});
144+
_subscriptions.add(
145+
videoElement.onEnded.listen(
146+
(dynamic _) {
147+
print('RTCVideoRenderer: videoElement.onEnded');
148+
},
149+
),
150+
);
151+
}
152+
153+
void _updateAllValues() {
154+
value = value.copyWith(
155+
rotation: 0,
156+
width: videoElement?.videoWidth?.toDouble() ?? 0.0,
157+
height: videoElement?.videoHeight?.toDouble() ?? 0.0,
158+
renderVideo: renderVideo);
141159
}
142160

143161
MediaStream get srcObject => _srcObject;
@@ -161,6 +179,7 @@ class RTCVideoRenderer extends ValueNotifier<RTCVideoValue> {
161179
super.dispose();
162180
await _srcObject?.dispose();
163181
_srcObject = null;
182+
_subscriptions.forEach((s) => s.cancel());
164183
videoElement.removeAttribute('src');
165184
videoElement.load();
166185
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@TestOn('browser')
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:flutter_webrtc/src/web/get_user_media.dart';
4+
import 'package:flutter_webrtc/src/web/rtc_video_view.dart';
5+
6+
void main() {
7+
// TODO(wer-mathurin): should revisit after this bug is resolved, https://github.com/flutter/flutter/issues/66045.
8+
test('should complete succesfully', () async {
9+
var renderer = RTCVideoRenderer();
10+
await renderer.initialize();
11+
renderer.srcObject = await MediaDevices.getUserMedia({});
12+
await renderer.dispose();
13+
});
14+
}

0 commit comments

Comments
 (0)
0