diff --git a/lib/pages/setting/models/video_settings.dart b/lib/pages/setting/models/video_settings.dart index a32a08e92..6f6ebbe4f 100644 --- a/lib/pages/setting/models/video_settings.dart +++ b/lib/pages/setting/models/video_settings.dart @@ -8,6 +8,7 @@ import 'package:PiliPlus/models/common/video/video_decode_type.dart'; import 'package:PiliPlus/models/common/video/video_quality.dart'; import 'package:PiliPlus/pages/setting/models/model.dart'; import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart'; +import 'package:PiliPlus/plugin/pl_player/models/hwdec_type.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; @@ -343,19 +344,15 @@ List get videoSettings => [ leading: const Icon(Icons.memory_outlined), getSubtitle: () => '当前:${Pref.hardwareDecoding}(此项即mpv的--hwdec)', onTap: (setState) async { - String? result = await showDialog( + final result = await showDialog( context: Get.context!, builder: (context) { return SelectDialog( title: '硬解模式', value: Pref.hardwareDecoding, - values: const [ - 'auto', - 'auto-copy', - 'auto-safe', - 'no', - 'yes', - ].map((e) => (e, e)).toList(), + values: HwDecType.values + .map((e) => (e.hwdec, '${e.hwdec}\n${e.desc}')) + .toList(), ); }, ); diff --git a/lib/plugin/pl_player/models/hwdec_type.dart b/lib/plugin/pl_player/models/hwdec_type.dart new file mode 100644 index 000000000..6140745d9 --- /dev/null +++ b/lib/plugin/pl_player/models/hwdec_type.dart @@ -0,0 +1,32 @@ +enum HwDecType { + no('no', '启用软解'), + auto('auto', '启用任意可用解码器'), + autoSafe('auto-safe', '启用最佳解码器'), + autoCopy('auto-copy', '启用带拷贝功能的最佳解码器'), + d3d11va('d3d11va', 'DirectX11 (windows8 及以上)'), + d3d11vaCopy('d3d11va-copy', 'DirectX11 (windows8 及以上) (非直通)'), + videotoolbox('videotoolbox', 'VideoToolbox (macOS / iOS)'), + videotoolboxCopy('videotoolbox-copy', 'VideoToolbox (macOS / iOS) (非直通)'), + vaapi('vaapi', 'VAAPI (Linux)'), + vaapiCopy('vaapi-copy', 'VAAPI (Linux) (非直通)'), + nvdec('nvdec', 'NVDEC (NVIDIA独占)'), + nvdecCopy('nvdec-copy', 'NVDEC (NVIDIA独占) (非直通)'), + drm('drm', 'DRM (Linux)'), + drmCopy('drm-copy', 'DRM (Linux) (非直通)'), + vulkan('vulkan', 'Vulkan (全平台) (实验性)'), + vulkanCopy('vulkan-copy', 'Vulkan (全平台) (实验性) (非直通)'), + dxva2('dxva2', 'DXVA2 (Windows7 及以上)'), + dxva2Copy('dxva2-copy', 'DXVA2 (Windows7 及以上) (非直通)'), + vdpau('vdpau', 'VDPAU (Linux)'), + vdpauCopy('vdpau-copy', 'VDPAU (Linux) (非直通)'), + mediacodec('mediacodec', 'MediaCodec (Android)'), + mediacodecCopy('mediacodec-copy', 'MediaCodec (Android) (非直通)'), + cuda('cuda', 'CUDA (NVIDIA独占) (过时)'), + cudaCopy('cuda-copy', 'CUDA (NVIDIA独占) (过时) (非直通)'), + crystalhd('crystalhd', 'CrystalHD (全平台) (过时)'), + rkmpp('rkmpp', 'Rockchip MPP (仅部分Rockchip芯片)'); + + final String hwdec; + final String desc; + const HwDecType(this.hwdec, this.desc); +} diff --git a/lib/utils/storage_pref.dart b/lib/utils/storage_pref.dart index a601aad1b..c62079984 100644 --- a/lib/utils/storage_pref.dart +++ b/lib/utils/storage_pref.dart @@ -21,6 +21,7 @@ import 'package:PiliPlus/models/user/danmaku_rule.dart'; import 'package:PiliPlus/models/user/info.dart'; import 'package:PiliPlus/plugin/pl_player/models/bottom_progress_behavior.dart'; import 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart'; +import 'package:PiliPlus/plugin/pl_player/models/hwdec_type.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; import 'package:PiliPlus/utils/context_ext.dart'; import 'package:PiliPlus/utils/extension.dart'; @@ -228,7 +229,9 @@ abstract class Pref { static String get hardwareDecoding => _setting.get( SettingBoxKey.hardwareDecoding, - defaultValue: Platform.isAndroid ? 'auto-safe' : 'auto', + defaultValue: Platform.isAndroid + ? HwDecType.autoSafe.hwdec + : HwDecType.auto.hwdec, ); static String get videoSync =>