Skip to content

Commit

Permalink
feat: use platform view for iOS
Browse files Browse the repository at this point in the history
  • Loading branch information
lambiengcode committed Jun 1, 2024
1 parent e561fe0 commit 314ce2a
Show file tree
Hide file tree
Showing 6 changed files with 203 additions and 79 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.3.19

* Refactor: use PlatformView for iOS

## 1.3.18

* Fix(Hive): Open box before create getIt
Expand Down
16 changes: 8 additions & 8 deletions lib/core/webrtc/webrtc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,13 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
stream: _displayStream!,
);

await _mParticipant?.setScreenSrcObject(_displayStream!);
await _mParticipant?.setSrcObject(_displayStream!, isDisplayStream: true);

_displayStream?.getVideoTracks().first.onEnded = () {
stopScreenSharing();
};

_mParticipant?.isSharingScreen = true;
_mParticipant?.setScreenSharing(true);

_notify(CallbackEvents.shouldBeUpdateState);
_socketEmiter.setScreenSharing(true);
Expand All @@ -99,7 +99,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
Future<void> stopScreenSharing({bool stayInRoom = true}) async {
if (!(_mParticipant?.isSharingScreen ?? true)) return;

_mParticipant?.isSharingScreen = false;
_mParticipant?.setScreenSharing(false);

if (_mParticipant == null) return;

Expand Down Expand Up @@ -132,7 +132,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
track.stop();
}

_mParticipant?.isSharingScreen = false;
_mParticipant?.setScreenSharing(false);
_displayStream?.dispose();
_displayStream = null;

Expand Down Expand Up @@ -534,7 +534,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {

@override
void setScreenSharing({required String targetId, required bool isSharing}) {
_subscribers[targetId]?.isSharingScreen = isSharing;
_subscribers[targetId]?.setScreenSharing(isSharing);
_notify(CallbackEvents.shouldBeUpdateState);
}

Expand Down Expand Up @@ -590,7 +590,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
}) async {
final MediaStream? segmentedStream = await startVirtualBackground(
backgroundImage: backgroundImage,
textureId: _mParticipant?.renderer?.textureId.toString(),
textureId: _mParticipant?.cameraSource?.textureId.toString(),
);

if (segmentedStream == null) return;
Expand All @@ -614,7 +614,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
_mParticipant = ParticipantSFU(
ownerId: kIsMine,
peerConnection: peerConnection,
onChanged: () => _notify(CallbackEvents.shouldBeUpdateState),
onFirstFrameRendered: () => _notify(CallbackEvents.shouldBeUpdateState),
videoCodec: _callSetting.preferedCodec,
isE2eeEnabled: _callSetting.e2eeEnabled,
stats: _stats,
Expand Down Expand Up @@ -756,7 +756,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
_subscribers[targetId] = ParticipantSFU(
ownerId: targetId,
peerConnection: rtcPeerConnection,
onChanged: () => _notify(CallbackEvents.shouldBeUpdateState),
onFirstFrameRendered: () => _notify(CallbackEvents.shouldBeUpdateState),
isAudioEnabled: audioEnabled,
isVideoEnabled: videoEnabled,
isSharingScreen: isScreenSharing,
Expand Down
1 change: 1 addition & 0 deletions lib/types/models/index.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ export 'user_model.dart';
export 'avatar_model.dart';
export 'beauty_filters.dart';
export 'auth_payload_model.dart';
export 'media_source.dart';
142 changes: 142 additions & 0 deletions lib/types/models/media_source.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

import 'package:waterbus_sdk/flutter_waterbus_sdk.dart';

class MediaSource {
MediaStream? stream;
RTCVideoRenderer? renderer;
RTCVideoPlatformViewController? viewController;
bool hasFirstFrameRendered;
final Function()? onFirstFrameRendered;
MediaSource({
this.stream,
this.renderer,
this.viewController,
this.hasFirstFrameRendered = false,
this.onFirstFrameRendered,
}) {
_initRendererIfNeeded();
}

Widget mediaView({
RTCVideoViewObjectFit objectFit =
RTCVideoViewObjectFit.RTCVideoViewObjectFitContain,
bool mirror = false,
}) {
if (WebRTC.platformIsIOS) {
return RTCVideoPlatFormView(
objectFit: objectFit,
mirror: mirror,
onViewReady: (controller) {
viewController = controller;
viewController?.srcObject = stream;
},
);
}

if (renderer == null) {
return const SizedBox();
}

return RTCVideoView(
renderer!,
key: textureId == null ? null : Key(textureId!.toString()),
objectFit: objectFit,
mirror: mirror,
filterQuality: FilterQuality.none,
);
}

void setPlatformView(RTCVideoPlatformViewController controller) {
viewController = controller;
viewController?.srcObject = stream;
}

Future<void> dispose() async {
await renderer?.dispose();
await viewController?.dispose();
renderer = null;
viewController = null;
}

int? get textureId => renderer?.textureId;

String? get streamId => stream?.id;

void setSrcObject(MediaStream? stream) {
if (stream == null) return;

this.stream = stream;

if (WebRTC.platformIsIOS) {
viewController?.srcObject = stream;
} else {
renderer?.srcObject = stream;
}
}

Future<void> _initRendererIfNeeded() async {
if (WebRTC.platformIsIOS || renderer != null) {
hasFirstFrameRendered = true;
onFirstFrameRendered?.call();
return;
}

renderer = RTCVideoRenderer();
await renderer?.initialize();

if (kIsWeb) {
hasFirstFrameRendered = true;
onFirstFrameRendered?.call();
}

renderer?.onFirstFrameRendered = () {
hasFirstFrameRendered = true;
onFirstFrameRendered?.call();
};
}

MediaSource copyWith({
MediaStream? stream,
RTCVideoRenderer? renderer,
RTCVideoPlatformViewController? viewController,
bool? hasFirstFrameRendered,
Function()? onFirstFrameRendered,
}) {
return MediaSource(
stream: stream ?? this.stream,
renderer: renderer ?? this.renderer,
viewController: viewController ?? this.viewController,
hasFirstFrameRendered:
hasFirstFrameRendered ?? this.hasFirstFrameRendered,
onFirstFrameRendered: onFirstFrameRendered ?? this.onFirstFrameRendered,
);
}

@override
String toString() {
return 'MediaSource(stream: $stream, renderer: $renderer, viewController: $viewController, hasFirstFrameRendered: $hasFirstFrameRendered, onFirstFrameRendered: $onFirstFrameRendered)';
}

@override
bool operator ==(covariant MediaSource other) {
if (identical(this, other)) return true;

return other.stream == stream &&
other.renderer == renderer &&
other.viewController == viewController &&
other.hasFirstFrameRendered == hasFirstFrameRendered &&
other.onFirstFrameRendered == onFirstFrameRendered;
}

@override
int get hashCode {
return stream.hashCode ^
renderer.hashCode ^
viewController.hashCode ^
hasFirstFrameRendered.hashCode ^
onFirstFrameRendered.hashCode;
}
}
Loading

0 comments on commit 314ce2a

Please sign in to comment.