Files
sm-emby-share/lib/features/player/session/player_engine_resolution.dart
T
2026-07-14 11:11:36 +08:00

60 lines
1.7 KiB
Dart

import 'dart:io' show Platform;
import '../../../providers/player_engine_override_provider.dart';
enum PlayerEngineKind { fvp, mpv, media3 }
PlayerEngineKind? playerEngineKindFromDisplayName(String displayName) {
return switch (displayName) {
'fvp' => PlayerEngineKind.fvp,
'mpv' => PlayerEngineKind.mpv,
'media3' => PlayerEngineKind.media3,
_ => null,
};
}
PlayerEngineKind? nextAutoFallbackEngine({
required PlayerEngineOverride override,
required PlayerEngineKind? failedEngineKind,
required bool isDolbyVision,
}) {
if (override != PlayerEngineOverride.auto) return null;
return switch (failedEngineKind) {
PlayerEngineKind.media3 =>
isDolbyVision ? PlayerEngineKind.fvp : PlayerEngineKind.mpv,
PlayerEngineKind.mpv => PlayerEngineKind.fvp,
PlayerEngineKind.fvp || null => null,
};
}
PlayerEngineKind resolvePlayerEngineKind(
PlayerEngineOverride override, {
required bool isDolbyVision,
String? videoCodec,
bool? isAndroid,
}) {
final onAndroid = isAndroid ?? Platform.isAndroid;
final codec = videoCodec?.toLowerCase();
final isProRes = codec == 'prores';
switch (override) {
case PlayerEngineOverride.fvp:
return PlayerEngineKind.fvp;
case PlayerEngineOverride.mpv:
return PlayerEngineKind.mpv;
case PlayerEngineOverride.media3:
if (!onAndroid) return PlayerEngineKind.mpv;
if (isProRes) return PlayerEngineKind.fvp;
return PlayerEngineKind.media3;
case PlayerEngineOverride.auto:
if (onAndroid) {
if (isProRes) return PlayerEngineKind.fvp;
return PlayerEngineKind.media3;
}
if (isDolbyVision || isProRes) return PlayerEngineKind.fvp;
return PlayerEngineKind.mpv;
}
}