chore: Add WebRTC delegate interface.

This commit is contained in:
cloudwebrtc 2021-11-27 01:20:04 +08:00
parent 72584d679c
commit 60618d1775
1 changed files with 28 additions and 6 deletions

View File

@ -6,6 +6,11 @@ import 'package:sdp_transform/sdp_transform.dart' as sdp_transform;
import '../matrix.dart'; import '../matrix.dart';
abstract class WebRTCDelegate {
RTCFactory get rtcFactory;
VideoRenderer createRenderer();
}
/// The default life time for call events, in millisecond. /// The default life time for call events, in millisecond.
const lifetimeMs = 10 * 1000; const lifetimeMs = 10 * 1000;
@ -23,6 +28,7 @@ class WrappedMediaStream {
bool audioMuted; bool audioMuted;
bool videoMuted; bool videoMuted;
final Client client; final Client client;
VideoRenderer renderer;
/// for debug /// for debug
String get title => '$displayName:$purpose:a[$audioMuted]:v[$videoMuted]'; String get title => '$displayName:$purpose:a[$audioMuted]:v[$videoMuted]';
@ -32,6 +38,7 @@ class WrappedMediaStream {
WrappedMediaStream( WrappedMediaStream(
{this.stream, {this.stream,
required this.renderer,
required this.room, required this.room,
required this.userId, required this.userId,
required this.purpose, required this.purpose,
@ -39,7 +46,18 @@ class WrappedMediaStream {
required this.audioMuted, required this.audioMuted,
required this.videoMuted}); required this.videoMuted});
/// Initialize the video renderer
Future<void> initialize() async {
await renderer.initialize();
renderer.srcObject = stream;
renderer.onResize = () {
Logs().i(
'onResize [${stream!.id.substring(0, 8)}] ${renderer?.videoWidth} x ${renderer?.videoHeight}');
};
}
Future<void> dispose() async { Future<void> dispose() async {
renderer.srcObject = null;
if (isLocal() && stream != null) { if (isLocal() && stream != null) {
await stream?.dispose(); await stream?.dispose();
stream = null; stream = null;
@ -69,6 +87,7 @@ class WrappedMediaStream {
void setNewStream(MediaStream newStream) { void setNewStream(MediaStream newStream) {
stream = newStream; stream = newStream;
renderer.srcObject = stream;
if (onNewStream != null) { if (onNewStream != null) {
onNewStream?.call(stream!); onNewStream?.call(stream!);
} }
@ -504,6 +523,7 @@ class CallSession {
existingStream.setNewStream(stream); existingStream.setNewStream(stream);
} else { } else {
final newStream = WrappedMediaStream( final newStream = WrappedMediaStream(
renderer: voip.delegate.createRenderer(),
userId: client.userID!, userId: client.userID!,
room: opts.room, room: opts.room,
stream: stream, stream: stream,
@ -563,6 +583,7 @@ class CallSession {
existingStream.setNewStream(stream); existingStream.setNewStream(stream);
} else { } else {
final newStream = WrappedMediaStream( final newStream = WrappedMediaStream(
renderer: voip.delegate.createRenderer(),
userId: remoteUser.id, userId: remoteUser.id,
room: opts.room, room: opts.room,
stream: stream, stream: stream,
@ -752,10 +773,10 @@ class CallSession {
Logs().v('[VOIP] Reject received for call ID ' + callId); Logs().v('[VOIP] Reject received for call ID ' + callId);
// No need to check party_id for reject because if we'd received either // No need to check party_id for reject because if we'd received either
// an answer or reject, we wouldn't be in state InviteSent // an answer or reject, we wouldn't be in state InviteSent
final shouldTerminate = final shouldTerminate = (state == CallState.kFledgling &&
(state == CallState.kFledgling && direction == CallDirection.kIncoming) || direction == CallDirection.kIncoming) ||
CallState.kInviteSent == state || CallState.kInviteSent == state ||
CallState.kRinging == state; CallState.kRinging == state;
if (shouldTerminate) { if (shouldTerminate) {
terminate(CallParty.kRemote, reason ?? CallErrorCode.UserHangup, true); terminate(CallParty.kRemote, reason ?? CallErrorCode.UserHangup, true);
@ -1107,9 +1128,10 @@ class VoIP {
String? get localPartyId => client.deviceID; String? get localPartyId => client.deviceID;
bool background = false; bool background = false;
final Client client; final Client client;
final RTCFactory factory; RTCFactory get factory => delegate.rtcFactory;
final WebRTCDelegate delegate;
VoIP(this.client, this.factory) : super() { VoIP(this.client, this.delegate) : super() {
client.onCallInvite.stream.listen(onCallInvite); client.onCallInvite.stream.listen(onCallInvite);
client.onCallAnswer.stream.listen(onCallAnswer); client.onCallAnswer.stream.listen(onCallAnswer);
client.onCallCandidates.stream.listen(onCallCandidates); client.onCallCandidates.stream.listen(onCallCandidates);