Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .changes/render-platformview
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
patch type="changed" "Use iOS platform view rendering by default for VideoTrackRenderer auto mode"
45 changes: 31 additions & 14 deletions lib/src/widgets/video_track_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ class VideoTrackRenderer extends StatefulWidget {
this.track, {
this.fit = VideoViewFit.contain,
this.mirrorMode = VideoViewMirrorMode.auto,
this.renderMode = VideoRenderMode.texture,
this.renderMode = VideoRenderMode.auto,
this.autoDisposeRenderer = true,
this.cachedRenderer,
this.autoCenter = true,
Expand All @@ -93,10 +93,13 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
// Used to compute visibility information
late GlobalKey _internalKey;

bool get _shouldUsePlatformView {
if (![PlatformType.iOS, PlatformType.macOS].contains(lkPlatform())) return false;
if (widget.renderMode == VideoRenderMode.platformView) return true;
return widget.renderMode == VideoRenderMode.auto && widget.cachedRenderer == null;
}

Future<rtc.VideoRenderer> _initializeRenderer() async {
if (lkPlatformIs(PlatformType.iOS) && widget.renderMode == VideoRenderMode.platformView) {
return Null as Future<rtc.VideoRenderer>;
}
if (_renderer == null) {
_renderer = rtc.RTCVideoRenderer();
await _renderer!.initialize();
Expand Down Expand Up @@ -178,12 +181,23 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
_renderer?.onResize = () {
if (mounted) {
setState(() {
_aspectRatio = (_renderer as rtc.RTCVideoRenderer?)?.videoValue.aspectRatio;
_aspectRatio = _rendererAspectRatio;
});
}
};
}

double? get _rendererAspectRatio {
final renderer = _renderer;
if (renderer is rtc.RTCVideoRenderer) {
return renderer.videoValue.aspectRatio;
}
if (renderer is rtc.RTCVideoPlatformViewController) {
return renderer.value.aspectRatio;
}
return null;
}

@override
void didUpdateWidget(covariant VideoTrackRenderer oldWidget) {
super.didUpdateWidget(oldWidget);
Expand Down Expand Up @@ -218,8 +232,8 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
},
);

Widget _videoRendererView() {
if (lkPlatformIs(PlatformType.iOS) && widget.renderMode == VideoRenderMode.platformView) {
Widget _videoRendererView({required bool usePlatformView}) {
if (usePlatformView) {
return rtc.RTCVideoPlatFormView(
mirror: _shouldMirror(),
objectFit: widget.fit.toRTCType(),
Expand All @@ -238,11 +252,12 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
);
}

Widget _videoViewForNative() => FutureBuilder(
future: _initializeRenderer(),
Widget _videoViewForNative() {
final usePlatformView = _shouldUsePlatformView;
return FutureBuilder(
future: usePlatformView ? null : _initializeRenderer(),
builder: (context, snapshot) {
if ((snapshot.hasData && _renderer != null) ||
(lkPlatformIs(PlatformType.iOS) && widget.renderMode == VideoRenderMode.platformView)) {
if ((snapshot.hasData && _renderer != null) || usePlatformView) {
return Builder(
key: _internalKey,
builder: (ctx) {
Expand All @@ -252,7 +267,7 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
});

if (!lkPlatformIsMobile() || widget.track is! LocalVideoTrack) {
return _videoRendererView();
return _videoRendererView(usePlatformView: usePlatformView);
}
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
Expand All @@ -264,15 +279,17 @@ class _VideoTrackRendererState extends State<VideoTrackRenderer> {
}
},
onTapDown: (TapDownDetails details) => onViewFinderTap(details, constraints),
child: _videoRendererView(),
child: _videoRendererView(usePlatformView: usePlatformView),
);
},
);
},
);
}
return Container();
});
},
);
}

// FutureBuilder will cause flickering for flutter web. so using
// different rendering methods for web and native.
Expand Down
Loading