fix: hwdec toggle

This commit is contained in:
edde746
2025-12-02 19:03:55 +01:00
parent 6154480c99
commit 75007a6f42
7 changed files with 18 additions and 72 deletions
@@ -99,7 +99,7 @@ class MpvPlayerCore(private val activity: Activity) :
// Video output configuration
MPVLib.setOptionString("vo", "gpu")
MPVLib.setOptionString("gpu-context", "android")
MPVLib.setOptionString("hwdec", "mediacodec-copy")
// hwdec is set from Flutter via setProperty based on user preference
// Audio configuration
MPVLib.setOptionString("ao", "audiotrack")
+1 -1
View File
@@ -113,7 +113,7 @@ class MpvPlayerCore: NSObject {
checkError(mpv_set_option_string(mpv, "vo", "gpu-next"))
checkError(mpv_set_option_string(mpv, "gpu-api", "vulkan"))
checkError(mpv_set_option_string(mpv, "gpu-context", "moltenvk"))
checkError(mpv_set_option_string(mpv, "hwdec", "videotoolbox"))
// hwdec is set from Flutter via setProperty based on user preference
// Initialize MPV
let initResult = mpv_initialize(mpv)
-4
View File
@@ -52,7 +52,6 @@ class PlayerNative implements Player {
StreamSubscription? _eventSubscription;
bool _disposed = false;
bool _initialized = false;
bool _isVisible = false;
PlayerNative() {
_streams = PlayerStreams(
@@ -315,7 +314,6 @@ class PlayerNative implements Player {
// Show the video layer
await _methodChannel.invokeMethod('setVisible', {'visible': true});
_isVisible = true;
// Set start position if provided (must be set before loading file)
if (media.start != null && media.start!.inSeconds > 0) {
@@ -358,7 +356,6 @@ class PlayerNative implements Player {
_checkDisposed();
await command(['stop']);
await _methodChannel.invokeMethod('setVisible', {'visible': false});
_isVisible = false;
}
@override
@@ -479,7 +476,6 @@ class PlayerNative implements Player {
try {
await _methodChannel.invokeMethod('setVisible', {'visible': visible});
_isVisible = visible;
return true;
} catch (e) {
_errorController.add('Failed to set visibility: $e');
-63
View File
@@ -16,7 +16,6 @@ import '../widgets/user_avatar_widget.dart';
import '../widgets/horizontal_scroll_with_arrows.dart';
import '../widgets/hub_section.dart';
import '../widgets/hub_navigation_controller.dart';
import '../widgets/focus/focus_indicator.dart';
import 'profile_switch_screen.dart';
import '../providers/user_profile_provider.dart';
import '../providers/settings_provider.dart';
@@ -1292,66 +1291,4 @@ class _DiscoverScreenState extends State<DiscoverScreen>
),
);
}
Widget _buildHorizontalList(
List<PlexMetadata> items, {
bool isLarge = false,
bool isInContinueWatching = false,
}) {
return SliverToBoxAdapter(
child: LayoutBuilder(
builder: (context, constraints) {
// Responsive card width based on screen size
// Match Libraries screen sizing (190px baseline)
final screenWidth = constraints.maxWidth;
final cardWidth = screenWidth > 1600
? 220.0
: screenWidth > 1200
? 200.0
: screenWidth > 800
? 190.0
: 160.0;
// MediaCard has 8px padding on all sides (16px total horizontally)
// So actual poster width is cardWidth - 16
final posterWidth = cardWidth - 16;
// 2:3 poster aspect ratio (height is 1.5x width)
final posterHeight = posterWidth * 1.5;
// Container height = poster + padding + spacing + text
// 8px top padding + posterHeight + 4px spacing + ~26px text + 8px bottom padding
final containerHeight = posterHeight + 46;
return SizedBox(
height: containerHeight,
child: HorizontalScrollWithArrows(
builder: (scrollController) => ListView.builder(
controller: scrollController,
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.symmetric(horizontal: 12),
itemCount: items.length,
itemBuilder: (context, index) {
final item = items[index];
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 2),
child: MediaCard(
key: Key(item.ratingKey),
item: item,
width: cardWidth,
height: posterHeight,
onRefresh: updateItem,
onRemoveFromContinueWatching: isInContinueWatching
? _refreshContinueWatching
: null,
forceGridMode: true,
isInContinueWatching: isInContinueWatching,
),
);
},
),
),
);
},
),
);
}
}
+14 -1
View File
@@ -255,7 +255,7 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen>
await player!.setProperty('sub-font', 'Go Noto Current-Regular');
await player!.setProperty('demuxer-max-bytes', bufferSizeBytes.toString());
await player!.setProperty('msg-level', debugLoggingEnabled ? 'all=debug' : 'all=error');
// await player!.setProperty('hwdec', enableHardwareDecoding ? 'auto' : 'no');
await player!.setProperty('hwdec', _getHwdecValue(enableHardwareDecoding));
// Subtitle styling
await player!.setProperty('sub-font-size', settingsService.getSubtitleFontSize().toString());
@@ -1324,3 +1324,16 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen>
);
}
}
/// Returns the appropriate hwdec value based on platform and user preference.
String _getHwdecValue(bool enabled) {
if (!enabled) return 'no';
if (Platform.isMacOS || Platform.isIOS) {
return 'videotoolbox';
} else if (Platform.isAndroid) {
return 'mediacodec-copy';
} else {
return 'auto'; // Windows, Linux
}
}
+1 -1
View File
@@ -117,7 +117,7 @@ class MpvPlayerCore: NSObject {
checkError(mpv_set_option_string(mpv, "vo", "gpu-next"))
checkError(mpv_set_option_string(mpv, "gpu-api", "vulkan"))
checkError(mpv_set_option_string(mpv, "gpu-context", "moltenvk"))
checkError(mpv_set_option_string(mpv, "hwdec", "videotoolbox"))
// hwdec is set from Flutter via setProperty based on user preference
// Initialize MPV
let initResult = mpv_initialize(mpv)
+1 -1
View File
@@ -70,7 +70,7 @@ bool MpvPlayer::Initialize(HWND container, HWND flutter_window) {
// Configure mpv for embedded playback.
LogToFile("MpvPlayer::Initialize - setting mpv options");
mpv_set_option_string(mpv_, "hwdec", "auto");
// hwdec is set from Flutter via setProperty based on user preference
mpv_set_option_string(mpv_, "keep-open", "yes");
mpv_set_option_string(mpv_, "idle", "yes");
mpv_set_option_string(mpv_, "input-default-bindings", "no");