From 043b2c54aa3162a11dde0cff310763274429f4c1 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 16 Jul 2023 01:15:17 +0200 Subject: [PATCH] mpv: sample aspect ratio --- lib/model/entry/extensions/props.dart | 4 +- .../viewer/visual/entry_page_view.dart | 2 +- plugins/aves_video/lib/src/controller.dart | 2 +- .../aves_video_ijk/lib/src/controller.dart | 41 ++++++++++--------- .../aves_video_mpv/lib/src/controller.dart | 30 +++++++++----- 5 files changed, 44 insertions(+), 35 deletions(-) diff --git a/lib/model/entry/extensions/props.dart b/lib/model/entry/extensions/props.dart index f5d064c2f..0d78575a9 100644 --- a/lib/model/entry/extensions/props.dart +++ b/lib/model/entry/extensions/props.dart @@ -34,9 +34,9 @@ extension ExtraAvesEntryProps on AvesEntry { bool get isSized => width > 0 && height > 0; - Size videoDisplaySize(double sar) { + Size videoDisplaySize(double? sar) { final size = displaySize; - if (sar != 1) { + if (sar != null && sar != 1) { final dar = displayAspectRatio * sar; final w = size.width; final h = size.height; diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index 12b216852..8d9998668 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -197,7 +197,7 @@ class _EntryPageViewState extends State with SingleTickerProvider final videoController = context.read().getController(entry); if (videoController == null) return const SizedBox(); - return ValueListenableBuilder( + return ValueListenableBuilder( valueListenable: videoController.sarNotifier, builder: (context, sar, child) { final videoDisplaySize = entry.videoDisplaySize(sar); diff --git a/plugins/aves_video/lib/src/controller.dart b/plugins/aves_video/lib/src/controller.dart index 68def5467..7fb227629 100644 --- a/plugins/aves_video/lib/src/controller.dart +++ b/plugins/aves_video/lib/src/controller.dart @@ -102,7 +102,7 @@ abstract class AvesVideoController { ValueNotifier get canSelectStreamNotifier; - ValueNotifier get sarNotifier; + ValueNotifier get sarNotifier; bool get isMuted; diff --git a/plugins/aves_video_ijk/lib/src/controller.dart b/plugins/aves_video_ijk/lib/src/controller.dart index 59d2f32e2..f394b0097 100644 --- a/plugins/aves_video_ijk/lib/src/controller.dart +++ b/plugins/aves_video_ijk/lib/src/controller.dart @@ -46,7 +46,7 @@ class IjkVideoController extends AvesVideoController { final ValueNotifier canSelectStreamNotifier = ValueNotifier(false); @override - final ValueNotifier sarNotifier = ValueNotifier(1); + final ValueNotifier sarNotifier = ValueNotifier(null); Stream get _valueStream => _valueStreamController.stream; @@ -115,7 +115,7 @@ class IjkVideoController extends AvesVideoController { _startListening(); } - sarNotifier.value = 1; + sarNotifier.value = null; streams.clear(); _applyOptions(startMillis); @@ -380,24 +380,25 @@ class IjkVideoController extends AvesVideoController { @override Widget buildPlayerWidget(BuildContext context) { - return ValueListenableBuilder( - valueListenable: sarNotifier, - builder: (context, sar, child) { - // derive DAR (Display Aspect Ratio) from SAR (Storage Aspect Ratio), if any - // e.g. 960x536 (~16:9) with SAR 4:3 should be displayed as ~2.39:1 - final dar = entry.displayAspectRatio * sar; - return FijkView( - player: _instance, - fit: FijkFit( - sizeFactor: 1.0, - aspectRatio: dar, - alignment: _alignmentForRotation(entry.rotationDegrees), - macroBlockCrop: _macroBlockCrop, - ), - panelBuilder: (player, data, context, viewSize, texturePos) => const SizedBox(), - color: Colors.transparent, - ); - }); + return ValueListenableBuilder( + valueListenable: sarNotifier, + builder: (context, sar, child) { + // derive DAR (Display Aspect Ratio) from SAR (Storage Aspect Ratio), if any + // e.g. 960x536 (~16:9) with SAR 4:3 should be displayed as ~2.39:1 + final dar = entry.displayAspectRatio * (sar ?? 1); + return FijkView( + player: _instance, + fit: FijkFit( + sizeFactor: 1.0, + aspectRatio: dar, + alignment: _alignmentForRotation(entry.rotationDegrees), + macroBlockCrop: _macroBlockCrop, + ), + panelBuilder: (player, data, context, viewSize, texturePos) => const SizedBox(), + color: Colors.transparent, + ); + }, + ); } Alignment _alignmentForRotation(int rotation) { diff --git a/plugins/aves_video_mpv/lib/src/controller.dart b/plugins/aves_video_mpv/lib/src/controller.dart index 7ce1aea18..1ac49506c 100644 --- a/plugins/aves_video_mpv/lib/src/controller.dart +++ b/plugins/aves_video_mpv/lib/src/controller.dart @@ -37,7 +37,7 @@ class MpvVideoController extends AvesVideoController { final ValueNotifier canSelectStreamNotifier = ValueNotifier(false); @override - final ValueNotifier sarNotifier = ValueNotifier(1); + final ValueNotifier sarNotifier = ValueNotifier(null); MpvVideoController( super.entry, { @@ -81,6 +81,7 @@ class MpvVideoController extends AvesVideoController { if (status == VideoStatus.idle) return; _statusStreamController.add(v ? VideoStatus.playing : VideoStatus.paused); })); + _subscriptions.add(_instance.stream.videoParams.listen((v) => sarNotifier.value = v.par)); _subscriptions.add(_instance.stream.log.listen((v) => debugPrint('libmpv log: $v'))); _subscriptions.add(_instance.stream.error.listen((v) => debugPrint('libmpv error: $v'))); _subscriptions.add(settings.updateStream.where((event) => event.key == SettingKeys.enableVideoHardwareAccelerationKey).listen((_) => _initController())); @@ -203,16 +204,23 @@ class MpvVideoController extends AvesVideoController { @override Widget buildPlayerWidget(BuildContext context) { - // TODO TLAD handle SAR / DAR (media_kit Player.stream.width/height just gives raw video size, not rendered size) - return Video( - controller: _controller, - fit: BoxFit.cover, - alignment: Alignment.center, - controls: NoVideoControls, - wakelock: false, - subtitleViewConfiguration: const SubtitleViewConfiguration( - style: TextStyle(color: Colors.transparent), - ), + return ValueListenableBuilder( + valueListenable: sarNotifier, + builder: (context, sar, child) { + // derive DAR (Display Aspect Ratio) from SAR (Storage Aspect Ratio), if any + // e.g. 960x536 (~16:9) with SAR 4:3 should be displayed as ~2.39:1 + final dar = entry.displayAspectRatio * (sar ?? 1); + return Video( + controller: _controller, + fill: Colors.transparent, + aspectRatio: dar, + controls: NoVideoControls, + wakelock: false, + subtitleViewConfiguration: const SubtitleViewConfiguration( + style: TextStyle(color: Colors.transparent), + ), + ); + }, ); }