Skip to content

Commit

Permalink
update.
Browse files Browse the repository at this point in the history
  • Loading branch information
cloudwebrtc committed Jun 5, 2024
1 parent 0ea7b99 commit 20aa24d
Showing 1 changed file with 22 additions and 16 deletions.
38 changes: 22 additions & 16 deletions lib/src/widgets/video_track_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,24 @@ enum VideoViewMirrorMode {
mirror,
}

enum VideoRenderMode {
auto,
texture,
platformView,
}

/// Widget that renders a [VideoTrack].
class VideoTrackRenderer extends StatefulWidget {
final VideoTrack track;
final rtc.RTCVideoViewObjectFit fit;
final VideoViewMirrorMode mirrorMode;
final VideoRenderMode renderMode;

const VideoTrackRenderer(
this.track, {
this.fit = rtc.RTCVideoViewObjectFit.RTCVideoViewObjectFitContain,
this.mirrorMode = VideoViewMirrorMode.auto,
this.renderMode = VideoRenderMode.auto,
Key? key,
}) : super(key: key);

Expand All @@ -52,15 +60,17 @@ class VideoTrackRenderer extends StatefulWidget {
}

class _VideoTrackRendererState extends State<VideoTrackRenderer> {
rtc.RTCVideoRenderer? _renderer;
rtc.RTCVideoPlatformViewController? _platformController;
rtc.VideoRenderer? _renderer;
// for flutter web only.
bool _rendererReadyForWeb = false;
EventsListener<TrackEvent>? _listener;
// Used to compute visibility information
late GlobalKey _internalKey;

Future<rtc.RTCVideoRenderer> _initializeRenderer() async {
Future<rtc.VideoRenderer> _initializeRenderer() async {
if (widget.renderMode == VideoRenderMode.platformView) {
return Null as Future<rtc.VideoRenderer>;
}
_renderer ??= rtc.RTCVideoRenderer();
await _renderer!.initialize();
await _attach();
Expand All @@ -72,8 +82,6 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
_setSrcObject(null);
_renderer?.dispose();
_renderer = null;
_platformController?.dispose();
_platformController = null;
} catch (e) {
logger.warning('Got error disposing renderer: $e');
}
Expand All @@ -100,11 +108,7 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
}

void _setSrcObject(rtc.MediaStream? stream) {
if (lkPlatformIs(PlatformType.iOS)) {
_platformController?.srcObject = stream;
} else {
_renderer?.srcObject = stream;
}
_renderer?.srcObject = stream;
}

Future<void> _attach() async {
Expand Down Expand Up @@ -150,7 +154,7 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
widget.track.onVideoViewBuild?.call(_internalKey);
});
return rtc.RTCVideoView(
_renderer!,
_renderer! as rtc.RTCVideoRenderer,
mirror: _shouldMirror(),
filterQuality: FilterQuality.medium,
objectFit: widget.fit,
Expand All @@ -161,7 +165,8 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
Widget _videoViewForNative() => FutureBuilder(
future: _initializeRenderer(),
builder: (context, snapshot) {
if (snapshot.hasData && _renderer != null) {
if ((snapshot.hasData && _renderer != null) ||
widget.renderMode == VideoRenderMode.platformView) {
return Builder(
key: _internalKey,
builder: (ctx) {
Expand All @@ -170,18 +175,19 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
?.addPostFrameCallback((timeStamp) {
widget.track.onVideoViewBuild?.call(_internalKey);
});
if (lkPlatformIs(PlatformType.iOS)) {
if (lkPlatformIs(PlatformType.iOS) &&
widget.renderMode == VideoRenderMode.platformView) {
return rtc.RTCVideoPlatFormView(
mirror: _shouldMirror(),
objectFit: widget.fit,
onViewReady: (controller) {
_platformController = controller;
_platformController?.srcObject = widget.track.mediaStream;
_renderer = controller;
_renderer?.srcObject = widget.track.mediaStream;
},
);
}
return rtc.RTCVideoView(
_renderer!,
_renderer! as rtc.RTCVideoRenderer,
mirror: _shouldMirror(),
filterQuality: FilterQuality.medium,
objectFit: widget.fit,
Expand Down

0 comments on commit 20aa24d

Please sign in to comment.